0

深層学習のためにテンソルフローのあるケラスを使用しています。少し大きめのデータセット(画像)を扱うので、データセット全体を一度に読み込むことはできませんでした。代わりに、私は8000画像のバッチを読み込み、model.fit()をトレーニング用に使用しました(下のコードスニペット)。gpuが計算中のときにデータを並列に読み込む方法はありますか?

for epochs in range(50): # number of epochs 
    for i in range(num_batches): # 5 batches with 8000 images each 
     #### load the data here (train, val) 
     history_train = model.fit(train_image, train_gt, batch_size=16, epochs=1, verbose=1, shuffle=False, validation_data=(val_image,val_gt)) 
     if history_train.history['val_loss'][0] < total_val_loss: 
      model.save_weights(weights_file) 
      total_val_loss = history_train.history['val_loss'][0] 

確かに効率的な方法ではありません。学習する時間(各エポックの実行時間)よりもバッチ(8000画像)を読み込むには多くの時間がかかります。私はこれを行うことができるより良い方法はありますか?またはそれを最適化するための他の方法?ローディング時間を節約できるように、コンピューティング(GPU)が完了したときに、データ(次のエポック)を並列に読み込むことはできますか?

答えて

0

はい、あなたは(nはワーカースレッドの数である)fit_generator代わりのfitを使用し、引数use_multiprocessing=Trueworkers=nを渡すことによってこれを行うことができます。データセットをロードするには、各バッチを生成するジェネレータメソッドを作成する必要があります。それは(私はあなたの入力データセットは、形状の4D配列は、(NUM_IMAGES件、高さ、幅、チャネル)であることを仮定しているので、必要に応じて適応させる)、次のようになります。これは、バッチを返すこと

def generator(dataset_x, dataset_y): 
    while True: 
     for i in range(num_batches): 
      yield dataset_x[i*8000:(i+1)*8000, :, :, :], dataset_y[i*8000:(i+1)*8000, :] 

注意サイズ8000の - あなたが 16、たとえば、のモデルを訓練するためのバッチサイズを返す別のループでより多くのそれを削減する必要があるかもしれません:のための1:

history_train = model.fit_generator(generator=generator, steps_per_epoch=5, epochs=50, use_multiprocessing=True, workers=16, validation_data=val_generator, validation_steps=5) 

あなたは2つの発電機を作りたいかもしれませんトレーニングデータと検証データのためのものです。また、Kerasは複数のワーカーでマルチプロセッシングを使用することについての警告を表示するかもしれません - それらをカプセル化するか、keras.utils.Sequence(Kerasドキュメントのこれに関する詳細情報)を使用してジェネレータをスレッドセーフにする必要があります。

0

私は40GBのデータセットを持っていますので、すべてのイメージをメモリにロードできます。したがって、私は一括してロードする必要があります。ここでジェネレータはデータセットを「N」個のバッチに分割しますが、メモリにイメージをロードする必要があります。私はtensorflowで入力をシリアル化するために、このメソッドを使用しています

path_queue = tf.train.string_input_producer(input_paths, shuffle= False) 
paths, contents = reader.read(path_queue) 
inputs = decode(contents) 
input_batch = tf.train.batch([inputs], batch_size=2) 

が、私はKerasでこのタスクを達成する方法がわからない:

はtensorflowコードを次のように何かをするkerasのいずれかの方法があります。

関連する問題