根据官网 http://yann.lecun.com/exdb/mnist/ 的文件格式的定义
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.
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
idx3-ubyte 的
1.Magic number。即幻数,它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。idx3-ubyte的作者也遵循常例。2051是图片,2049是文本。
2.number of images / number of items 。
3.内容。像素或文字
可以查看文件字节的文本编辑器打开解压出来的train-images.idx3-ubyte
截取前面几行。这些都是16进制的。
第一部分 a为0000 0803。 转为10进制就是
(0000 0803)10 = 2051. 即magic number是2051,图片格式
第二部分为0000 ea60。转为10进制就是6000。说明这个文件包含6000个图片。
第三部分和第四部分,都是 0000 001c。转为10进制就是28,说明图片的长、宽是28.
以上4个部分,所有信息都是占用4个字节(结构图中的type = 32 bit intege)。
第五部分图片的像素位,只占用1个字节(结构图中的type =unsigned byte)。
我们开始数字节文本,在第四部分的后面,一共有152 个“00” (图中的红框),然后是03 12 12 7e 88。这里是16进制。也就是03(0x03),18(0x12),18(0x12),18(0x12),126(0x7e),136(0x88)
因为前面定义了一个图像是28*28,152应该被分解为28*5+12,代表第一张图的前5行的像素都是00,及第6行的前12位像素也是00,第6行的第13位像素是03,14位是18。。。。。
利用网上找的程序,生成第一张的图像如下:
利用windows自带的图像编辑软件取色,鼠标放到x-5 y-12位置,开发依次比较,发现像素符合逻辑。