TensorFlow读取数据在简单图像识别中的应用
2019-10-21来学伟
摘 要:本文以MNIST数据库为例,用TensorFlow读取数据集中的数据,并建立一个简单的图像识别模型。同时以TensorFlow为工具,写一个手写体数字识别程序,使用的机器方法是Softmax回归。通过把占位符的值传递给会话,计算后运行梯度下降后,可以检测模型训练的结果,得到预测的标签和实际标签,接下来通过tf.equal函数来比较它们是否相等,并将结果保存到correct_prediction中。最后,用tf.reduce_mean可以计算数组中的所有元素的平均值,相当于得到了模型的预测准确率。该模型识别的准确率超过90%,具有一定的推广价值。
关键词:MNIST数据集;Softmax回归;训练模型
中图分类号:TP181 文献标识码:A 文章编号:2096-4706(2019)12-0098-02
Abstract:This paper takes the MNIST database as an example,uses TensorFlow to read the data in the data set,and establishes a simple image recognition model.At the same time with TensorFlow tool,write a handwritten number recognition program,using Softmax regression. By passing the value of placeholder to the session,the result of model training can be detected after the gradient descent is run after calculation,and the predicted tag and the actual tag can be obtained. Next,the equality function of tf.equal is used to compare whether they are equal,and the result is saved in correct_prediction. Finally,tf.reduce_mean can be used to calculate the average value of all elements in the array,which is equivalent to the prediction accuracy of the model.The recognition accuracy of the modified model is more than 90%,which has a little promotion value.
Keywords:MNIST data set;Softmax regression;training model
0 引 言
拍摄手写的数字而形成的图片以及一些相对应的标记共同组成了MNIST数据集,这种数据集主要包含了两种类型的图像,一种是训练用的图像,还有一种是测试用的图像。在原始的MNIST数据集中,我们用28行28列的矩阵来表示每一张图像。而在TensorFlow中,变量mnist.train.images是训练样本,它的形状为(55000,784)。其中,5000是训练图像的数量,单个图像样本的维数为784,也就是说任何一个图像样本都被一个有784维的向量来表示(28行乘以28列为784维)。
1 Softmax回归
Softmax回归是一个完整的线性的多類分类模型,事实上它是通过Logistic回归直接从模型转化而来的。与之不同的是Logistic回归模型是一种两类分类模型,而Softmax模型则是多类分类模型。在手写数字图像识别问题中,总共有10个不同的类别(即从0到9),我们希望对输入的图像计算它属于每个类别的概率。如属于9的概率为70%,属于1的概率为10%等。最后模型预测的结果就是概率最大的那个类别。
Softmax函数的最核心的作用是对每个不同的类别进行“给分”,然后根据分值转化为合理的概率值。例如:一个样本可能属于三个类别,第一个类别的打分为a,第二个类别的打分为b,第三个类别的打分为c。打分越高代表属于这个类别的概率越高,但是打分本身不代表概率,因为打分的值可以是负数,也可以很大,但概率要求值必须在0~1之间,并且三类的概率加起来应该等于l。那么,如何将(a,b,c)转换成合理的概率值呢?方法就是使用Softmax函数。
假设x是单个样本的特征,W、b是Softmax模型的参数。在MNIST数据集中,x表示输入的图像,它是一个784维的向量,W表示一个矩阵,它的形状为(784,10),b是一个10维的向量,10代表的是类别数。首先,Softmax模型的是通过各个公式来计算各个不同类别的Logit:
Logit=WTx+b
Logit同样是一个10维的向量,它实际上可以看成样本对应于各个类别的“打分”。接下来使用Softmax函数将它转换成各个类别的概率值:
y=Softmax(Logit)
Softmax模型输出的y代表各个类别的概率,还可以直接用下面的式子来表示整个Softmax模型:
y=Softmax(WTx+b)
2 Softmax回归在TensorFlow中的实现
本文对应的程序为softmax_regression.py,在该程序中,使用TensorFlow定义了一个Softmax模型,实现了MNIST数据集的分类。
除了变量和占位符之外,还创建了一个y=tf.nn.softmax(tf.matmul(x,W)+b)[1]。这个y就是一个依赖x、W、b的Tensor。如果要求TensorFlow计算y的值,那么系统首先会获取x、W、b的值,再去计算y的值。
y实际上定义了一个Softmax回归模型,在此可以尝试写出y的形状。假设输入x的形状为(N,784),其中N表示输入的训练图像的数目。W的形状为(784,10),b的形状为(10,1)。那么,Wx+b的形状是(N,10)。Softmax函数不改变结果的形状,所以得到y的形状为(N,10)。也就是说,一个10维的向量表示y的每一行,表示模型预测的样本对应到各个类别的概率[2]。
模型的输出是y,而实际的标签为y_,它们应当越相似越好。在Softmax回归模型中,通常使用“交叉熵”损失来衡量这种相似性[3]。损失越小,模型的输出就和实际标签越接近,模型的预测也就越准确。
在TensorFlow中,这样定义交叉熵损失:
Cross_entropy = \tf. reduce_mean(-tf.reduce_sum(y_*tf.log(y)))
构造完损失之后,下面一步是如何优化损失,让损失减小。这里使用梯度下降法优化损失,定义为:
Train_step=tf.train.GradientDescentOptimizer (0.01).minimize(cross_entropy)
TensorFlow默认会对所有变量计算梯度。在这里只定义了两个变量W和b,因此程序将使用梯度下降法对W,b计算梯度并更新它们的值。tf.train.GradientDescentOptimizer(0.01)中的0.01是梯度下降优化器使用的学习率(Learning Rate)。
在优化前,必须要创建一个会话(Session),并在会话中对变量进行初始化操作:
sess = tf.InteractiveSession()
tf.global_variables_initializer(). run()
有了会话,就可以对变量W,b进行优化了,每次不使用全部训练数据,而是每次提取100个数据进行训练,共训练1000次[4]。batch_xs,batch_ys分别是100个训练图像及其对应的标签。在训练时,需要把它们放入对应的占位符x,y_中,对应的语句是feed_dict={x:batch_xs,y_:batch_ys}。
在会话中,不需要系统计算占位符的值,而是直接把占位符的值传递给会话。与变量不同的是,占位符的值不会被保存,每次可以给占位符传递不同的值。
运行完梯度下降后,可以检测模型训练的结果,模型预测y的形状是(N,10),而实际标签y_的形状是(N,10),其中N为输入模型的样本个数。tf.argmax(y,1)、tf.argmax(y_,1)的功能是取出数组中最大值的下标,可以用来将独热表示以及模型输出转换为数字标签。假设传入四个样本,它们的独热表示y_为(需要通过sess.run(y_)才能获取此Tensor的值):得到了预测的标签和实际标签,接下来通过tf.equal函数来比较它们是否相等,并将结果保存到correct_prediction中。
即第一个样本和最后一个样本预测是正确的,另外两个样本预测错误。可以用tf.cast(correct-prediction,tf.float32)将比较值转换成float32型的变量,此时True会被转换成1,False会被转换成0。
最后,用tf.reduce_mean可以计算数组中的所有元素的平均值,相当于得到了模型的预测准确率,如[1.,0.,0.,1.]的平均值为0.5,即50%的分類准确率。
在程序softmax_regression.py中,传入占位符的值是feed_dict={x:mnist.test.images, y_: mnist.test.labels}。也就是说,使用全体测试样本进行测试,测试图片一共有10000张,运行的结果为0.9185,即91.85%的准确率。因为Softmax回归是一个比较简单的模型。
3 结 论
本文以MNIST数据库为例,用TensorFlow读取数据集中的数据,并建立一个简单的图像识别模型。同时以TensorFlow为工具,写一个手写体数字识别程序,使用的机器方法是Softmax回归模型。该模型识别的准确率超过90%,具有一定的推广价值。
参考文献:
[1] FesianXu.在TensorFlow中自定义梯度的两种方法 [EB/OL].https://blog.csdn.net/LoseInVain/article/details/83108001,2018-10-19.
[2] 束陈.基于智能床垫的睡眠健康状况研究 [D].北京:北京邮电大学,2018.
[3] BVL10101111. Deep Learning 之最优化方法 [EB/OL].https://blog.csdn.net/BVL10101111/article/details/72614711,2017-05-21.
[4] 高桥耕三,周广文.静止卫星之间碰撞的概率及其避免方法 [J].国外导弹技术,1984(2):20-32.
作者简介:来学伟(1981-),男,汉族,河南灵宝人,工程硕士,讲师,主要研究方向:计算机软件开发与研究。