2016-07-06 10 views
3

私は、サイズ(21760, 1, 33, 33)のhdf5トレーニングデータセットを持っています。 21760はトレーニングサンプルの全数です。私はネットワークを訓練するために、サイズ128のミニバッチ訓練データを使用したいと思います。トレーニングのための1つのhdf5データファイルでバッチを読み取る方法は?

私が聞きたい:

をtensorflowたびにデータセット全体から128ミニバッチ学習データを供給するためにどのように?

答えて

8

hdf5データセットをnumpy配列に読み込み、numpy配列のスライスをTensorFlowモデルに送ることができます。次のような擬似コードは動作します:

import numpy, h5py 
f = h5py.File('somefile.h5','r') 
data = f.get('path/to/my/dataset') 
data_as_array = numpy.array(data) 
for i in range(0, 21760, 128): 
    sess.run(train_op, feed_dict={input:data_as_array[i:i+128, :, :, :]}) 
+0

ありがとうございます。しかし、トレーニング反復回数iが大きい場合、例えば、 100000、どのようにそれを食べる? –

+0

トレーニングサンプルが「21760」しかない場合は、「21760/128」のミニバッチがあります。 'i'ループの周りに外側ループを記述し、トレーニングデータセットの上で多くのエポックを実行する必要があります。 – keveman

+0

私は1つの点が混乱しています。元のデータをシャッフルしてミニバッチを抽出すると、ミニバッチの数が「21760/128」を超えていることを意味しますか? –

1

あなたのデータセットがkevemanが提案のように、それはメモリにインポートすることができないほど大きい場合、あなたは直接h5pyオブジェクトを使用することができます。

import h5py 
import tensorflow as tf 

data = h5py.File('myfile.h5py', 'r') 
data_size = data['data_set'].shape[0] 
batch_size = 128 
sess = tf.Session() 
train_op = # tf.something_useful() 
input = # tf.placeholder or something 
for i in range(0, data_size, batch_size): 
    current_data = data['data_set'][position:position+batch_size] 
    sess.run(train_op, feed_dict={input: current_data}) 

をまた、繰り返しの膨大な数を介して実行し、ランダムにあなたがしたい場合はバッチを選択することができます。

import random 
for i in range(iterations): 
    pos = random.randint(0, int(data_size/batch_size)-1) * batch_size 
    current_data = data['data_set'][pos:pos+batch_size] 
    sess.run(train_op, feed_dict={inputs=current_data}) 

または逐次:

for i in range(iterations): 
    pos = (i % int(data_size/batch_size)) * batch_size 
    current_data = data['data_set'][pos:pos+batch_size] 
    sess.run(train_op, feed_dict={inputs=current_data}) 

すべてのデータをランダムに処理するより洗練されたコードを作成したいが、どのバッチが使用されたかを把握しているので、他のバッチより頻繁にバッチを使用することはない。トレーニングセットをフル実行したら、すべてのバッチを再度有効にして繰り返します。

関連する問題