TensorFlow实例之识别图片中的手写数字

一、MNIST数据集

MNIST数据集来自美国国家标准与技术研究所,其中有训练数据集以及测试数据集,具有大量的手写数字图片数据。该数据集可以直接网上下载,不过在TensorFlow中提供了一个库,可以直接用来下载和安装MNIST。

二、测试并查看数据集数据

通过TensorFlow,我们可以下载数据集,然后打印相关数据并查看,具体实现代码如下:

from tensorflow.examples.tutorials.mnist import input_data
#one_hot=True表示将样本标签转化成one_hot编码.one_hot编码:若总共分十类,则存在九个0,第几位不是0,而是1,则表示这是第几类
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
#MNIST数据集中的图片是28X28像素大小,即共784个像素,可以看成1行784列数据
print('输入数据: ',mnist.train.images)
print('输入数据shape: ',mnist.train.images.shape)
import pylab
im = mnist.train.images[1]   
im = im.reshape(-1,28)    #将数据重新组织
pylab.imshow(im)
pylab.show()

运行结果如下:
在这里插入图片描述在这里插入图片描述

三、构建模型

从上面实验结果我们可以看出,MNIST数据集的下载已经成功,下面我们可以利用该数据进行模型训练了。
建立模型只需要按顺序进行即可,首先需要定义变量:

x = tf.placeholder(tf.float32,[None,784])  #None表示此张量的第一个维度可以是任何长度的,MNIST中每张图片784个像素值
y = tf.placeholder(tf.float32,[None,10])   #0~9,共十个类别

其次定义参数:

#定义学习参数
#X*W是矩阵相乘,X的矩阵的列数为784,故而W的行数应为784,最后需要统计结果,因此应当输出1行10列的小矩阵
W = tf.Variable(tf.random_normal([784,10]))
b = tf.Variable(tf.zeros([10]))

还要定义正向传播:

#定义正向传播
pred = tf.nn.softmax(tf.matmul(x,W)+b)  #Softmax分类

尤为重要的是定义反向传播,只有反向传播定义好,才能不断优化结果:

#定义反向传播
#损失函数
cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1))

#定义参数
learning_rate = 0.01
#使用梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

以上基本必要元素都已准备完成,下面可以开始正式的模型训练了:

#把整个训练样本集迭代25次
training_epochs = 25
#表示训练过程中一次取100条数据进行训练
batch_size = 100
#表示每训练一次就把具体的中间状态显示出来
display_step = 1
#启动session
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())  #运行初始化
    
    #启动循环开始训练
    for epoch in range(training_epochs):
        avg_cost = 0
        total_batch = int(mnist.train.num_examples/batch_size)
        #循环所有数据集
        for i in range(total_batch):
            batch_xs,batch_ys = mnist.train.next_batch(batch_size)
            #运行优化器
            _,c = sess.run([optimizer,cost],feed_dict={x:batch_xs,y:batch_ys})
            #计算平均loss值
            avg_cost += c / total_batch
        #显示训练中的详细信息
        if(epoch+1) % display_step == 0:
            print("Epoch:",'%04d'%(epoch+1),"cost=","{:.9f}".format(avg_cost))
    print("Finished!")

至此,模型已经训练完成了!

四、测试数据

别忘记了,MNIST数据集中还有测试数据集,而且模型训练出来的目的就是为了可以用来使用,所以使用的效果怎么样,我们还需要通过测试数据来看看效率如何。
这个测试代码,同样还需要在session内执行:

#测试模型
    correct_prediction = tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
    #计算准确率
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
    #将得到的训练结果与标签中记录的结果进行比较
    print("Accuracy:",accuracy.eval({x:mnist.test.images,y:mnist.test.labels}))

我们通过打印出来的精确度,就可以知道我们的模型准确率如何了。

五、完整代码与结果

完整代码如下:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
import pylab

tf.reset_default_graph()
#定义占位符
#x表示能够输入x数量的MNIST图像
x = tf.placeholder(tf.float32,[None,784])  #None表示此张量的第一个维度可以是任何长度的,MNIST中每张图片784个像素值
y = tf.placeholder(tf.float32,[None,10])   #0~9,共十个类别

#定义学习参数
#X*W是矩阵相乘,X的矩阵的列数为784,故而W的行数应为784,最后需要统计结果,因此应当输出1行10列的小矩阵
W = tf.Variable(tf.random_normal([784,10]))
b = tf.Variable(tf.zeros([10]))

#定义正向传播
pred = tf.nn.softmax(tf.matmul(x,W)+b)  #Softmax分类

#定义反向传播
#损失函数
cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1))

#定义参数
learning_rate = 0.01
#使用梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

#把整个训练样本集迭代25次
training_epochs = 25
#表示训练过程中一次取100条数据进行训练
batch_size = 100
#表示每训练一次就把具体的中间状态显示出来
display_step = 1

#启动session
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())  #运行初始化
    
    #启动循环开始训练
    for epoch in range(training_epochs):
        avg_cost = 0
        total_batch = int(mnist.train.num_examples/batch_size)
        #循环所有数据集
        for i in range(total_batch):
            batch_xs,batch_ys = mnist.train.next_batch(batch_size)
            #运行优化器
            _,c = sess.run([optimizer,cost],feed_dict={x:batch_xs,y:batch_ys})
            #计算平均loss值
            avg_cost += c / total_batch
        #显示训练中的详细信息
        if(epoch+1) % display_step == 0:
            print("Epoch:",'%04d'%(epoch+1),"cost=","{:.9f}".format(avg_cost))
    print("Finished!")
    
    #测试模型
    correct_prediction = tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
    #计算准确率
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
    print("Accuracy:",accuracy.eval({x:mnist.test.images,y:mnist.test.labels}))
    

运行结果如下:

Epoch: 0001 cost= 8.459903082
Epoch: 0002 cost= 4.523242643
Epoch: 0003 cost= 3.146370517
Epoch: 0004 cost= 2.478855654
Epoch: 0005 cost= 2.089780384
Epoch: 0006 cost= 1.836679283
Epoch: 0007 cost= 1.659617125
Epoch: 0008 cost= 1.528565002
Epoch: 0009 cost= 1.426968375
Epoch: 0010 cost= 1.345347175
Epoch: 0011 cost= 1.278136139
Epoch: 0012 cost= 1.221436052
Epoch: 0013 cost= 1.172722506
Epoch: 0014 cost= 1.130547781
Epoch: 0015 cost= 1.093209832
Epoch: 0016 cost= 1.059983848
Epoch: 0017 cost= 1.030197065
Epoch: 0018 cost= 1.003449231
Epoch: 0019 cost= 0.979035843
Epoch: 0020 cost= 0.956688213
Epoch: 0021 cost= 0.936052884
Epoch: 0022 cost= 0.917110073
Epoch: 0023 cost= 0.899471247
Epoch: 0024 cost= 0.882988742
Epoch: 0025 cost= 0.867950235
Finished!
Accuracy: 0.8352

至此,我们TensorFlow关于识别手写数字的训练模型已经完成,整个训练过程中只需要使用softmax这样的一个神经元,相对来说还是比较简单的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值