1接谨、數(shù)據(jù)來源于yale大學(xué)
2摆碉、準(zhǔn)備訓(xùn)練標(biāo)簽,訓(xùn)練數(shù)據(jù)
3脓豪、搭載神經(jīng)網(wǎng)絡(luò)
4巷帝、開始檢測
一、圖片讀取
# 1 數(shù)據(jù)yale 2 準(zhǔn)備train label-》train
# 3 cnn 4 檢測
import tensorflow as tf
import numpy as np
import scipy.io as sio
f = open('Yale_64x64.mat','rb')
mdict = sio.loadmat(f) #加載數(shù)據(jù)扫夜,讀取是一個(gè)字典
# fea gnd
train_data = mdict['fea'] #讀取數(shù)據(jù)的鍵
train_label = mdict['gnd'] #讀取數(shù)據(jù)的值
train_data = np.random.permutation(train_data) #對原有數(shù)據(jù)進(jìn)行無序排列
train_label = np.random.permutation(train_label)
test_data = train_data[0:64] #隨機(jī)抽取一部分?jǐn)?shù)據(jù)作為訓(xùn)練數(shù)據(jù)
test_label = train_label[0:64]
np.random.seed(100) #重新生產(chǎn)隨機(jī)數(shù)種子
test_data = np.random.permutation(test_data) #進(jìn)行無序排列
np.random.seed(100)
test_label = np.random.permutation(test_label)
二楞泼、圖片處理
#讀取的數(shù)據(jù)是64*64驰徊,rgb:0-255 需要對其歸一化處理,變成灰度圖堕阔,1表示灰色通道
# train [0-9] [10*N] [15*N] [0 0 1 0 0 0 0 0 0 0] -> 2
train_data = train_data.reshape(train_data.shape[0],64,64,1).astype(np.float32)/255
train_labels_new = np.zeros((165,15))# 165 image 15 (yale數(shù)據(jù)庫共165張圖辣垒,分別描述15人)
for i in range(0,165): #與用[0 0 1 0 0 0 0 0 0 0] 來代表數(shù)字2類似
j = int(train_label[i,0])-1 # 之前是1-15進(jìn)行標(biāo)志,現(xiàn)轉(zhuǎn)為 0-14印蔬,所以-1
train_labels_new[i,j] = 1 #識別到誰产还,就將誰設(shè)置誰的下標(biāo)為1
#下面完成測試數(shù)據(jù)的處理
test_data_input = test_data.reshape(test_data.shape[0],64,64,1).astype(np.float32)/255
test_labels_input = np.zeros((64,15))# 64 image 15 前面抽取了64張圖片作為測試圖片戚嗅,所以寫64
for i in range(0,64): #遍歷圖片状您,識別后把相應(yīng)的下標(biāo)置1
j = int(test_label[i,0])-1 # 1-15 0-14
test_labels_input[i,j] = 1
三撩幽、構(gòu)建神經(jīng)網(wǎng)絡(luò)
# cnn acc tf.nn tf.layer
data_input = tf.placeholder(tf.float32,[None,64,64,1])
label_input = tf.placeholder(tf.float32,[None,15])
#卷積(輸入數(shù)據(jù),濾波核設(shè)置為32退唠,卷積核大小鹃锈,滑動(dòng)步長1,'SAME'邊緣停留瞧预,激活函數(shù)relu)
layer1 = tf.layers.conv2d(inputs=data_input,filters=32,kernel_size=2,strides=1,padding='SAME',activation=tf.nn.relu)
#池化屎债,數(shù)據(jù)減維,留下最大值垢油; 最大值池化(輸入數(shù)據(jù)盆驹,數(shù)據(jù)行列均減少1半,滑動(dòng)步長)
layer1_pool = tf.layers.max_pooling2d(layer1,pool_size=2,strides=2)
#輸出層滩愁,激勵(lì)層(激勵(lì)函數(shù)relu)
layer2 = tf.reshape(layer1_pool,[-1,32*32*32])
layer2_relu = tf.layers.dense(layer2,1024,tf.nn.relu)
output = tf.layers.dense(layer2_relu,15) #輸出躯喇,15維,因?yàn)橐还?5人
#定義損失函數(shù)硝枉,采用交叉熵和梯度下降法(下降步長0.01)并最小化損失函數(shù)
loss = tf.losses.softmax_cross_entropy(onehot_labels=label_input,logits=output)
train = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
#檢測概率 axis=1:表示維度為1
accuracy = tf.metrics.accuracy(labels=tf.argmax(label_input,axis=1),predictions=tf.argmax(output,axis=1))[1]
四廉丽、完整代碼
# 1 數(shù)據(jù)yale 2 準(zhǔn)備train label-》train
# 3 cnn 4 檢測
import tensorflow as tf
import numpy as np
import scipy.io as sio
f = open('Yale_64x64.mat','rb')
mdict = sio.loadmat(f) #加載數(shù)據(jù),讀取是一個(gè)字典
# fea gnd
train_data = mdict['fea'] #讀取數(shù)據(jù)的鍵
train_label = mdict['gnd'] #讀取數(shù)據(jù)的值
train_data = np.random.permutation(train_data) #對原有數(shù)據(jù)進(jìn)行無序排列
train_label = np.random.permutation(train_label)
test_data = train_data[0:64] #隨機(jī)抽取一部分?jǐn)?shù)據(jù)作為訓(xùn)練數(shù)據(jù)
test_label = train_label[0:64]
np.random.seed(100) #重新生產(chǎn)隨機(jī)數(shù)種子
test_data = np.random.permutation(test_data) #進(jìn)行無序排列
np.random.seed(100)
test_label = np.random.permutation(test_label)
#讀取的數(shù)據(jù)是64*64妻味,rgb:0-255 需要對其歸一化處理正压,變成灰度圖,1表示灰色通道
# train [0-9] [10*N] [15*N] [0 0 1 0 0 0 0 0 0 0] -> 2
train_data = train_data.reshape(train_data.shape[0],64,64,1).astype(np.float32)/255
train_labels_new = np.zeros((165,15))# 165 image 15 (yale數(shù)據(jù)庫共165張圖责球,分別描述15人)
for i in range(0,165): #與用[0 0 1 0 0 0 0 0 0 0] 來代表數(shù)字2類似
j = int(train_label[i,0])-1 # 之前是1-15進(jìn)行標(biāo)志焦履,現(xiàn)轉(zhuǎn)為 0-14,所以-1
train_labels_new[i,j] = 1 #識別到誰棕诵,就將誰設(shè)置誰的下標(biāo)為1
#下面完成測試數(shù)據(jù)的處理
test_data_input = test_data.reshape(test_data.shape[0],64,64,1).astype(np.float32)/255
test_labels_input = np.zeros((64,15))# 64 image 15 前面抽取了64張圖片作為測試圖片裁良,所以寫64
for i in range(0,64): #遍歷圖片,識別后把相應(yīng)的下標(biāo)置1
j = int(test_label[i,0])-1 # 1-15 0-14
test_labels_input[i,j] = 1
# cnn acc tf.nn tf.layer
data_input = tf.placeholder(tf.float32,[None,64,64,1])
label_input = tf.placeholder(tf.float32,[None,15])
#卷積(輸入數(shù)據(jù)校套,濾波核設(shè)置為32,卷積核大小牧抵,滑動(dòng)步長1笛匙,'SAME'邊緣停留侨把,激活函數(shù)relu)
layer1 = tf.layers.conv2d(inputs=data_input,filters=32,kernel_size=2,strides=1,padding='SAME',activation=tf.nn.relu)
#池化,數(shù)據(jù)減維妹孙,留下最大值秋柄; 最大值池化(輸入數(shù)據(jù),數(shù)據(jù)行列均減少1半蠢正,滑動(dòng)步長)
layer1_pool = tf.layers.max_pooling2d(layer1,pool_size=2,strides=2)
#輸出層骇笔,激勵(lì)層(激勵(lì)函數(shù)relu)
layer2 = tf.reshape(layer1_pool,[-1,32*32*32])
layer2_relu = tf.layers.dense(layer2,1024,tf.nn.relu)
output = tf.layers.dense(layer2_relu,15) #輸出,15維嚣崭,因?yàn)橐还?5人
#定義損失函數(shù)笨触,采用交叉熵和梯度下降法(下降步長0.01)并最小化損失函數(shù)
loss = tf.losses.softmax_cross_entropy(onehot_labels=label_input,logits=output)
train = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
#檢測概率 axis=1:表示維度為1
accuracy = tf.metrics.accuracy(labels=tf.argmax(label_input,axis=1),predictions=tf.argmax(output,axis=1))[1]
# run acc 初始化所有變量
init = tf.group(tf.global_variables_initializer(),tf.local_variables_initializer())
with tf.Session() as sess:
sess.run(init)
for i in range(0,200):
train_data_input = np.array(train_data)
train_label_input = np.array(train_labels_new)
sess.run([train,loss],feed_dict={data_input:train_data_input,label_input:train_label_input})
acc = sess.run(accuracy,feed_dict={data_input:test_data_input,label_input:test_labels_input})
print('acc:%.2f',acc)