CLASS torchvision.datasets.MNIST(root: str, train: bool = True, transform: Optional[Callable] = None, target_transform: Optional[Callable] = None, download: bool = False)
- root (string): 表示数据集的根目录,其中根目录存放MNIST/processed/training.pt和MNIST/processed/test.pt的子目录
- train (bool, optional): 如果为True,则从training.pt创建数据集,否则从test.pt创建数据集
- download (bool, optional): 如果为True,则从internet下载数据集并将其放入根目录。如果数据集已下载,则不会再次下载
- transform (callable, optional): 接收PIL图片并返回转换后版本图片的转换函数
target_transform (callable, optional): 接收PIL接收目标并对其进行变换的转换函数
文件下载地址:官网
http://yann.lecun.com/exdb/mnist/
Mnist数据集包括4个文件
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个维度分别为:
训练集图像28pix28pix60000张
测试集图像28pix28pix10000张
MNIST的格式解析
首先,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,因为里面的数是16进制的,即一位代表4bit
第二个数据也是32位,接着读32bit, 0000ea60(十进制为60000,即训练集有60000张图片)
从第三个数据开始,就是真正要用的标签了。类型是无符号数,是1个字节,即8bit,往后读两个数字,即05,可以看出这一行数据存放的标签为5, 0, 4, 1, 9, 2, 1, 3
对于图像数据文件
第一个数据为32位,读取前32bit, 00000803,因为里面的数是16进制的,即一位代表4bit
第二个数据也是32位,接着读32bit, 0000ea60(十进制为60000,即训练集有60000张图片)
第三个数据也是32位,接着读32bit, 0000001c(十进制为28,即图片的行为28pix)
第四个数据也是32位,接着读32bit, 0000001c(十进制为28, 即图片的列为28pix)
每个无符号数表示一个像素,可以根据description看出,图像是2828的,往后每2828个像素位为一幅图像。读取出来是一行数据,之后恢复成方形矩阵就可以了