(13) cuda-convnet用MNISTデータを作る(その3)

投稿者: | 2014年7月9日

2,212 views

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

(12) cuda-convnet用MNISTデータを作る(その2) ではMNIST学習データファイルから cuda-convnet入力用の学習データ情報ファイル batches.meta を作成してみた。
今回は学習データ、テストデータそのものを格納する data_batch_n を作成してみる。

cifar10の data_batche_1 の中身はこんな感じ。

>>> import cPickle as cp
>>> d = cp.load(open('data_batch_1'))
>>> d.keys()
['batch_label', 'labels', 'data', 'filenames']
>>> d['batch_label']
'training batch 1 of 5'
>>> d['labels']
[6, 9, 9, 4, 1, 1, 2, 7, 8, 3, 4, 
 ...,
 9, 2, 2, 1, 6, 3, 9, 1, 1, 5]
>>> d['data']
array([[ 59, 154, 255, ...,  71, 250,  62],
       [ 43, 126, 253, ...,  60, 254,  61],
       ...,
       [ 84, 142,  83, ...,  69, 255, 130],
       [ 72, 144,  84, ...,  68, 254, 131]], dtype=uint8)
>>> d['filenames']
['leptodactylus_pentadactylus_s_000004.png', 'camion_s_000148.png', 'tipper_truck_s_001250.png', 'american_elk_s_001521.png',
 ...,
 , 'car_s_002296.png', 'estate_car_s_001433.png', 'cur_s_000170.png']

data_batche_n の中に格納されているデータは4種類ある。
1) batch_label : データファイルの説明
2) labels : 正解ラベル
3) data : 画像データ
4) filenames : 元の画像ファイル名

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

import cPickle as cp
import numpy as np
import Image
import struct

def make_data_batch_all( train_img, train_lbl, test_img, test_lbl, nDataPerBatch ):
    iBatch = 1
    iBatch = make_data_batch( train_img, train_lbl, nDataPerBatch, iBatch, 'training' )
    iBatch = make_data_batch( test_img,  test_lbl,  nDataPerBatch, iBatch, 'testing' )

def make_data_batch( img, lbl, nDataPerBatch, iBatch, batchLabel ):
    fpImg = open( img, 'rb' )
    fpLbl = open( lbl, 'rb' )
    headerImg = fpImg.read( 4 * 4 )
    headerLbl = fpLbl.read( 4 * 2 )

    headerImg_up = struct.unpack('>4i', headerImg)
    headerLbl_up = struct.unpack('>2i', headerLbl)

    nImg  = headerImg_up[1]
    img_w = headerImg_up[2]
    img_h = headerImg_up[3]
    nPixelsOf1img = img_w * img_h

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

    nBatchMax = np.ceil(np.float32(nImg) / np.float32(nDataPerBatch))
    fmtImg  = '%dB' % nPixelsOf1img
    save_data = []
    save_filenames = []
    save_labels = []
    nOutData = 0

    for iImg in range(0,nImg):
        if (iImg % 1000 == 0) or (iImg == nImg-1):
            print 'now processing image #%d' % iImg
        # append data
        data = fpImg.read( nPixelsOf1img )
        data = struct.unpack(fmtImg, data)
        data = np.asarray( data ).astype('uint8')
        save_data.append(data.T.flatten('C'))
        nOutData = nOutData + 1
        # append filenames
        save_filenames.append('')
        # append labels
        data = fpLbl.read(1)
        data = struct.unpack('B', data)
        save_labels.append(data[0])
        # save data_batch_n file
        if ((iImg > 0) and (iImg % nDataPerBatch == nDataPerBatch-1)) or (iImg == nImg-1):
           fname = 'data_batch_%d' % iBatch
           fpOut = open( fname, 'w+' )
           label = '%s batch %d of %d' % (batchLabel, iBatch, nBatchMax)
           save_data = np.reshape(save_data, (nOutData, img_w, img_h))
           save_data = np.uint8(save_data)
           save_data = save_data.swapaxes(0,2)
           save_data = np.reshape(save_data, (img_w * img_h, nOutData))
           dic = {'batch_label':label, 'data':save_data, 'labels':save_labels, 'filenames':save_filenames}
           cp.dump( dic, fpOut )
           fpOut.close()
           iBatch = iBatch + 1
           # clear data
           save_data = []
           save_filenames = []
           save_labels = []
           nOutData = 0
    fpImg.close()
    fpLbl.close()
    return iBatch

作成した data_batch_n を確認してみる。
元画像ファイル名は存在しないので空文字としている。

>>> import cPickle as cp
>>> d = cp.load(open('data_batch_1'))
>>> d.keys()
['batch_label', 'labels', 'data', 'filenames']
>>> d['batch_label']
'training batch 1 of 6'
>>> d['labels']
[5, 0, 4, 1, 9, 2, 1, 3, 1, 4, 3, 5,
 ...,
 7, 2, 7, 3, 7, 4, 0, 5, 8, 6, 9, 7]
>>> d['data']
array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)
>>> d['filenames']
['', '', '', '', '', '', '', '', '',
 '', '', '', '', '', '', '', '', '']

OKそうだ!

次回「(14) cuda-convnetでMNIST自動認識(その1)」では、作成済みの batches.meta data_batch_n を使用して cuda-convnet を動かしてみます。


コメントを残す

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