一、简介MNIST
TensorFlow编程学习的入门一般都是基于MNIST手写数字数据集和Cifar(包括cifar-10和cifar-100)数据集,因为它们都比较小,一般的设备即可进行训练和测试。而相比之下虽然基于ImageNet分类数据集的实验更具有意义,更加权威,但由于ImageNet数据集实在太大,不便于入门的童靴直接上手操作。所以接下来,我将只讲一下如何用TensorFlow导入MNIST数据集。
1、MNIST数据集简介
MNIST 数据集的官网是 Yann LeCun's website。下载下来的数据集被分成两部分:60000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.test).这样的切分很重要,在机器学习模型设计时必须有一个单独的测试数据集不用于训练而是用来评估这个模型的性能,从而更加容易把设计的模型推广到其他数据集上(泛化)。
我们把这个数组展开成一个向量,长度是 28x28 = 784.如何展开这个数组(数字间的顺序)不重要,只要保持各个图片采用相同的方式展开.从这个角度来看,MNIST数据集的图片就是在784维向量空间里面的点, 并且拥有比较复杂的结构 (提醒: 此类数据的可视化是计算密集型的)。每一张图片包含28像素X28像素.我们可以用一个数字数组来表示这张图片:
因此,在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, 10] 的数字矩阵.
2、使用tensorflow导入已经下载好的mnist数据集
导入相应的库,并且导入数据(当前文件夹下没有MNIST库的话会自动下载);
from tensorflow.examples.tutorials.mnist import input_data
#读取数据
mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)
运行结果:
Extracting MNIST_data\train-images-idx3-ubyte.gz
Extracting MNIST_data\train-labels-idx1-ubyte.gz
Extracting MNIST_data\t10k-images-idx3-ubyte.gz
Extracting MNIST_data\t10k-labels-idx1-ubyte.gz
让我们看一下数据集里面的数据情况:
print("MNIST的数据类型是:",type(mnist))
print("训练数据集的个数是:",mnist.train.num_examples)
print("测试数据集的个数是:",mnist.test.num_examples)
运行结果:
MNIST的数据类型是: <class 'tensorflow.contrib.learn.python.learn.datasets.base.Datasets'>
训练数据集的个数是: 55000
测试数据集的个数是: 10000