用tensorflow实现手写数字识别

1、案例简介
这次我们要实现的是用一个两层的神经网络实现手写数字识别。样本的话网上一搜就有,样本包含了四个压缩文件,分别是六万张训练图片和标签,一万张测试图片和标签。

2、上代码


#实现手写数字识别,softmax分类(简单版本)Yan LeCun's website
#六万个样本,一万个测试样本
import tensorflow.compat.v1 as tf
tf.compat.v1.disable_eager_execution()
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data

#载入数据集
mnist=input_data.read_data_sets("MNIST_data",one_hot=True)

batch_size=100
n_batch=mnist.train.num_examples #一共有多少批次

x=tf.placeholder(tf.float32,[None,784])#28*28的图片拉长一个向量
y=tf.placeholder(tf.float32,[None,10])

#创建一个两层的神经网络
W=tf.Variable(tf.zeros([784,10]))
b=tf.Variable(tf.zeros([1,10]))
prediction=tf.nn.softmax(tf.matmul(x,W)+b)

loss=tf.reduce_mean(tf.square(y-prediction))

train_step=tf.train.GradientDescentOptimizer(0.2).minimize(loss)

init=tf.global_variables_initializer()

correct=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#返回一维张量中最大值的位置

accuracy=tf.reduce_mean(tf.cast(correct,tf.float32))#bool型转换为float,[1,0,0,1,1]求平均值

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(21):
        for batch in range(n_batch):
            batch_xs,batch_ys=mnist.train.next_batch(batch_size)
            sess.run(train_step,feed_dict={
    
    x:batch_xs,y:batch_ys})
        acc=sess.run(accuracy,feed_dict={
    
    x:mnist.test.images,y:mnist.test.labels})
        print("Iter"+str(epoch)+",Tseting accuracy"+str(acc))

#准确率91%,如何优化,批次大小,增加隐藏层神经元,激活函数调整,权值偏置值的初始化,代价函数用交叉熵怎么样
#梯度下降的学习率,或者用别的优化方式,训练次数不止21次

3、具体分析
我们先做一些准备工作,有的人可能会遇到错误:no module named examples或者no modules named tutorials 遇到这种情况,我们需要自行在网上(github等)下载文件夹(github的话需要点击code 的download zip),把examples文件夹复制到Lib\site-packages\tensorflow的文件夹下,把tutorials文件夹复制到examples文件夹下。
另外,数据集一般不会在Python中下载成功,需要自行下载,安装在你的python文件下,比如,我的Python文件存放在D盘的spyderpy文件夹中,那么MNIST_data也放在这个文件夹中。
好了,我们再解释一下,插入数据集时采用了one-hot编码格式,这个意思就是一个数据只有一个是1,其他全是0。我们输入的数据是1行784列,784=28*28(像素值),然后经过(x,w) ,生成1行10列的数据,10列代表10个数字,意义就是把784个属性用十个属性来代表,而每个属性用w1x+w2x+w3x…+w784x784个权值来操作,形成一个属性,有十个这样的。最终会形成一个1行10列的数据,用softmax多分类,其原理就是,把值化成概率,概率最大的就是输出结果,即那一个位置是1,其他是0。
其他的就没有什么好说的了,就是训练过程会有点慢,大家耐心等待吧。
在我的实验中,准确率大概在93%,我们可以找一些办法来优化,比如:
1、增加隐藏层神经元,2、激活函数调整,3、权值偏置值的初始化,4、代价函数用交叉熵怎么样
5、梯度下降的学习率 ,6、或者用别的优化方式,训练次数不止21次。

猜你喜欢

转载自blog.csdn.net/weixin_53344209/article/details/113791697