Tensorflow标准5层神经网络的人脸分类识别
2018-02-08 00:21
519 查看
Tensorflow标准5层神经网络的人脸分类识别
神经网络模型流程图:
源码如下:
import numpy as np import tensorflow as tf from scipy.misc import imread import os #加载训练图片,M和G的头像照片各5张,像素已全部处理为300*400 def initImageData(): dirpath = "E:/data/cat/" y = np.empty([10, 2]) x = np.empty([10, 400, 300, 3]) index = 0 for file in os.listdir(dirpath): if file.startswith("r") : y[index, 0] = 0 y[index, 1] = 1 x[index, :, :, :] = imread(dirpath + file) elif file.startswith("c") : y[index, 0] = 1 y[index, 1] = 0 x[index, :, :, :] = imread(dirpath + file) index += 1 return x/255, y #根据shape随机初始化参数w def w_variable(shape): initial = tf.truncated_normal(shape, stddev=0.1, dtype=tf.float32) return tf.Variable(initial) #根据shape初始偏执量b def b_variable(shape): initial = tf.constant(0.1, shape=shape, dtype=tf.float32) return tf.Variable(initial) #训练神经网络 def runTensorFlow(X,y): m = X.shape[0] grap = tf.get_default_graph() #初始化第一层的卷积层滤波器(filter-num=6,f=5,s=2) filter_w_1 = w_variable([5, 5, 3, 6]) #初始化第一层的卷积层偏移量 filter_b_1 = b_variable([6]) #初始化第二层的卷积层滤波器(filter-num=16,f=5,s=2) filter_w_2 = w_variable([5, 5, 6, 16]) #初始化第二层的卷积层偏移量 filter_b_2 = b_variable([16]) f_w_1 = w_variable([6528, 1200]) f_b_1 = b_variable([1, 1200]) f_w_2 = w_variable([1200, 600]) f_b_2 = b_variable([1, 600]) f_w_3 = w_variable([600, 2]) f_b_3 = b_variable([1, 2]) x = tf.placeholder(tf.float32, [None, 400, 300, 3], name="x") z_conv_1 = tf.add(tf.nn.conv2d(x, filter_w_1, [1, 2, 2, 1], padding="VALID"), filter_b_1) #第一层的卷积层输出 a_conv_1 = tf.nn.relu(z_conv_1, name="conv1") #第一层的池化输出(f=2,s=2),第一个数组为ksize,第二个为step-long pool_1 = tf.nn.max_pool(a_conv_1, [1, 2, 2, 1], [1, 2, 2, 1], padding="VALID", name="pool1") z_conv_2 = tf.add(tf.nn.conv2d(pool_1, filter_w_2, [1, 2, 2, 1], padding="VALID"), filter_b_2) #第二层的卷积层输出 a_conv_2 = tf.nn.relu(z_conv_2, name="conv2") #第二层的池化输出(f=2,s=2),第一个数组为ksize,第二个为step-long pool_2 = tf.nn.max_pool(a_conv_2, [1, 2, 2, 1], [1, 2, 2, 1], padding="VALID", name="pool2") #全连接输入 f_input = tf.reshape(pool_2, [-1, 6528]) #全连接第一层输出 f_a_1 = tf.nn.relu(tf.matmul(f_input, f_w_1) + f_b_1, name="fa1") #全连接第二层输出 f_a_2 = tf.nn.relu(tf.matmul(f_a_1, f_w_2) + f_b_2, name="fa2") #最终输出层 z = tf.matmul(f_a_2, f_w_3) + f_b_3 p = tf.nn.softmax(z, name="prediction") grap.add_to_collection(name="prediction", value = p) #softmax损失函数 #loss = tf.reduce_mean(-tf.reduce_sum(y * tf.log(p),reduction_indices=[1]), name="loss") loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=z, name="loss")) grap.add_to_collection(name="loss", value=loss) #使用Adam的优化方式优化梯度下降 optimizer = tf.train.AdamOptimizer(0.001).minimize(loss) init = tf.global_variables_initializer() saver = tf.train.Saver() with tf.Session() as session: session.run(init) #打印损失函数值,便于查看训练效果 print(session.run(loss, feed_dict={x : X})) for i in range(200): _, loss_ = session.run([optimizer, loss], feed_dict={x: X}) print(loss_) #保存训练的model #saver.save(session, "E:/data/cat-model/model_test") #打印训练后的损失函数值 print(session.run(loss, feed_dict={x: X})) #打印训练集的预测结果 print(np.argmax(session.run(p, feed_dict={x: X}), axis=1)) #加载保存的模型并对新输入进行预测 def restoreAndPredict(X): with tf.Session() as session: saver = tf.train.import_meta_graph('E:/data/cat-model/model_test.meta') saver.restore(session, tf.train.latest_checkpoint('E:/data/cat-model/')) graph = tf.get_default_graph() x = graph.get_tensor_by_name('x:0') p = graph.get_collection("prediction") print(np.argmax(session.run(p, feed_dict={x:X})[0], axis=1)) x, y = initImageData() runTensorFlow(x, y) #x_test = np.empty([1, 400, 300, 3]) #交叉验证集的一个数据 #x_test[0, :, :, :] = imread("E:/data/cat/t_r.JPG") #restoreAndPredict(x_test)
相关文章推荐
- Tensorflow手写数字识别之简单神经网络分类与CNN分类效果对比
- 单样本学习:使用孪生神经网络进行人脸识别
- 使用CNN神经网络进行图片识别分类
- 基于神经卷积网络的人脸识别
- 人脸识别技术--双层异构深度神经网络
- 使用tensorflow利用神经网络分类识别MNIST手写数字数据集,转自随心1993
- [置顶] LVQ神经网络之人脸朝向识别详细解析
- 数据挖掘之数据处理——SVM神经网络的数据分类预测-意大利葡萄酒种类识别
- 基于小波和余弦变换的神经网络人脸识别法
- CMU提出对抗生成网络:可实现对人脸识别模型的神经网络攻击
- 【神经网络】MCCN(Multi-task Cascaded Convolutional Networks )人脸识别与特征点检测论文解析
- TensorFlow练手项目一:使用循环神经网络(RNN)实现影评情感分类
- 神经网络与深度学习 1.6 使用Python实现基于梯度下降算法的神经网络和MNIST数据集的手写数字分类程序
- 【opencv】神经网络识别美女
- 基于深层神经网络的命名实体识别技术
- 神经网络训练实例(手写体识别)
- [学习笔记]人工智能-神经网络对数据进行分类-可视化
- 神经网络实现手写字符识别系统
- 为什么能用神经网络来执行MNIST识别?
- 使用OpenCV自带的神经网络对MNIST手写字体进行识别