this version of the MNIST data setを開く方法を理解したいと思います。例えば、トレーニングセットのラベルファイルtrain-labels-idx1-ubyte
は次のように定義されていますYann LeCunのMNIST IDXファイル形式の解析
TRAINING SET LABEL FILE (train-labels-idx1-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 60000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........
xxxx unsigned byte ?? label
そして私は動作するようですいくつかのコードをオンラインで見つけましたが、それがどのように動作するか理解していない:
with open('train-labels-idx1-ubyte', 'rb') as f:
bytes = f.read(8)
magic, size = struct.unpack(">II", bytes)
print(magic) # 2049
print(size) # 60000
私の理解では、ということですstruct.unpack
は、2番目の引数を2つの4バイト整数のビッグエンディアンのバイト文字列として解釈します(hereを参照)。私は実際bytes
の値を印刷するとき、しかし、私は得る:
b'\x00\x00\x08\x01\x00\x00\xea`'
最初の4バイトの整数を意味なる:
b'\x00\x00\x08\x01'
を最初の2つのバイトは0であり、次のデータがあることを示し符号なしバイト。 0x01
は、ラベルの1次元ベクトルを示します。 (?4)次の3つで何が起こっているのか、私の理解では、これまで正しいと仮定するとバイト:
...\x00\x00\xea`
どのようにこれが60,000に翻訳していますか?
質問のタイトルを変更することをお勧めしますか?IMOそれは誤解を招く。問題は、MNISTデータセットを解析する方法ではなく、ファイルからのバイトシーケンスがどのように整数になるかを理解することです。 –
既にデコードされたMNISTデータセットのバージョンは、http://mnist-decoded.000webhostapp.com/で確認できます。 – SomethingSomething