【代码】详解IDX-Ubyte文件格式 及 python读取

文件下载地址:

官网

http://yann.lecun.com/exdb/mnist/

百度云

原来的链接挂掉了,这是最新的链接

链接: https://pan.baidu.com/s/17XEAenW2RejJ1sQ_3cC5Eg 提取码: kfkx

复制这段内容后打开百度网盘手机App,操作更方便哦

1.Mnist数据集包括四个文件

train-images-idx3-ubyte.gz:  训练集图像(9912422 bytes)
train-labels-idx1-ubyte.gz:  训练集标签 (28881 bytes)
t10k-images-idx3-ubyte.gz:   测试集图像 (1648877 bytes)
t10k-labels-idx1-ubyte.gz:   测试集标签 (4542 bytes)

gz是压缩文件,首先要解压这些文件。

idx3的数字表示数据维度。也就是图像为3维,标签维1维。

图像的3个维度分别为:训练集图像28pix*28pix*60000张   测试机 28pix*28pix*10000张。

 

2 Mnist的格式解析

拿官网上的训练集标签来分析:

【代码】详解IDX-Ubyte文件格式 及 python读取_第1张图片

首先,offset是偏置,实际上就是一个标号,记录这个字段起始位置在这串数据的第几个字节。拿第一行举例子,从0000的位置开始,(这个0000是16进制,每个16进制位表示是4bit),从0000开始到0003结束,实际上是4字节 = 32bit,所以可以看到这个offset字段的数据类型type是32位整数。这个字段数据为0000 0801 用十进制来说就是2049。description是这个字段数据的含义,这个字段存放的801(也就是十进制2049),意思是魔数(magic number),大概就是确定数据类型的一个标志,是随便设定的,有兴趣的贴个知乎链接,讲魔数的。

用sublime打开这个ubyte文件。

第一个数据为32位,读取前32bit,00000801(即8*4bit=32bit)

第二个数据也是32位,继续读取32bit,0000ea60(十进制60000)

从第三个数据开始,就是真正要用的标签了。类型是无符号数,是1个字节,往后读两个数字,即05.

可以看出这一行数据数据存放的标签以此为5,0,4,1,9,0,2,1,3

 

 

对于图像数据

【代码】详解IDX-Ubyte文件格式 及 python读取_第2张图片

唯一的区别在于,每个无符号数表示一个像素,可以根据description看出,图像是28*28的,往后每28*28个像素位为一幅图像。读取出来是一行数据,之后恢复成方形矩阵就可以了。

 

3.Mnist的读取

代码可以在百度云直接下载~

你可能感兴趣的:(神经网络)