人工知能と競プロやってくブログ

深層学習・機械学習・AI・atcoder・競技プログラミングについて調べてやってみたことをまとめるブログです

MNISTデータセットのオリジナルファイルをPythonで読み込んでみる

MNIST_READ_FROM_ORIGINAL_FILES

MNISTデータセットの読み込みはkerasの読み込み関数に頼ってたんですが、オリジナルのフォーマットを知る必要があったんで作ってみました。

データセットのダウンロード

yann.lecun.com

ここからダウンロード。

訓練用画像ファイル:train-images-idx3-ubyte.gz: training set images (9912422 bytes)
訓練用ラベルファイル:train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
テスト用画像ファイル:t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
テスト用ラベルファイル:t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)
がダウンロードできる。

gzで圧縮されているので、ダウンロードしたら展開する。

データセットのファイルフォーマット

上記の配布元のサイトにデータフォーマットが書いてある。
以下、テスト用データのフォーマットを転載。
訓練用データも入っているデータ数が60000個な点が違うだけで、フォーマットは同じ。

ラベルファイルのフォーマット

[offset] [type] [value] [description]
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 10000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........ ........ ........ ........
xxxx unsigned byte ?? label

The labels values are 0 to 9.

イメージファイルのフォーマット

[offset] [type] [value] [description]
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 10000 number of items
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0016 unsigned byte ?? pixel
........ ........ ........ ........
xxxx unsigned byte ?? label

Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).

ソースコード

上記のファイルフォーマットに従って、ファイルをパースして読み込むコードを書いてみたのが、次のもの。
ファイルとしては、テスト用ラベルファイル t10k-labels-idx1-ubyte、テスト用画像ファイル t10k-images-idx3-ubyteを読み込んでいる。

参考

次のサイトを参考にさせてもらいました。
ありがとうございます!

docs.python.org

sites.google.com