2017-10-05 12 views
1

私は現在、単純な分類作業のためにCNN(Keras/Tensorflow)をトレーニングするために大きな画像データセット(〜60GB)を使用しています。 イメージはビデオフレームなので、時間的には相関が高いので、巨大な.hdf5ファイルを生成するときにデータを一度シャッフルしました... セット全体を一度にメモリにロードすることなくCNNにデータを送る私は単純なバッチジェネレータを作成しました(下記のコードを参照)。 私の質問: 通常、各トレーニングエポック後にデータをシャッフルすることをお勧めしますか?しかし、そうするには、各エポック後にデータセット全体をロードしてシャッフルする必要があります。つまり、バッチジェネレータの使用を避けたいのです... So:それは本当に重要ですか?各エポック後にデータセットをシャッフルすることができます。はいの場合、できるだけ効率的にどのように行うことができますか?ここで は私のバッチ・ジェネレータの現在のコードです:大きなHDF5データセット、各エポック後に効率的にシャッフルする方法

def generate_batches_from_hdf5_file(hdf5_file, batch_size, dimensions, num_classes): 
""" 
Generator that returns batches of images ('xs') and labels ('ys') from a h5 file. 
""" 
filesize = len(hdf5_file['labels']) 

while 1: 
    # count how many entries we have read 
    n_entries = 0 
    # as long as we haven't read all entries from the file: keep reading 
    while n_entries < (filesize - batch_size): 
     # start the next batch at index 0 
     # create numpy arrays of input data (features) 
     xs = hdf5_file['images'][n_entries: n_entries + batch_size] 
     xs = np.reshape(xs, dimensions).astype('float32') 

     # and label info. Contains more than one label in my case, e.g. is_dog, is_cat, fur_color,... 
     y_values = hdf5_file['labels'][n_entries:n_entries + batch_size] 
     #ys = keras.utils.to_categorical(y_values, num_classes) 
     ys = to_categorical(y_values, num_classes) 

     # we have read one more batch from this file 
     n_entries += batch_size 
     yield (xs, ys) 
+2

速度の面で重要な点は、hdf5ファイルのchuck_sizeをイメージのサイズに設定することです。これにより、hdf5から個々の画像を取得する際の効率が向上します –

答えて

0

うん、シャッフルは毎回あなたが次善の領域にはまり込むことが同じ順序でデータを実行しているため、パフォーマンスが向上します。

データ全体をシャッフルしないでください。データへのインデックスのリストを作成し、代わりにそれをシャッフルします。次に、索引リストを順番に移動し、その値を使用してデータ・セットからデータを選択します。

関連する問題