MNIST 是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用作深度学习的入门样例。
MNIST 数据集的基本情况
- MNIST 数据集是 NIST 数据集的一个子集,它包含了 60000张图片作为训练数据,10000张图片作为测试数据。
- 在 MNIST 数据集中的每一张图片都代表了 0~9 中的一个数字。图片的大小都为
28
×
28
28\times 28
28×28,且数字都会出现在图片的正中间。
上图左侧显示了一张数字 1 的图片,右侧显示这个图片所对应的像素矩阵。
在 Yann LeCun 教授的网站中(http://yann.lesun.com/exdb/mnist)对 MNIST 数据集做出了详细的介绍。
MNIST 数据集提供了 4 个下载文件:
- 训练数据图片:train-images-idx3-ubyte.gz (9.9 MB, 解压后 47 MB, 包含 60,000 个样本)
- 训练数据标签:train-labels-idx1-ubyte.gz (29 KB, 解压后 60 KB, 包含 60,000 个标签)
- 测试数据图片:t10k-images-idx3-ubyte.gz (1.6 MB, 解压后 7.8 MB, 包含 10,000 个样本)
- 测试数据标签:t10k-labels-idx1-ubyte.gz (5KB, 解压后 10 KB, 包含 10,000 个标签)
这个数据集只提供了训练和测试数据,但为了验证模型训练的效果,一般会从训练数据中划分出一部分数据作为验证(validation)数据。
用 TensorFlow 对 MNIST 数据集做封装
TensorFlow提供了一个类来处理 MNIST数据。这个类会自动下载并转化 MNIST 数据的格式,将数据从原始的数据包中解析成训练和测试神经网络时使用的数据。
# 样例程序
from tensorflow.examples.tutorials.mnist impot input_data
# 载入 MNIST 数据集,如果指定地址 /path/to/MNIST_data 下没有已经下载好的数据,
# 那么 TensorFlow 会自动从上面给出的网址下载数据
mnit = input_data.read_data_sets("/path/to/MNIST_data/",one_hot=True)
# 打印训练数据集大小: 55000
print("Training data size:",mnist.train.num_examples)
# 打印验证数据集大小: 5000
print("Validating data size:",mnist.validation.num_examples)
# 打印测试数据集大小: 10000
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 三个数据集。 - 处理后的每一张图片是一个长度为 784 的一维数组,这个数组中的元素对应图片像素矩阵中的每一个数字(28 x 28 = 784)。
- 像素矩阵中元素的取值范围为[0,1],代表颜色的深浅。其中 0 表示白色背景,1 表示黑色前景。
batch_size = 100
# 从 train 的集合中选取 batch_size 个训练数据。
xs, ys = mnist.train.next_batch(batch_size)
# 输出 X shape:(100,784)
print("X shape:",xs.shape)
# 输出 Y shape:(100,10)
print("Y shape:",ys.shape)
解析:
input_data.read_data_sets
函数生成的类还提供了mnist.train.next_batch
函数,它可以从所有的训练数据中读取一小部分作为一个训练 batch。
运行数据封装程序示例
使用 Google 云端硬盘中 colaboratory 跑程序。
运行结果:
Extracting ./data/train-images-idx3-ubyte.gz
Extracting ./data/train-labels-idx1-ubyte.gz
Extracting ./data/t10k-images-idx3-ubyte.gz
Extracting ./data/t10k-labels-idx1-ubyte.gz
Training data size: 55000
Validating data size: 5000
Testing data size: 10000
Example training data: [0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0.3803922 0.37647063 0.3019608
0.46274513 0.2392157 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.3529412
0.5411765 0.9215687 0.9215687 0.9215687 0.9215687 0.9215687
0.9215687 0.9843138 0.9843138 0.9725491 0.9960785 0.9607844
0.9215687 0.74509805 0.08235294 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0.54901963 0.9843138 0.9960785 0.9960785
0.9960785 0.9960785 0.9960785 0.9960785 0.9960785 0.9960785
0.9960785 0.9960785 0.9960785 0.9960785 0.9960785 0.9960785
0.7411765 0.09019608 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0.8862746 0.9960785 0.81568635 0.7803922 0.7803922 0.7803922
0.7803922 0.54509807 0.2392157 0.2392157 0.2392157 0.2392157
0.2392157 0.5019608 0.8705883 0.9960785 0.9960785 0.7411765
0.08235294 0. 0. 0. 0. 0.
0. 0. 0. 0. 0.14901961 0.32156864
0.0509804 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0.13333334 0.8352942 0.9960785 0.9960785 0.45098042 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.32941177
0.9960785 0.9960785 0.9176471 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0.32941177 0.9960785 0.9960785
0.9176471 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0.4156863 0.6156863 0.9960785 0.9960785 0.95294124 0.20000002
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.09803922
0.45882356 0.8941177 0.8941177 0.8941177 0.9921569 0.9960785
0.9960785 0.9960785 0.9960785 0.94117653 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0.26666668 0.4666667 0.86274517 0.9960785 0.9960785
0.9960785 0.9960785 0.9960785 0.9960785 0.9960785 0.9960785
0.9960785 0.5568628 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0.14509805 0.73333335 0.9921569
0.9960785 0.9960785 0.9960785 0.8745099 0.8078432 0.8078432
0.29411766 0.26666668 0.8431373 0.9960785 0.9960785 0.45882356
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0.4431373 0.8588236 0.9960785 0.9490197 0.89019614 0.45098042
0.34901962 0.12156864 0. 0. 0. 0.
0.7843138 0.9960785 0.9450981 0.16078432 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0.6627451 0.9960785
0.6901961 0.24313727 0. 0. 0. 0.
0. 0. 0. 0.18823531 0.9058824 0.9960785
0.9176471 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0.07058824 0.48627454 0. 0.
0. 0. 0. 0. 0. 0.
0. 0.32941177 0.9960785 0.9960785 0.6509804 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.54509807
0.9960785 0.9333334 0.22352943 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0.8235295 0.9803922 0.9960785 0.65882355
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0.9490197 0.9960785 0.93725497 0.22352943 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0.34901962 0.9843138 0.9450981
0.3372549 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0.01960784 0.8078432 0.96470594 0.6156863 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0.01568628 0.45882356
0.27058825 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. ]
Example training data label: [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
X shape: (100, 784)
Y shape: (100, 10)