介绍
当我们开始学习编程的时候,第一件事往往是学习打印Hello World!
。而MNIST是一个入门级的计算机视觉数据集就是深度学习中的Hello World
,MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1。
数据集下载地址:http://yann.lecun.com/exdb/mnist/
数据集内容:
- train-images-idx3-ubyte 训练数据图像 (60,000)
- train-labels-idx1-ubyte 训练数据label
- t10k-images-idx3-ubyte 测试数据图像 (10,000)
- t10k-labels-idx1-ubyte 测试数据label
每一张图片包含28像素X28像素。我们可以用一个数字数组来表示这张图片:
我们的任务就是训练一个机器学习模型用于预测图片里面的数字。
问题
一切看起来很美好,但当我下载完数据集后一看,傻眼了:
说好的图像呢,说好的标签呢。原来,为了方便解析,数据集被保存为二进制的格式,并不是我们熟悉的图片格式和文本格式,因此我们不能直观的看到它到底长什么样。对于初学者来说,神经网络已经是一个很玄的东西了,现在连数据集都是个黑盒子,让人怎么入门呢。本着眼见为实的精神,我决定使用Python把数据集还原为原始的格式。
解决
主要使用struct
读取二进制文件,然后保存为相应格式的文件。
使用到的包:
- struct
- numpy
- PIL
- os
- shutil
转换图片
1 | # 转换图片 |
因为训练图片有60000张,于是加入一个参数指定转换多少张,并不一定要全部转换。1
read_image('data/train-images.idx3-ubyte', 'train', 10)
执行上面的代码,会在当前目录新建一个train
目录,里面有前10张图片:
转换标签
1 | # 转换 label |
标签转换相对比较简单,只需读取二进制文件并转存为txt即可。1
read_label('data/train-labels.idx1-ubyte', 'train_labels.txt')
执行上面的代码,会在当前目录生成一个train_labels.txt
,里面就是所有图片对应的数字:
看到图片和标签,可以直观的看到图片和数字是如何对应的,非常有助于理解后面机器学习的算法。
全部代码
1 | import struct |