MNISTデータセット解析

5668 ワード

公式サイト

  • MNISTデータセットは手書きデータセットで、簡単に言えばこのようなものが山
  • です.
  • MNISTの公式サイトのアドレスはMNISTです.公式サイトを読むことで、このデータセットは4つの部分から構成されています.それぞれです.すなわち、トレーニング画像セット、トレーニングラベルセット、テスト画像セット、テストラベルセットである.これは実際には普通のテキストファイルや画像ファイルではなく、圧縮ファイルであり、ダウンロードして解凍していることがわかります.私たちが見ているのはバイナリファイルです.その中で、訓練画像セットの内容部分はこのようなバイナリデータをどのように解釈しますか.ここでは公式サイトの言い方だけに対して、訓練写真集と訓練ラベル集を解説し、テスト集は同じ理屈です.
  • 訓練ラベルセットについて、公式サイトには公式サイトの説が陳述されている.訓練セットには60000の用例がある.つまり、このファイルには60000のラベル内容が含まれており、各ラベルの値は0から9の間の数である.私たちのトレーニングラベルセットに戻って、上記のように、私たちはまず各属性の意味を解析し、offsetはバイトオフセット量、つまりこの属性のバイナリ値のオフセットがいくらであるかを表します.typeはこの属性の値のタイプを表します.valueはこの属性の値がいくらであるかを表します.descriptionはこれに対する説明です.そこで、ここでは上記の説明をします.「0バイト目から32ビットの整数があり、その値は0 x 0000801で魔数です.4バイト目から32ビットの整数があり、その値は60000で、データセットの数を表しています.8バイト目からunsigned byteがあり、その値は???で、ラベル値です......」.私たちは今、私たちが見たファイルについて説明します.図を見て、まずsublimeでこのファイルを開くことを知っています(解凍されています).16進数で表されています.つまり、中の数字は4桁を表し、2つの数字は1バイトを表しています.まず、オフセット量が0バイトの0000 0801が魔数を表しているのを見てみましょう.その値は0000 0801です.ここでは魔数とは何かを補足します.実は、このファイルがMNISTのtrain-labelsであるかどうかを判断するための検査数です.idx 1-ubyteファイル;次にオフセット量が4バイトの0000 ea60を見下ろすと、上記のように容量数、すなわち60000を表すべきであり、60000の16進数はea 60であり、満足していることがわかります.オフセット量が8バイトの05を見ると、私たちのラベル値を表しています.つまり、最初の画像のラベル値は5で、後ろもこのように推定されています.
  • 次に訓練写真集を見てみましょう.同じように公式サイトからその解説は上のラベルファイルと似ていますが、ここでは補足説明します.MNIST画像セットでは、すべての画像が28です.×28、つまり画像ごとに28があります×28ピクセル上記の画像を見てみると、train-images-idx 3-ubyteファイルのオフセット量が0バイトの4バイトの数が0000 0803で魔数を表しています.次に0000 ea60の値が60000で容量を表し、次に8バイト目から4バイト数があり、値は28、つまり0000 001cで、各ピクチャの行数を表す.12バイト目から4バイト数があり、値も28、つまり0000 001cは各ピクチャの列数を表す.16バイト目から私たちの画素値で、画像で話します.さらに、784バイトごとに1枚の画像を表し、ファイルのバイナリコンテンツが私たちが分析したのと同じであることがわかります.
  • 補足説明:図には、「Most Significant Bit first」という名前のMSB firstが表示され、LSB first、「Least Significant Bit」と呼ばれています.MSB firstとは、最大有効ビット優先、すなわち、我々の大端ストレージを指し、LSBは小端ストレージに対応する.大端、小端については
  • 参照

    コードが来ても

  • 上記の解析によって、MNISTのファイルの組織と内容についてすでに理解していると信じています.次に、ファイルの内容を読み取ります.
  • 自作タイプ
  • は主にpythonのnumpyを用いてデータ型変換とstructモデルを用いてバイナリファイルのフォーマット読み出しを行う.structについてはstructを参照することができる.コアコードは次の
  • です.
    _tag = '>' # 
    _twoBytes = 'II' # 
    _fourBytes =  'IIII' # 
    _pictureBytes =  '784B' # 784 ,28*28
    _lableByte = '1B' # 1 
    _msb_twoBytes = _tag + _twoBytes
    _msb_fourBytes = _tag +  _fourBytes
    _msb_pictureBytes = _tag + _pictureBytes
    _msb_lableByte = _tag + _lableByte
    
    def getImage(filename = None):
        binfile = open(filename, 'rb') # 
        buf = binfile.read() # 
        binfile.close()
        index = 0 # 
        numMagic, numImgs, numRows, numCols = struct.unpack_from(_msb_fourBytes, buf, index)
        index += struct.calcsize(_fourBytes)
        images = []
        for i in xrange(numImgs):
            imgVal  = struct.unpack_from(_msb_pictureBytes, buf, index)
            index += struct.calcsize(_pictureBytes)
    
            imgVal  = list(imgVal)
            #for j in range(len(imgVal)):
            #   if imgVal[j] > 1:
            #       imgVal[j] = 1
            images.append(imgVal)
        return np.array(images)
    
    def getlable(filename=None) :
        binfile = open(filename, 'rb')
        buf = binfile.read() # 
        binfile.close()
        index = 0 # 
        numMagic, numItems = struct.unpack_from(_msb_twoBytes,buf, index)
        index += struct.calcsize(_twoBytes)
        labels = []
        for i in range(numItems):
            value = struct.unpack_from(_msb_lableByte, buf, index)
            index += struct.calcsize(_lableByte)
            labels.append(value[0]) # 
        return np.array(labels)
  • pythonで処理されたパッケージを使用
  • は、主に処理済みの圧縮パケットmnistを用いる.pkl.gzは、cPickleモジュールを用いてpklファイルから処理済みのファイル内容をロードする.このデータセットについては、ロードが完了すると、3つの配列が返されます.これはmnist公式サイトとは異なり、モデルのトレーニングを容易にするため、mnist.pklは60000個の訓練データを50000個の訓練データと10000の補正データセットに分けた.各配列は2つの部分の内容から構成され、1つのピクチャ配列と1つのラベル配列であり、ピクチャ配列の各行は1つのピクチャの画素を表し、784の要素(28)がある.×28);コアコードは次の
  • です.
    def  load_data(filename = None):
        f = gzip.open(filename, 'rb')
        training_data, validation_data, test_data = cPickle.load(f)
        return (training_data, validation_data, test_data)
  • すべてのコードアドレスmnist