cut_save_face.py
#!/usr/bin/python
# coding:utf8
import cv2
import os
import numpy as np
import csv
def detect(img, cascade):
"""
使用Haar特征檢測分類器完成人臉檢測
:param img:
:param cascade:
:return:
"""
# detectMultiScale檢測出圖片中所有的人臉,並將人臉用vector保存各個人臉的坐標、大小(用矩形表示),返回坐標。
rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE)
if len(rects) == 0:
return []
rects[:, 2:] += rects[:, :2]
return rects
cascade = cv2.CascadeClassifier(
"E:/Anaconda3/envs/sklearn/Library/etc/haarcascades/haarcascade_frontalface_alt.xml")
f = "jaffe/"
fs = os.listdir(f)
data = np.zeros([213, 48 * 48], dtype=np.uint8)
label = np.zeros([213], dtype=int)
i = 0
for f1 in fs:
tmp_path = os.path.join(f, f1)
if not os.path.isdir(tmp_path):
# print(tmp_path[len(f):])
img = cv2.imread(tmp_path, 1)
# BGR轉換為灰度圖
dst = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
rects = detect(dst, cascade)
for x1, y1, x2, y2 in rects:
cv2.rectangle(img, (x1 + 10, y1 + 20), (x2 - 10, y2), (0, 255, 255), 2)
# 調整截取臉部區域大小
img_roi = np.uint8([y2 - (y1 + 20), (x2 - 10) - (x1 + 10)])
roi = dst[y1 + 20:y2, x1 + 10:x2 - 10]
img_roi = roi
re_roi = cv2.resize(img_roi, (48, 48))
# 獲得表情label
img_label = tmp_path[len(f) + 3:len(f) + 5]
# print(img_label)
if img_label == 'AN':
label[i] = 0
elif img_label == 'DI':
label[i] = 1
elif img_label == 'FE':
label[i] = 2
elif img_label == 'HA':
label[i] = 3
elif img_label == 'SA':
label[i] = 4
elif img_label == 'SU':
label[i] = 5
elif img_label == 'NE':
label[i] = 6
else:
print("get label error.......\n")
# flatten返回一個折疊成一維的數組。但是該函數只能適用於numpy對象,即array或者mat,普通的list列表是不行的。
data[i][0:48 * 48] = np.ndarray.flatten(re_roi)
i = i + 1
# cv2.imshow("src", dst)
# cv2.imshow("img", img)
# if cv2.waitKey() == 32:
# continue
with open(r"face.csv", "w") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['emotion', 'pixels'])
for i in range(len(label)):
data_list = list(data[i])
b = " ".join(str(x) for x in data_list)
# 在水平方向上平鋪
l = np.hstack([label[i], b])
writer.writerow(l)
detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE)
- 參數image--待檢測圖片,一般為灰度圖像加快檢測速度;
- 參數scaleFactor--表示在前后兩次相繼的掃描中,搜索窗口的比例系數。默認為1.1即每次搜索窗口依次擴大10%;
- 參數minNeighbors--表示構成檢測目標的相鄰矩形的最小個數(默認為3個)。如果組成檢測目標的小矩形的個數和小於 min_neighbors - 1 都會被排除。如果min_neighbors 為 0, 則函數不做任何操作就返回所有的被檢候選矩形框,這種設定值一般用在用戶自定義對檢測結果的組合程序上;
- 參數flags--flags=0:可以取如下這些值:CASCADE_DO_CANNY_PRUNING=1,利用canny邊緣檢測來排除一些邊緣很少或者很多的圖像區域,CASCADE_SCALE_IMAGE=2,正常比例檢測,CASCADE_FIND_BIGGEST_OBJECT=4,只檢測最大的物體,CASCADE_DO_ROUGH_SEARCH=8 初略的檢測
show_facial_expression.py
#!/usr/bin/python
# coding:utf8
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
emotion = {0: 'Angry', 1: 'Disgust', 2: 'Fear', 3: 'Happy', 4: 'Sad', 5: 'Surprise', 6: 'Neutral'}
data = pd.read_csv(r'face.csv', dtype='a')
label = np.array(data['emotion'])
img_data = np.array(data['pixels'])
N_sample = label.size
Face_data = np.zeros((N_sample, 48 * 48))
Face_label = np.zeros((N_sample, 7), dtype=int)
# 顯示人臉以及對應表情
for i in range(25):
x = img_data[i]
# 使用字符串創建矩陣。
x = np.fromstring(x, dtype=float, sep=' ')
x = x / x.max()
img_x = np.reshape(x, (48, 48))
plt.subplot(5, 5, i + 1)
plt.axis('off')
plt.title(emotion[int(label[i])])
plt.imshow(img_x, plt.cm.gray)
plt.show()
count_facial_expression.py
#!/usr/bin/python
# coding:utf8
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
emotion = {0: 'Angry', 1: 'Disgust', 2: 'Fear', 3: 'Happy', 4: 'Sad', 5: 'Surprise', 6: 'Neutral'}
data = pd.read_csv(r'face.csv', dtype='a')
label = np.array(data['emotion'])
img_data = np.array(data['pixels'])
N_sample = label.size
emotions = np.zeros(7)
for i in label:
for j in range(7):
if int(i) == j:
emotions[j] = emotions[j] + 1
print(emotions)
plt.bar(range(7), emotions, 0.5, color=['red', 'green', 'blue'])
plt.xlabel('emotions')
plt.xticks(range(7), ['Angry', 'Disgust', 'Fear', 'Happy', 'Sad', 'Surprise', 'Neutral'], rotation=0)
plt.ylabel('number')
plt.grid()
plt.show()
train_keras.py
#!/usr/bin/python
# coding:utf8
import numpy as np
import pandas as pd
from keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten
from keras.models import Sequential
from keras.preprocessing.image import ImageDataGenerator
# 表情類別
emotion = {0: 'Angry', 1: 'Disgust', 2: 'Fear', 3: 'Happy', 4: 'Sad', 5: 'Surprise', 6: 'Neutral'}
# 讀取數據
data = pd.read_csv(r'face.csv', dtype='a')
# 讀取標簽列表
label = np.array(data['emotion'])
# 圖像列表
img_data = np.array(data['pixels'])
# 圖像數量
N_sample = label.size
# (213, 2304)
Face_data = np.zeros((N_sample, 48 * 48))
# (213, 7)
Face_label = np.zeros((N_sample, 7), dtype=np.float)
for i in range(N_sample):
x = img_data[i]
x = np.fromstring(x, dtype=float, sep=' ')
x = x / x.max()
Face_data[i] = x
Face_label[i, int(label[i])] = 1.0
# 訓練數據數量
train_num = 200
# 測試數據數量
test_num = 13
# 訓練數據
train_x = Face_data[0:train_num, :]
train_y = Face_label[0:train_num, :]
train_x = train_x.reshape(-1, 48, 48, 1) # reshape
# 測試數據
test_x = Face_data[train_num: train_num + test_num, :]
test_y = Face_label[train_num: train_num + test_num, :]
test_x = test_x.reshape(-1, 48, 48, 1) # reshape
# 序貫模型
model = Sequential()
model.add(Conv2D(32, (5, 5), activation='relu', input_shape=(48, 48, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(7, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
# 擴增數據
datagen = ImageDataGenerator(
featurewise_center=True,
featurewise_std_normalization=True,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True)
datagen.fit(train_x)
model.fit_generator(datagen.flow(train_x, train_y, batch_size=10), steps_per_epoch=len(train_x), epochs=20)
model.fit(train_x, train_y, batch_size=10, epochs=100)
score = model.evaluate(test_x, test_y, batch_size=10)
print("score:", score)
model.summary()
輸出結果
Epoch 50/50
10/200 [>.............................] - ETA: 1s - loss: 0.0015 - acc: 1.0000
20/200 [==>...........................] - ETA: 1s - loss: 7.8377e-04 - acc: 1.0000
30/200 [===>..........................] - ETA: 1s - loss: 0.0013 - acc: 1.0000
40/200 [=====>........................] - ETA: 1s - loss: 0.0012 - acc: 1.0000
50/200 [======>.......................] - ETA: 1s - loss: 0.0013 - acc: 1.0000
60/200 [========>.....................] - ETA: 1s - loss: 0.0011 - acc: 1.0000
70/200 [=========>....................] - ETA: 1s - loss: 0.0013 - acc: 1.0000
80/200 [===========>..................] - ETA: 1s - loss: 0.0012 - acc: 1.0000
90/200 [============>.................] - ETA: 0s - loss: 0.0011 - acc: 1.0000
100/200 [==============>...............] - ETA: 0s - loss: 0.0011 - acc: 1.0000
110/200 [===============>..............] - ETA: 0s - loss: 9.7286e-04 - acc: 1.0000
120/200 [=================>............] - ETA: 0s - loss: 8.9958e-04 - acc: 1.0000
130/200 [==================>...........] - ETA: 0s - loss: 8.3767e-04 - acc: 1.0000
140/200 [====================>.........] - ETA: 0s - loss: 9.1249e-04 - acc: 1.0000
150/200 [=====================>........] - ETA: 0s - loss: 9.3190e-04 - acc: 1.0000
160/200 [=======================>......] - ETA: 0s - loss: 9.0101e-04 - acc: 1.0000
170/200 [========================>.....] - ETA: 0s - loss: 8.6291e-04 - acc: 1.0000
180/200 [==========================>...] - ETA: 0s - loss: 8.2539e-04 - acc: 1.0000
190/200 [===========================>..] - ETA: 0s - loss: 7.8394e-04 - acc: 1.0000
200/200 [==============================] - 2s 9ms/step - loss: 7.8767e-04 - acc: 1.0000
10/13 [======================>.......] - ETA: 0s
13/13 [==============================] - 0s 5ms/step
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 44, 44, 32) 832
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 22, 22, 32) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 18, 18, 64) 51264
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 9, 9, 64) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 5184) 0
_________________________________________________________________
dense_1 (Dense) (None, 1024) 5309440
_________________________________________________________________
dropout_1 (Dropout) (None, 1024) 0
_________________________________________________________________
dense_2 (Dense) (None, 7) 7175
=================================================================
Total params: 5,368,711
Trainable params: 5,368,711
Non-trainable params: 0
_________________________________________________________________
train_tensorflow.py
#!/usr/bin/python
# coding:utf8
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow as tf
def conv_pool_layer(data, weights_size, biases_size):
"""
卷積神經網絡的層
:param data:
:param weights_size:
:param biases_size:
:return:
"""
weights = tf.Variable(tf.truncated_normal(weights_size, stddev=0.1))
biases = tf.Variable(tf.constant(0.1, shape=biases_size))
conv2d = tf.nn.conv2d(data, weights, strides=[1, 1, 1, 1], padding='SAME')
relu = tf.nn.relu(conv2d + biases)
return tf.nn.max_pool(relu, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
def linear_layer(data, weights_size, biases_size):
weights = tf.Variable(tf.truncated_normal(weights_size, stddev=0.1))
biases = tf.Variable(tf.constant(0.1, shape=biases_size))
return tf.add(tf.matmul(data, weights), biases)
def convolutional_neural_network(x, keep_prob):
"""
卷積神經網絡
:param x:
:param keep_prob:
:return:
"""
x_image = tf.reshape(x, [-1, 48, 48, 1])
h_pool1 = conv_pool_layer(x_image, [5, 5, 1, 32], [32])
h_pool2 = conv_pool_layer(h_pool1, [5, 5, 32, 64], [64])
h_pool2_flat = tf.reshape(h_pool2, [-1, 12 * 12 * 64])
h_fc1 = tf.nn.relu(linear_layer(h_pool2_flat, [12 * 12 * 64, 1024], [1024]))
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
return tf.nn.softmax(linear_layer(h_fc1_drop, [1024, class_sum], [class_sum]))
def batch_data(x, y, batch, num):
ind = np.arange(num)
index = ind[batch * batch_size:(batch + 1) * batch_size]
batch_x = x[index, :]
batch_y = y[index, :]
return batch_x, batch_y
if __name__ == "__main__":
# 表情類別
emotion = {0: 'Angry', 1: 'Disgust', 2: 'Fear', 3: 'Happy', 4: 'Sad', 5: 'Surprise', 6: 'Neutral'}
# 數據
data = pd.read_csv(r'face.csv', dtype='a')
# 表情標簽
label = np.array(data['emotion'])
# 圖片數據
img_data = np.array(data['pixels'])
# 圖片數量
N_sample = label.size
# 圖片矩陣
Face_data = np.zeros((N_sample, 48 * 48))
# 標簽矩陣
Face_label = np.zeros((N_sample, 7), dtype=int)
# 遍歷將圖片和標簽構建為矩陣形式
for i in range(N_sample):
x = img_data[i]
x = np.fromstring(x, dtype=float, sep=' ')
x = x / x.max()
Face_data[i] = x
Face_label[i, int(label[i])] = 1
# 參數
dropout = 0.5
class_sum = 7
# dropout減輕過擬合問題
keep_prob = tf.placeholder(tf.float32)
x = tf.placeholder(tf.float32, [None, 48 * 48])
y = tf.placeholder(tf.float32, [None, class_sum])
# 構建卷積神經網絡
pred = convolutional_neural_network(x, keep_prob)
# 取前200個作為訓練數據,后13個為測試數據
train_num = 200
test_num = 13
train_x = Face_data[0:train_num, :]
train_y = Face_label[0:train_num, :]
test_x = Face_data[train_num: train_num + test_num, :]
test_y = Face_label[train_num: train_num + test_num, :]
batch_size = 20
train_batch_num = int(train_num / batch_size)
test_batch_num = test_num / batch_size
# 訓練和評估模型
cross_entropy = -tf.reduce_sum(y * tf.log(pred))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, "float"))
total_train_loss = []
total_train_acc = []
total_test_loss = []
total_test_acc = []
train_epoch = 50
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
for epoch in range(0, train_epoch):
Total_train_loss = 0
Total_train_acc = 0
for train_batch in range(0, train_batch_num):
batch_x, batch_y = batch_data(train_x, train_y, train_batch, train_num)
# 優化操作
sess.run(train_step, feed_dict={x: batch_x, y: batch_y, keep_prob: dropout})
if train_batch % batch_size == 0:
# 計算損失和准確率
loss, acc = sess.run([cross_entropy, accuracy], feed_dict={x: batch_x, y: batch_y, keep_prob: 1.})
print("Epoch: " + str(epoch + 1) + ", Batch: " + str(train_batch) + ", Loss= " + "{:.3f}".format(
loss) + ", Training Accuracy= " + "{:.3f}".format(acc))
Total_train_loss = Total_train_loss + loss
Total_train_acc = Total_train_acc + acc
total_train_loss.append(Total_train_loss)
total_train_acc.append(Total_train_acc)
plt.subplot(2, 1, 1)
plt.ylabel('Train loss')
plt.plot(total_train_loss, 'r')
plt.subplot(2, 1, 2)
plt.ylabel('Train accuracy')
plt.plot(total_train_acc, 'r')
plt.savefig("loss_acc.png")
plt.show()
輸出結果
Epoch: 1, Batch: 0, Loss= 119.417, Training Accuracy= 0.150
Epoch: 2, Batch: 0, Loss= 49.221, Training Accuracy= 0.250
Epoch: 3, Batch: 0, Loss= 39.813, Training Accuracy= 0.200
Epoch: 4, Batch: 0, Loss= 43.067, Training Accuracy= 0.300
Epoch: 5, Batch: 0, Loss= 28.889, Training Accuracy= 0.500
Epoch: 6, Batch: 0, Loss= 18.173, Training Accuracy= 0.700
Epoch: 7, Batch: 0, Loss= 18.474, Training Accuracy= 0.600
Epoch: 8, Batch: 0, Loss= 15.813, Training Accuracy= 0.800
Epoch: 9, Batch: 0, Loss= 12.878, Training Accuracy= 0.850
Epoch: 10, Batch: 0, Loss= 13.250, Training Accuracy= 0.800
Epoch: 11, Batch: 0, Loss= 8.750, Training Accuracy= 0.950
Epoch: 12, Batch: 0, Loss= 10.424, Training Accuracy= 0.850
Epoch: 13, Batch: 0, Loss= 7.592, Training Accuracy= 1.000
Epoch: 14, Batch: 0, Loss= 7.146, Training Accuracy= 0.950
Epoch: 15, Batch: 0, Loss= 7.377, Training Accuracy= 1.000
Epoch: 16, Batch: 0, Loss= 5.423, Training Accuracy= 1.000
Epoch: 17, Batch: 0, Loss= 6.173, Training Accuracy= 1.000
Epoch: 18, Batch: 0, Loss= 4.069, Training Accuracy= 1.000
Epoch: 19, Batch: 0, Loss= 4.163, Training Accuracy= 1.000
Epoch: 20, Batch: 0, Loss= 3.650, Training Accuracy= 1.000
Epoch: 21, Batch: 0, Loss= 3.317, Training Accuracy= 1.000
Epoch: 22, Batch: 0, Loss= 4.195, Training Accuracy= 1.000
Epoch: 23, Batch: 0, Loss= 2.729, Training Accuracy= 1.000
Epoch: 24, Batch: 0, Loss= 2.448, Training Accuracy= 1.000
Epoch: 25, Batch: 0, Loss= 2.614, Training Accuracy= 1.000
Epoch: 26, Batch: 0, Loss= 2.424, Training Accuracy= 1.000
Epoch: 27, Batch: 0, Loss= 2.707, Training Accuracy= 1.000
Epoch: 28, Batch: 0, Loss= 2.072, Training Accuracy= 1.000
Epoch: 29, Batch: 0, Loss= 1.726, Training Accuracy= 1.000
Epoch: 30, Batch: 0, Loss= 1.701, Training Accuracy= 1.000
Epoch: 31, Batch: 0, Loss= 1.598, Training Accuracy= 1.000
Epoch: 32, Batch: 0, Loss= 1.381, Training Accuracy= 1.000
Epoch: 33, Batch: 0, Loss= 1.826, Training Accuracy= 1.000
Epoch: 34, Batch: 0, Loss= 1.227, Training Accuracy= 1.000
Epoch: 35, Batch: 0, Loss= 1.320, Training Accuracy= 1.000
Epoch: 36, Batch: 0, Loss= 1.110, Training Accuracy= 1.000
Epoch: 37, Batch: 0, Loss= 0.875, Training Accuracy= 1.000
Epoch: 38, Batch: 0, Loss= 1.214, Training Accuracy= 1.000
Epoch: 39, Batch: 0, Loss= 0.982, Training Accuracy= 1.000
Epoch: 40, Batch: 0, Loss= 0.982, Training Accuracy= 1.000
Epoch: 41, Batch: 0, Loss= 0.681, Training Accuracy= 1.000
Epoch: 42, Batch: 0, Loss= 0.839, Training Accuracy= 1.000
Epoch: 43, Batch: 0, Loss= 0.777, Training Accuracy= 1.000
Epoch: 44, Batch: 0, Loss= 0.671, Training Accuracy= 1.000
Epoch: 45, Batch: 0, Loss= 0.859, Training Accuracy= 1.000
Epoch: 46, Batch: 0, Loss= 0.529, Training Accuracy= 1.000
Epoch: 47, Batch: 0, Loss= 0.707, Training Accuracy= 1.000
Epoch: 48, Batch: 0, Loss= 0.491, Training Accuracy= 1.000
Epoch: 49, Batch: 0, Loss= 0.500, Training Accuracy= 1.000
Epoch: 50, Batch: 0, Loss= 0.415, Training Accuracy= 1.000
train_tensorboard.py
#!/usr/bin/python
# coding:utf8
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow as tf
def conv_pool_layer(data, weights_size, biases_size):
weights = tf.Variable(tf.truncated_normal(weights_size, stddev=0.1))
biases = tf.Variable(tf.constant(0.1, shape=biases_size))
conv2d = tf.nn.conv2d(data, weights, strides=[1, 1, 1, 1], padding='SAME')
relu = tf.nn.relu(conv2d + biases)
return tf.nn.max_pool(relu, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
def linear_layer(data, weights_size, biases_size):
weights = tf.Variable(tf.truncated_normal(weights_size, stddev=0.1))
biases = tf.Variable(tf.constant(0.1, shape=biases_size))
return tf.add(tf.matmul(data, weights), biases)
def convolutional_neural_network(x, keep_prob):
with tf.name_scope('input'):
x_image = tf.reshape(x, [-1, 48, 48, 1])
with tf.name_scope('conv1'):
h_pool1 = conv_pool_layer(x_image, [5, 5, 1, 32], [32])
with tf.name_scope('conv2'):
h_pool2 = conv_pool_layer(h_pool1, [5, 5, 32, 64], [64])
h_pool2_flat = tf.reshape(h_pool2, [-1, 12 * 12 * 64])
with tf.name_scope('fc3'):
h_fc1 = tf.nn.relu(linear_layer(h_pool2_flat, [12 * 12 * 64, 1024], [1024]))
with tf.name_scope('dropout4'):
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
with tf.name_scope('softmax5'):
out = tf.nn.softmax(linear_layer(h_fc1_drop, [1024, class_sum], [class_sum]))
return out
def batch_data(x, y, batch, num):
ind = np.arange(num)
index = ind[batch * batch_size:(batch + 1) * batch_size]
batch_x = x[index, :]
batch_y = y[index, :]
return batch_x, batch_y
if __name__ == "__main__":
emotion = {0: 'Angry', 1: 'Disgust', 2: 'Fear', 3: 'Happy', 4: 'Sad', 5: 'Surprise', 6: 'Neutral'}
data = pd.read_csv(r'face.csv', dtype='a')
label = np.array(data['emotion'])
img_data = np.array(data['pixels'])
N_sample = label.size
Face_data = np.zeros((N_sample, 48 * 48))
Face_label = np.zeros((N_sample, 7), dtype=int)
for i in range(N_sample):
x = img_data[i]
x = np.fromstring(x, dtype=float, sep=' ')
x = x / x.max()
Face_data[i] = x
Face_label[i, int(label[i])] = 1
# 參數
dropout = 0.5
class_sum = 7
# dropout減輕過擬合問題
keep_prob = tf.placeholder(tf.float32)
x = tf.placeholder(tf.float32, [None, 48 * 48])
y = tf.placeholder(tf.float32, [None, class_sum])
pred = convolutional_neural_network(x, keep_prob)
# 取前200個作為訓練數據,后13個為測試數據
train_num = 200
test_num = 13
train_x = Face_data[0:train_num, :]
train_y = Face_label[0:train_num, :]
test_x = Face_data[train_num: train_num + test_num, :]
test_y = Face_label[train_num: train_num + test_num, :]
batch_size = 20
train_batch_num = int(train_num / batch_size)
test_batch_num = test_num / batch_size
# 訓練和評估模型
with tf.name_scope('cross_entropy'):
cross_entropy = -tf.reduce_sum(y * tf.log(pred))
tf.summary.histogram("cross_entropy", cross_entropy)
# tf.summary.scalar("cross_entropy", cross_entropy)
with tf.name_scope('minimize'):
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
with tf.name_scope('accuracy'):
with tf.name_scope('correct_pred'):
correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
with tf.name_scope('accuracy'):
accuracy = tf.reduce_mean(tf.cast(correct_pred, "float"))
tf.summary.histogram("accuracy", accuracy)
# 輸出包含單個標量值的摘要協議緩沖區
tf.summary.scalar('accuracy', accuracy)
total_train_loss = []
total_train_acc = []
total_test_loss = []
total_test_acc = []
train_epoch = 50
# 合並在默認圖形中收集的所有摘要
merged = tf.summary.merge_all()
with tf.Session() as sess:
writer = tf.summary.FileWriter("tmp/logs", sess.graph)
sess.run(tf.global_variables_initializer())
for epoch in range(0, train_epoch):
Total_train_loss = 0
Total_train_acc = 0
for train_batch in range(0, train_batch_num):
batch_x, batch_y = batch_data(train_x, train_y, train_batch, train_num)
# 優化操作
# sess.run(train_step, feed_dict={x: batch_x, y: batch_y, keep_prob: dropout})
summary, _ = sess.run([merged, train_step], feed_dict={x: batch_x, y: batch_y, keep_prob: dropout})
writer.add_summary(summary, train_batch)
if train_batch % batch_size == 0:
# 計算損失和准確率
loss, acc = sess.run([cross_entropy, accuracy], feed_dict={x: batch_x, y: batch_y, keep_prob: 1.})
print("Epoch: " + str(epoch + 1) + ", Batch: " + str(train_batch) +
", Loss= " + "{:.3f}".format(loss) +
", Training Accuracy= " + "{:.3f}".format(acc))
Total_train_loss = Total_train_loss + loss
Total_train_acc = Total_train_acc + acc
total_train_loss.append(Total_train_loss)
total_train_acc.append(Total_train_acc)
writer.close()
plt.subplot(2, 1, 1)
plt.ylabel('Train loss')
plt.plot(total_train_loss, 'r')
plt.subplot(2, 1, 2)
plt.ylabel('Train accuracy')
plt.plot(total_train_acc, 'r')
plt.savefig("face_loss_acc.png")
plt.show()