2,919 views
この記事は最終更新から 372日 が経過しています。
(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そうだ!
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2026-06-19: 0回 2026-06-18: 1回 2026-06-17: 0回 2026-06-16: 0回 2026-06-15: 0回 2026-06-14: 1回 2026-06-13: 0回