TensorFlow2.0 + CNN + keras + 人臉識別

渝滇發表於2020-10-21

目標:雖然已經說過了,還是再說一遍趴。TensorFlow2.0 + CNN + keras + 人臉識別。
即基於TensorFlow2.0使用CNN(卷積神經網路)實現人臉識別。資料集為來自sklearn的datasets的fetch_olivetti_faces。
劃重點:我這個是tf2.0
我這個是tf2.0
我這個是tf2.0!!!重要的事情說三遍
好了不多說了,下面貼上原始碼

# python環境下通過TensorFlow2.0整合的keras進行人臉識別

import numpy as np
from sklearn import datasets
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
import tensorflow.keras as keras

# 資料準備
# 篩選資料來自sklearn的datasets的fetch_olivetti_faces,只有400張,在cnn訓練時,佔用時間少,方便測試。
faces = datasets.fetch_olivetti_faces()

# print(faces.images.shape)

i = 0
plt.figure(figsize=(20, 20))
for img in faces.images:
    # 總共400張圖,把影像分割成20X20
    plt.subplot(20, 20, i + 1)
    plt.imshow(img, cmap="gray")
    # 關閉x,y軸顯示
    plt.xticks([])
    plt.yticks([])
    plt.xlabel(faces.target[i])
    i = i + 1

# plt.show()

# 人臉資料
X = faces.images
# 人臉對應的標籤
y = faces.target
# print(X[0])
# print(y[0])

# 資料預處理
# 首先要reshape一下資料格式,由原本的[一次的訓練數量,長,寬],變為[一次的訓練數量,長,寬,通道數], 通道數實際上就是深度,我們本次樣本是黑白圖,所以深度只有1, 如果是RGB彩色照片,通道數就是3,這個通道數也可以自己設計。
X = X.reshape(400, 64, 64, 1)

# 隨機分割30%的資料做測試驗證的資料
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 構建模型
model = keras.Sequential()
# 第一層卷積,卷積的數量為128,卷積的高和寬是3x3,啟用函式使用relu
model.add(keras.layers.Conv2D(128, kernel_size=3, activation='relu', input_shape=(64, 64, 1)))
# 第二層卷積
model.add(keras.layers.Conv2D(64, kernel_size=3, activation='relu'))
# 把多維陣列壓縮成一維,裡面的操作可以簡單理解為reshape,方便後面Dense使用
model.add(keras.layers.Flatten())

# 對應cnn的全連結層,可以簡單理解為把上面的小圖彙集起來,進行分類
model.add(keras.layers.Dense(40, activation='softmax'))

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 訓練
model.fit(X_train, y_train, epochs=8)

# 驗證
# 先進行預測,發現這裡的方法和sklearn很相似。
y_predict = model.predict(X_test)

# 預測後,然後和測試標籤進行比對:
print(y_test[0], np.argmax(y_predict[0]))

相關文章