tensflow实现手写识别代码
tensflow实现手写识别代码
在深度学习中,使用mnist数据集,搭建神经网络,相当于刚开始写代码时写hello world!。
在本个代码里面,我们使用的是全连接神经网络。大概是隐藏层300个神经节点,输出层10个神经节点,输入层784个神经节点的神经网络。隐藏层的**函数使用的是sigmod函数,输出层的**函数使用的是softmax函数。代价函数使用的是信息熵。
softmax函数
softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类!
假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的softmax值就是
更形象的如下图表示:
softmax直白来说就是将原来输出是3,1,-3通过softmax函数一作用,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标
!
下面具体根据代码我们来解读下这个神经网络。
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets("mnist",one_hot=True)#引入数据集
在这里我们直接使用tensorflow里面个mnist数据集进行测试,mnist数据集大概就是一个很大的矩阵,你可以把它想象成一个有很多行,784列的矩阵,至于为啥是784列,因为每个手写数字图片的就是784个像素点。
n_batch=mnist.train.num_examples#得到训练集图片的个数
batch_size=10
x=tf.placeholder(dtype=tf.float32,shape=[None,784])#定义输入的占位符
y=tf.placeholder(dtype=tf.float32,shape=[None,10])#定义输出的占位符
在这里我们把batch_size设置为10,我也尝试过设置为100,都对最后的正确率没有任何问题。但是大家注意,batch_size在以后的代码中的选择可能会比较重要。想要了解更多关于batch_size的知识的可以去看[batch_size详解]查看。(https://www.cnblogs.com/alexanderkun/p/8099450.html)
在tensflow中tensor有三种表现形式,常量:a=tf.constant(2.0) 变量b=tf.Variable(tf.zeros(shape=(3,3)))
占位符 c=tf.placeholder(dtype=tf.float32,shape=(3,3))
其实只有占位符大家可能理解不太清楚,因为在tensorflow中需要使用声明式编程,需要先创建好图后才可以运行。所以在创建图的时候我们首先先定义一个占位符去占个位置,这样后来输入数据的时候直接把数据喂给占位符就可以了,图就可以运行了。
W=tf.Variable(tf.truncated_normal([784,300],stddev=0.1))#第一层神经网络节点
W1=tf.Variable(tf.zeros(shape=[300,10]))#第二层神经网络节点
prediction=tf.nn.softmax(tf.matmul(tf.nn.sigmoid(tf.matmul(x,W)),W1))#第一层**函数用sigmoid函数,第二个使用softmax函数
从这里看可能有点迷糊了,我也先讲下我才的坑,W矩阵大家一定要注意不要初始化全为0,应该使用一种方法随机生成一定范围内的数据,如果全部随机生成0,这样以后怎么训练都只能训练到0.3(在我的这个代码里面)。
先看W变量,它大概是一个784行,300列的矩阵,每一列都代表神经网络里面的一个神经元,所以W矩阵就代表一个拥有300个神经节点的隐藏层。W1变量和W类似。
在经过sigmoid函数和softmax函数后大家可以看到我们就得到我们的prediction矩阵,他大概就是一个batch_size行,10列的矩阵,里面的每一行中的10个数都有一个数最接近1,那个最接近1的数所在的位置就是图片所预测的数字值。
loss=tf.reduce_mean(-tf.reduce_sum(y*tf.log(prediction),reduction_indices=[1]))#损失函数
这个时候我们需要定义损失函数,整个神经网络我们都需要最小化这个loss值,我们选用的信息熵作为损失函数,至于为什么选取,我也很迷糊,只是我查了很多代码基本都是使用这个损失函数,其实在**函数和损失函数里面我也有过很多测试,最后结果证明隐藏层使用sigmoid函数,输出层使用softmax函数,损失函数使用信息熵这个选择得到的模型正确率最高。
train_loss=tf.train.GradientDescentOptimizer(0.5).minimize(loss)#优化器
优化器我们使用梯度下降方法。学习效率设为0.5,我们的目标是最小化损失函数。
init=tf.global_variables_initializer()#初始化tensor
with tf.Session() as sess:#创建回话
sess.run(init)#运行初始化所有tensor
for i in range(21):#训练21轮
for epoch in range(n_batch):
batch_xs,batch_ys=mnist.train.next_batch(batch_size)
sess.run(train_loss,feed_dict={x:batch_xs,y:batch_ys})
接下来我们便可以直接进行训练,在tensorflow中想要运行图就必须在一个会话中运行。init=tf.global_variables_initializer(), sess.run(init)这两句代码也是必须的,它的意思是初始化的意思,最好在代码中使用下,不然出错了很难找原因。
在时候大家应该明白站位符的作用了吧,如果我们想用运行train_loss,那么我们是不是应该要得到loss的值,我们要得到loss的值,我们是不是需要输入x,y的值,随意我需要使用feed_dict={x:batch_xs,y:batch_ys}去把值喂给x,y。
大家可能迫不及待的想测试网络的正确率了吧。
correct_prediction=tf.equal(tf.arg_max(y,1),tf.arg_max(prediction,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels})
print(‘Iter’ + str(epoch) + “,Testing Accuracy” + str(acc))#测试正确率
便可使用测试集去得到正确率。
完整的代码如下
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets("mnist",one_hot=True)#引入数据集
n_batch=mnist.train.num_examples#得到训练集图片的个数
batch_size=10
x=tf.placeholder(dtype=tf.float32,shape=[None,784])#定义输入的占位符
y=tf.placeholder(dtype=tf.float32,shape=[None,10])#定义输出的占位符
W=tf.Variable(tf.truncated_normal([784,300],stddev=0.1))#第一层神经网络节点
W1=tf.Variable(tf.zeros(shape=[300,10]))#第二层神经网络节点
prediction=tf.nn.softmax(tf.matmul(tf.nn.sigmoid(tf.matmul(x,W)),W1))#第一层**函数用sigmoid函数,第二个使用softmax函数
loss=tf.reduce_mean(-tf.reduce_sum(y*tf.log(prediction),reduction_indices=[1]))#损失函数
#loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
correct_prediction=tf.equal(tf.arg_max(y,1),tf.arg_max(prediction,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
train_loss=tf.train.GradientDescentOptimizer(0.5).minimize(loss)#优化器
init=tf.global_variables_initializer()#初始化tensor
with tf.Session() as sess:#创建回话
sess.run(init)#运行初始化所有tensor
for i in range(21):#训练21轮
for epoch in range(n_batch):
batch_xs,batch_ys=mnist.train.next_batch(batch_size)
sess.run(train_loss,feed_dict={x:batch_xs,y:batch_ys})
if(epoch%100==0):
acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels})
print('Iter' + str(epoch) + ",Testing Accuracy" + str(acc))#测试正确率
最后的正确率大概在0.97到0.98之间。
上一篇: springboot集成Eureka服务注册与发现
下一篇: Java泛型概述
推荐阅读
-
tensflow实现手写识别代码
-
【深度学习图像识别课程】keras实现CNN系列:(1)MLP实现手写数字MNIST分类
-
Kaggle - Digit Recognizer 手写数字识别 -> KNN 和 neural network实现
-
神经网络学习系列(一)前向神经网络和BP算法 附python代码(minst手写体识别)
-
pytorch实现kaggle手写数字识别
-
Tensorflow 实战Google深度学习框架——学习笔记(六)LeNet-5网络实现MNIST手写数字集识别
-
深度学习:多层感知机MLP数字识别的代码实现
-
SVM实现手写数字识别
-
KNN算法——实现手写数字识别(Sklearn实现)
-
KNN实现手写数字识别