Почему анализатор Python MNIST жестко кодирует значение «2051»? - PullRequest
0 голосов
/ 09 января 2019

Переменная extract_path - это обучающий файл mnist, и затем я использую модуль 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 голосов
/ 09 января 2019

Это не имеет ничего общего с 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_images, rows и cols соответственно.

Использование «магических чисел» в этом контексте согласуется с общим значением «магических чисел» в контексте форматов файлов, где они являются константами, используемыми libmagic (инструментом, который используется утилитой file). использует, чтобы угадать типы файлов). Лучше практиковаться для вновь разработанных форматов - использовать правильные UUID, а не короткие целые числа, которые гораздо чаще встречаются случайно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...