TensorFlow2.0 + CNN + keras + 人脸识别

it2025-06-07  11

目标:虽然已经说过了,还是再说一遍趴。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]))
最新回复(0)