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

目标:虽然已经说过了,还是再说一遍趴。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
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值