MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
![【官方文档】一、MNIST机器学习入门 【官方文档】一、MNIST机器学习入门](http://wiki.jikexueyuan.com/project/tensorflow-zh/images/MNIST.png)
它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1。
2、下载,导入数据集
MNIST数据集的官网是Yann LeCun's website。在这里,我们提供了一份python源代码用于自动下载和安装这个数据集。你可以下载这份代码,然后用下面的代码导入到你的项目里面,也可以直接复制粘贴到你的代码文件里面。(这里代码有问题,我添加了as input_data才可以运行)
import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
下载下来的数据集被分成两部分:60000行的训练数据集(mnist.train
)和10000行的测试数据集(mnist.test
)。这样的切分很重要,在机器学习模型设计时必须有一个单独的测试数据集不用于训练而是用来评估这个模型的性能,从而更加容易把设计的模型推广到其他数据集上(泛化)。
正如前面提到的一样,每一个MNIST数据单元有两部分组成:一张包含手写数字的图片和一个对应的标签。我们把这些图片设为“xs”,把这些标签设为“ys”。训练数据集和测试数据集都包含xs和ys,比如训练数据集的图片是 mnist.train.images
,训练数据集的标签是 mnist.train.labels
。
每一张图片包含28X28个像素点。我们可以用一个数字数组来表示这张图片:
![【官方文档】一、MNIST机器学习入门 【官方文档】一、MNIST机器学习入门](http://wiki.jikexueyuan.com/project/tensorflow-zh/images/MNIST-Matrix.png)
我们把这个数组展开成一个向量,长度是 28x28 = 784。如何展开这个数组(数字间的顺序)不重要,只要保持各个图片采用相同的方式展开。从这个角度来看,MNIST数据集的图片就是在784维向量空间里面的点, 并且拥有比较复杂的结构 (提醒: 此类数据的可视化是计算密集型的)。
因此,在MNIST训练数据集中,mnist.train.images
是一个形状为 [60000, 784]
的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。在此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值介于0和1之间。
![【官方文档】一、MNIST机器学习入门 【官方文档】一、MNIST机器学习入门](http://wiki.jikexueyuan.com/project/tensorflow-zh/images/mnist-train-xs.png)
相对应的MNIST数据集的标签是介于0到9的数字,用来描述给定图片里表示的数字。为了用于这个教程,我们使标签数据是"one-hot vectors"。 一个one-hot向量除了某一位的数字是1以外其余各维度数字都是0。所以在此教程中,数字n将表示成一个只有在第n维度(从0开始)数字为1的10维向量。比如,标签0将表示成([1,0,0,0,0,0,0,0,0,0,0])。因此, mnist.train.labels
是一个 [60000, 10]
的数字矩阵。
![【官方文档】一、MNIST机器学习入门 【官方文档】一、MNIST机器学习入门](http://wiki.jikexueyuan.com/project/tensorflow-zh/images/mnist-train-ys.png)