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 を作成してみます。