MNISTデータセットのオリジナルファイルをPythonで読み込んでみる
MNISTデータセットの読み込みはkerasの読み込み関数に頼ってたんですが、オリジナルのフォーマットを知る必要があったんで作ってみました。
データセットのダウンロード
ここからダウンロード。
訓練用画像ファイル: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を読み込んでいる。
参考
次のサイトを参考にさせてもらいました。
ありがとうございます!