为什么Python MNIST解析器将值“ 2051”硬编码?

时间:2019-01-09 13:47:20

标签: python numpy gzip

变量extract_path是一个简单的训练文件,然后我使用gzip模块从该文件中提取数据,令我感到困惑的是变量magic的值也许是2051,这是什么呢? 2051意味着什么?

变量bytestream的第二个问题,它读四次,我不知道它是怎么做的?


    def _read32(bytestream):
        dt = np.dtype(np.uint32).newbyteorder('>')
        return np.frombuffer(bytestream.read(4), dtype=dt)[0]


    with open(extract_path, 'rb') as f:
        with gzip.GzipFile(fileobj=f) as bytestream:
             magic = _read32(bytestream)
             if magic != 2051:
                raise ValueError('Invalid magic number {} in file: {}'.format(magic, f.name))
             num_images = _read32(bytestream)
             rows = _read32(bytestream)
             cols = _read32(bytestream)
             buf = bytestream.read(rows * cols * num_images)
             data = np.frombuffer(buf, dtype=np.uint8)
             data = data.reshape(num_images, rows, cols)

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

这与gzip Python无关。它是用于训练MNIST数据库中的设置图像文件的文件格式规范的一部分。

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

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

因此,值2051用于将训练集图像文件与其他文件类型(例如使用幻数2049的标签文件)区分开来。

可比较的是,魔数后面还有三个4字节/ 32位值,分别表示图像数,行数和列数。因此,随后的_read32()调用将消耗该数据,并将值分别放入变量num_imagesrowscols中。

在此上下文中使用“幻数”与文件格式中“幻数”的一般含义是一致的,在文件格式中,这些是libmagic({{1} }实用工具来猜测文件类型)。对于新开发的格式,更好的做法是使用适当的UUID而不是短整数,后者更容易偶然出现。