TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nxcxl88/article/details/52098522

    TensorFlow教程的第一章“MNIST机器学习入门”很简单,用了一个很简单的网络,实现了MNIST样本训练。

    教程链接:http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html

    下面这些内容主要是解释这个教程中不是特别明确的地方。

1. 怎样理解MNIST

MNIST的全称是Mixed National Institute of Standards and Technology database,是一系列带标记的数字图片。原始的NIST数据集的训练集是美国人口普查局的雇员的笔迹,而验证集是采集自美国中学生的笔迹。所以从机器学习的角度看,这是一种不太合理的样本采集。因此Lecun在进行卷积神经网络的研究时候从原始的NIST两个数据集中选择并重新混合形成新的训练集和验证集,也就是现在的MNIST。MNIST的图片一般都是28*28的图片,每个像素值进行了归一化,使得其在0-1范围内,不过也有部分数据集把它们又恢复到0-255,每个数字图片都有对应的标记。MNIST的训练集一共有60000个样本,而验证集有10000个样本。

2.怎样理解权值和Softmax

“MNIST机器学习入门”里面,没有用卷积神经网络,而是用了一个全连接神经网络+Softmax输出层。

MNIST的一幅图片是28*28,因此一共有784个像素值,在第一个例子里面,我们就直接就考虑用这784个数字得出正确的数字结果。最简单的考虑,我们要对这个784个数字进行加权求和,然后加点偏置,然后衡量一下得出的结果,看到底和哪个数字最像。那么这个加权加偏移的结构就是全连接神经网,而这个衡量结果的过程就是Softmax。实际的运算是将784个像素输入加权,并且用不同的权值加权10次(因为有0-9一共10个数字),得到10个不同的结果,最后使用Softmax进行结果的输出。

Softmax的公式如下,这个Xi是得到的10个不同的结果。

因此,最终得到的10个输出都会有一个概率值,这个概率值处于0-1之间,而且10个输出相加等于1。

将整个神经网络表示成一个表达式,就是:

其中W是权值,b是偏移

3.怎样训练这个网络?

按照TensorFlow的封装,训练这个例子中的神经网络只是几句话的事情。

为了衡量目前神经网络中的权值和偏移是否合理,我们可以定义交叉熵。交叉熵的公式是:

y 是我们预测的概率分布, y' 是实际的分布,比如我这个数字是2,那么我实际的分布就应该是(0,0,1,0,0,0,0,0,0,0)。而神经网输出的结果即预测的分布y可能是(0.01,0.05,0.5,0.05,0.04.......),那么交叉熵就是-log(0.5)>0,因此如果神经网络的性能约好,那么交叉熵就会越小,最终接近于0. 在这个例子的训练中,使用的是随机梯度下降法结合反向传播进行参数训练。随机梯度下降可以看Andrew NG的机器学习讲义,也可以百度一篇文章。不过TensorFlow封装的比较好,所以只需要3句话就可以训练1000次,100是每次随机选择100个样本进行训练:

<code class="language-python">for i in range(1000):</code>  
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

TensorFlow教程第一章用了一个十分简单的网络结构,重点讲了如何设定网络,如何训练,如何计算正确率。在下一章里面,教程会介绍如何用复杂一些的架构,取得更好的训练效果。




猜你喜欢

转载自blog.csdn.net/nxcxl88/article/details/52098522