MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
它包含60000张训练图片,10000张测试图片,,每张图片都代表0-9的数字。图片包含28像素X28像素。我们可以用一个数字数组来表示这张图片:
把这个数组展开成一个向量,长度是 28x28 = 784。如何展开这个数组(数字间的顺序)不重要,只要保持各个图片采用相同的方式展开,从这个角度来看,MNIST数据集的图片就是在784维向量空间里面的点。因此,在MNIST训练数据集中,mnist.train.images 是一个形状为 [60000, 784] 的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。在此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值介于0和1之间。
相对应的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,784] 的数字矩阵。
Tensorflow提供了一个类来处理MNIST数据,该类会自动下载并转化MNIST数据格式,将数据从原始的数据包中解析成训练和测试神经网络时使用的格式。
from tensorflow.examples.tutorials.mnist import input_data
#载入MNIST数据集,前一个参数为数据存放路径,后一个参数表示one-hot vectors
mnist = input_data.read_data_sets('set your path',one_hot=True)
print('Training data size',mnist.train.num_examples)
print('Validating data size',mnist.validation.num_examples)
print('Testing data size',mnist.test.num_examples)
print('Example training data',mnist.train.images[0])
print('Example training data label',mnist.train.labels[0])
input_data.read_data_sets函数将MNIST数据集分为train、validation和test,其中train有55000张图片,validation有5000,两者组成训练集,而test有10000张图片。因为神经网络的输入是一个特征向量,所以将一张二维图片的像素矩阵放到一个一维数组中可以方便Tensorflow将图片的像素矩阵提供给神经网络的输入层。像素矩阵中元素的值域为[0,1],它代表了颜色的深浅。其中0表示白色背景,1则为黑色前景。此外,为方便使用随机梯度下降算法,input_data.read_data_sets函数生成的类还提供mnist.train.next_batch函数,以从训练数据中读取一小部分作为训练batch。
batch_size = 100
#从train中取出100个训练数据
xs,ys = mnist.train.next_batch(batch_size)
#X为100*784,Y为100*10
print('X shape: ',xs.shape)
print('Y shape: ',ys.shape)