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そうだ!