上一次说了些来自官网,无聊透顶的tf介绍,这次开始研究MNIST。识别之前先来关注一下MNIST的文件格式。
MNIST的数据集可以从 官网 处下载,一共包含4个文件(点击下面的文件名可直接下载)
train-images-idx3-ubyte.gz: training set images (9912422 bytes)
train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)
是gz格式的文件,按理来说应该使用gzip来解压的,在ubuntu中用下面的命令依次解压文件
gzip -b xxxxx.gz
解压后得到了四个不带后缀名的文件,这些便是MNIST的原始数据了,接下来我们来解析这些文件,并且把他们变成bmp文件可以直观地去看看这传说中来自各个年龄段的不同的人的手写体。
官网说明了这些文件的格式,(搬砖先)
- TRAINING SET LABEL FILE (train-labels-idx1-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 60000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........
xxxx unsigned byte ?? label
The labels values are 0 to 9.
可以看到train-labels-idx1-ubyte文件开头是一个magic number,大小是2049,是一个4字节的数据,这个魔数的作用是拿来标记这个文件是MNIST数据集的train-labels-idx1-ubyte文件。
接下来又是一个4字节的数,大小为60000,表明了这个文件包含了60000个标签
之后便是60000个无符号字节,values是0到9,对应了image文件中各个图像中写了哪个数字,这里要读取这个数据可以用C语言中的fread(*buf, size, cnt, *FILE)进行读取
- TRAINING SET IMAGE FILE (train-images-idx3-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 60000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........
xxxx unsigned byte ?? pixel
Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).
这个文件是包含了image数据的文件,从格式中可以解读出,它的魔数是2051,有60000个image。与label文件不同的是第8到11这四个字节包含的是图像数据的宽,12到15字节是图像数据的高,从第16字节开始的数据便是这些图像的数据了,由于每个图像是28*28,所以每个图像需要784字节来存储,如果要将它保存为bmp图像,向下读28*28个字节即可。
- TEST SET LABEL FILE (t10k-labels-idx1-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 10000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........
xxxx unsigned byte ?? label
The labels values are 0 to 9.
test的label跟train的label具有相同的格式,就不再赘述。
- TEST SET IMAGE FILE (t10k-images-idx3-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 10000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........
xxxx unsigned byte ?? pixel
test的image跟train的image也具有相同的格式,这里也不再赘述,不同的就是test的数据集只有10000个。
MNIST的数据集格式很简单,按照官方的格式解析就是了,接下来便是把数据写到bmp文件里面去了。。。。。