通过官方经典例子——Mnist机器学习,非常简单的看一下tensorflow能做些什么。
MNIST是一个入门级的计算机视觉数据集,包含各种手写数字图片:
它也包含每一张图片对应的标签,用来告诉我们这是数字几。
MNIST包含60000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.test)。在机器学习模型设计时必须有一个单独的测试数据集不用于训练而是用来评估模型性能,从而更加容易把模型推广到其他数据集(泛化)。
每一个MNIST数据单元有两部分:一张手写数字的图片和一个对应的标签。我们把图片设为“xs”,标签设为“ys”。训练集和测试集都包含xs和ys,比如训练集的图片是mnist.train.images,训练集的标签是mnist.train.labels。
mnist.train.images
每一张图片包含28x28像素。我们可以用一个数字数组来表示下面这张图片:
这个数组按一定顺序(不重要,但要保持每个图片都按相同顺序)展开成向量,长度是28x28=784。
因此在MNIST训练集中,mnist.train.images是一个shape为[60000,784]的Tensor,第一个维度用来索引图片,第二个维度数组用来索引像素点。在这个Tensor里的元素,表示某张图片里的某个像素的强度值,值介于0和1之间。形如:
| 0 | 1 | 2 | …… | 222 | 223 | …… | 782 | 783 |
0 | 0 | 0 | 0 | … | 0 | 0 | … | 0 | 0 |
1 | 0 | 0 | 0 | … | 1 | 1 | … | 0 | 0 |
2 | 0 | 0 | 0 | … | 1 | 1 | … | 0 | 0 |
3 | 0 | 0 | 0 | … | .4 | .8 | … | 0 | 0 |
4 | 0 | 0 | 0 | … | .4 | .8 | … | 0 | 0 |
5 | 0 | 0 | 0 | … | .4 | .6 | … | 0 | 0 |
6 | 0 | 0 | 0 | … | 1 | 1 | … | 0 | 0 |
…… | … | … | … | … | … | … | … | … | … |
59997 | 0 | 0 | 0 | … | 1 | 1 | … | 0 | 0 |
59998 | 0 | 0 | 0 | … | .6 | .7 | … | 0 | 0 |
59999 | 0 | 0 | 0 | … | .9 | .8 | … | 0 | 0 |
mnist.train.labels
标签是介于0到9的数字,用来精准描述图片集中对应的数字。为了用于这个教程,我们使标签数据是“one-hot vectors”。一个one-hot向量除了某一位的数字是1以外其余各维度数字都是0。比如,“0”标签将表示成([1,0,0,0,0,0,0,0,0,0])。因此,mnist.train.labels是一个[60000,10]的数字矩阵。形如:
Softmax Regression
下面我们将建立一个机器学习模型,用来预测图片里面的数字。要做到这个,我们可以从一个很简单的数学模型开始——Softmax Regression。
MNIST的每一张图片都表示一个从0到9的数字,我们希望得到给定图片代表每个数字的概率,Softmax就可以用来分配概率。例如我们的模型可能推测出一张包含数字“9”的图片代表数字9的概率是80%,代表它是8的概率是5%(因为8和9的上半部相似),然后给予它代表其他数字的概率更小的值。
Softmax回归分为两步:
1.计算图片的证据(evidence),对图片像素值进行加权求和(在本例中即784个像素值的加权求和),权值与数字类有关,同一个像素点在0-9十个数字类中可能具有多个权值:权值为正时,代表该像素点支持这张图片属于对应数字类,反之该像素点反对对应数字类。
2.用softmax函数将这些证据转换成概率y。
这里的softmax函数是一个激活函数,将我们定义的线性函数的输出转换成我们需要的格式,也就是关于10个数字类的概率分布。
继而每一张图片X,对于10个数字类的吻合度都可以被softmax转换成概率值。
把输入值当成幂指数求值,再正则化结果值,使十个数字类的概率值和为1。