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