(12) cuda-convnet用MNISTデータを作る(その2)

投稿者: | 2014年7月8日

2,576 views

この記事は最終更新から 1433日 が経過しています。

(11) cuda-convnet用MNISTデータを作る(その1) ではMNISTデータファイルを pythonでロードする手順を確認した。今回はロードしたデータから cuda-convnet用 batches.meta ファイルを作成してみる。

cifar10の batches.meta の中身はこんな感じ。

>>> import cPickle as cp
>>> meta = cp.load(open('batches.meta'))
>>> meta.keys()
['num_cases_per_batch', 'label_names', 'num_vis', 'data_mean']
>>> meta['num_cases_per_batch']
10000
>>> meta['label_names']
['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
>>> meta['num_vis']
3072
>>> meta['data_mean']
array([[ 134.45458984],
       [ 134.22865295],
       [ 134.84976196],
       ...,
       [ 115.09417725],
       [ 115.32595062],
       [ 115.7903595 ]], dtype=float32)
>>> meta['data_mean'].size
3072
>>> im['data_mean'].ndim
2

batches.metaの中に格納されているデータは4種類ある。
1) num_cases_per_batch : 1バッチの画像データ数
2) label_names : ラベル文字列のリスト
3) num_vis : 1画像のデータ数(=ピクセル数×チャネル数)
4) data_mean : 全画像のピクセル×チャネルごとの平均値

作成した batches.meta作成関数はこちら。
拙いPythonスキルで試行錯誤しながら書いたので無駄がいっぱいあるかも…

def make_batches_meta( trainDataFilePath, nDataPerBatch ):
    infile = open( trainDataFilePath, 'rb' )
    header = infile.read( 4 * 4 )
    header_up = struct.unpack('>4i', header)   # > : big endian, 4i: 4 x int(32bit)
    nImg  = header_up[1]
    img_w = header_up[2]
    img_h = header_up[3]
    nPixelsOf1img = img_w * img_h

    print '# of image             : %d' % nImg
    print 'image width            : %d' % img_w
    print 'image height           : %d' % img_h
    print '# of pixels in a image : %d' % nPixelsOf1img

    # calculate average
    meanData = np.zeros(nPixelsOf1img, dtype=np.float32)
    for i in range(0,nImg):
        data = infile.read( nPixelsOf1img )
        fmt  = '%dB' % nPixelsOf1img
        data_up = struct.unpack(fmt, data)
        meanData = meanData + data_up
    meanData = meanData / nImg
    meanData = np.float32(meanData.reshape((nPixelsOf1img,1)))
    infile.close()

    # save batches.meta
    label_names = ['0','1','2','3','4','5','6','7','8','9']
    num_vis     = img_w * img_h
    meanData = np.reshape(meanData, (img_w, img_h))
    #meanData = meanData.swapaxes(0,1)
    meanData = meanData.T.flatten('C')
    meanData = np.reshape(meanData,(nPixelsOf1img,1))
    dic = {'num_cases_per_batch':nDataPerBatch, 'label_names':label_names, 'num_vis':num_vis, 'data_mean':meanData}
    fp = open('./batches.meta','w+')
    cp.dump( dic, fp )
    fp.close()

作成した batches.meta を確認してみる。

[user@linux]$ python
>>> import cPickle as cp
>>> im = cp.load(open('batches.meta'))
>>> im
{'num_cases_per_batch': 10000, 'label_names': ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], 'num_vis': 784, 'data_mean': array([[  0.00000000e+00],
       [  0.00000000e+00],
       [  0.00000000e+00],
       ...,
       [  0.00000000e+00],
       [  0.00000000e+00],
       [  0.00000000e+00]], dtype=float32)}

OKそうだ!

次回「(13) cuda-convnet用MNISTデータを作る(その3)」では、学習データ、テストデータそのものを格納する data_batch_n を作成してみます。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です