TensorFlow基础,TensorFlow简单人脸识别
数据材料
这是一个小型的人脸数据库,一共有40个人,每个人有10张照片作为样本数据。这些图片都是黑白照片,意味着这些图片都只有灰度0-255,没有rgb三通道。于是我们需要对这张大图片切分成一个个的小脸。整张图片大小是1190 × 942,一共有20 × 20张照片。那么每张照片的大小就是(1190 / 20)× (942 / 20)= 57 × 47 (大约,以为每张图片之间存在间距)。
问题解决
10类样本,利用CNN训练可以分类10类数据的神经网络,与手写字符识别类似
#coding=utf-8
#http://www.jianshu.com/p/3e5ddc44aa56
#tensorflow 1.3.1
#python 3.6
import os
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import matplotlib.patches as patches
import numpy
from PIL import Image
#获取dataset
def load_data(dataset_path):
img = Image.open(dataset_path)
# 定义一个20 × 20的训练样本,一共有40个人,每个人都10张样本照片
img_ndarray = np.asarray(img, dtype='float64') / 256
#img_ndarray = np.asarray(img, dtype='float32') / 32
# 记录脸数据矩阵,57 * 47为每张脸的像素矩阵
faces = np.empty((400, 57 * 47))
for row in range(20):
for column in range(20):
faces[20 * row + column] = np.ndarray.flatten(
img_ndarray[row * 57: (row + 1) * 57, column * 47 : (column + 1) * 47]
)
label = np.zeros((400, 40))
for i in range(40):
label[i * 10: (i + 1) * 10, i] = 1
# 将数据分成训练集,验证集,测试集
train_data = np.empty((320, 57 * 47))
train_label = np.zeros((320, 40))
vaild_data = np.empty((40, 57 * 47))
vaild_label = np.zeros((40, 40))
test_data = np.empty((40, 57 * 47))
test_label = np.zeros((40, 40))
for i in range(40):
train_data[i * 8: i * 8 + 8] = faces[i * 10: i * 10 + 8]
train_label[i * 8: i * 8 + 8] = label[i * 10: i * 10 + 8]
vaild_data[i] = faces[i * 10 + 8]
vaild_label[i] = label[i * 10 + 8]
test_data[i] = faces[i * 10 + 9]
test_label[i] = label[i * 10 + 9]
train_data = train_data.astype('float32')
vaild_data = vaild_data.astype('float32')
test_data = test_data.astype('float32')
return [
(train_data, train_label),
(vaild_data, vaild_label),
(test_data, test_label)
]
def convolutional_layer(data, kernel_size, bias_size, pooling_size):
kernel = tf.get_variable("conv