TensorFlow笔记之一:MNIST手写数字识别

     本人刚刚开始接触深度学习不久,对于tensorflow的了解也有限,想通过tensorflow这个框架来学习深度学习及其优化与识别。现在直接进入主题。

    1.手写识别的介绍:

           MNIST手写识别在机器学习中就像c语言中Hello World一样,MNIST数据集是一个机器视觉的数据集,它由几万张28X28像素点构成的手写数字,我们的任务就是向神经网络输入由这些像素点构成的图片,然后神经网络输出图片对应的标签。


2.用TensorFlow实现手写识别

        (1)首先导入手写数据集MNIST:

          

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

       这段代码看不懂没事,它就是TensorFlow内部封装的一个模块,它会自动从网上下载MNIST数据集。 

然后查看mnist这个数据集的情况:

print(mnist.train.images.shape, mnist.train.labels.shape)
print(mnist.test.images.shape, mnist.test.labels.shape)
print(mnist.validation.images.shape, mnist.validation.labels.shape)

     其中mnist.train.images返回训练集的图片信息,minist.test返回测试集的图片信息,mnist.validation.images返回测试集的图片信息。而labels就是图片标签:0-9shape就是矩阵数据的维度,比如  [[2,3],[3,5],[1,5]]通过shape运算就返回(3,2)。

以上运行结果为:

      

       说明了训练集有55000张图片,每张图片由28*28个像素点数据构成。同样测试集有10000张图片构成,验证集由5000个图片构成。我们在训练集上训练数据,在验证集上检验效果并决定何时完成训练,最后在测试机上检验模型的效果。这里我们要注意标签label是一个10维向量,这是一种one_hot格式,标签为0-9之间的数字,如果标签为5,对应label:[0,0,0,0,0,1,0,0,0,0],就是说标签为几就将十位向量的哪一维为位1,其余都置为0.

    

 

       (2) 接下来载入Tensorflow库  ,并定义x,y两个Placeholder,所谓Placehoder,初学者可以理解为一种容器,后面我们将会把上面的训练集数据mnist.train.images及minst.train.labels输入到x,y中

import tensorflow as tf

#定义两个placeholder
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])


      

       (3)然后创建一层简单的神经网络: 

 W = tf.Variable(tf.zeros([784,10]))
 b = tf.Variable(tf.zeros([10]))
prediction = tf.nn.softmax(tf.matmul(x,W)+b)
       这里的参数x将会是输入的图片数据即为[None,784],None就是图片的数量,因为我们训练的时候并不是一张一张图片输入的,因为一张一张输入的效率低,而且会因为一张噪音图片的对整个网络造成巨大影响,正确的训练方法应该是将100张图片组成的数据集[100,784]输入神经网络进行训练(当然,这里的100也可以是其他数值)。然后得到神经网络的输出prediction,这里的prediction就是标签y的预测值,也是一个10维的向量,例如[0.12,0.22,0.21,0.86,0.33,0.01,0.81,0.15,0.54,0.13]




       (4)定义二次损失函数和梯度优化模型,我们的目的就是通过更新神经网络参数W,b来让loss的最小,而更新W,b的操作就是train_step.

      

#二次代价函数
loss = tf.reduce_mean(tf.square(y-prediction))
#使用梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)


    

       (5)计算准确率:

       这里的tf.argmax(y,1),tf.argmax(prediction,1)就是计算10维向量y及prediction中元素的最大值,也就是说预测的标签和实际标签相等时tf.equal返回真,否则返回假。最终预测正确的信息被保存到correct_prediction布尔型列表中,在通过tf.cast转化为float型,然后通过tf.reduce_mean求平均求出准确率。

#结果存放在一个布尔型列表中
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置
#求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))


     

     
         (6)接着就进入正式训练了:

     首先通过init初始化变量,接着for循环训练40个回合。batch_size为每个批次的大小,

n_batch为批次数。在每次训练一个回合后计算出测试集的准确率acc,并输出。



# 每个批次的大小
batch_size = 100
# 计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size

with tf.Session() as sess:
    init = tf.global_variables_initializer()
    sess.run(init)
    for epoch in range(40):
        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) + ",Testing Accuracy " + str(acc))


 TensorFlow笔记之一:MNIST手写数字识别_第1张图片

TensorFlow笔记之一:MNIST手写数字识别_第2张图片

        以上是程序的运行的结果,可以看到最终准确率为91.94%,这并不是很高的准确率,但却是一个入门的经典例子,后面我们将会讲到如何提高准确率.

        全部代码为:

# coding: utf-8

# 载入数据集
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)


print(mnist.train.images.shape, mnist.train.labels.shape)
print(mnist.test.images.shape, mnist.test.labels.shape)
print(mnist.validation.images.shape, mnist.validation.labels.shape)

import tensorflow as tf

# 定义两个placeholder
x = tf.placeholder(tf.float32, [None, 784])
y = tf.placeholder(tf.float32, [None, 10])

# 创建一个简单的神经网络
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([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)

#结果存放在一个布尔型列表中
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置
#求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
# 每个批次的大小
batch_size = 100
# 计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size

with tf.Session() as sess:
    init = tf.global_variables_initializer()
    sess.run(init)
    for epoch in range(40):
        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) + ",Testing Accuracy " + str(acc))







     



下一篇:tensorflow实战之二:MNIST手写数字识别的优化1


你可能感兴趣的:(TensorFlow深度学习)