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之间。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值