根据官网 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

mnist文件格式说明-LMLPHP

截取前面几行。这些都是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)。

mnist文件格式说明-LMLPHP

我们开始数字节文本,在第四部分的后面,一共有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。。。。。

利用网上找的程序,生成第一张的图像如下:

mnist文件格式说明-LMLPHP

利用windows自带的图像编辑软件取色,鼠标放到x-5 y-12位置,开发依次比较,发现像素符合逻辑。

mnist文件格式说明-LMLPHP

07-21 16:21