2017-11-09 23 views
0

画像の40GBデータセットがあるので、一度に1つのバッチをメモリにロードすることは可能です。Keras:大きなデータセットの画像をバッチ単位で読み込み

データセットが小さい場合は、ImageDataGeneratorをジェネレータのバッチに使用できますが、大きなデータセットのため、メモリ内のすべてのイメージをロードできません。私は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のいずれかの方法があります。

+0

['train_on_batch'](https://keras.io/models/sequence/)はどうですか? – desertnaut

答えて

2

Kerasのモデルはfit_generator()です。 Python generatorまたはケラスSequenceを入力として受け入れます。

fileList = listOfFiles  

def imageLoader(files, batch_size): 

    L = len(files) 

    #this line is just to make the generator infinite, keras needs that  
    while True: 

     batch_start = 0 
     batch_end = batch_size 

     while batch_start < L: 
      limit = min(batch_end, L) 
      X = someMethodToLoadImages(files[batch_start:limit]) 
      Y = someMethodToLoadTargets(files[batch_start:limit]) 

      yield (X,Y) #a tuple with two numpy arrays with batch_size samples  

      batch_start += batch_size 
      batch_end += batch_size 

そして、このようにフィット:あなたはこのような単純なジェネレータを作成することができます

model.fit_generator(imageLoader(fileList,batch_size),steps_per_epoch=..., epochs=..., ...) 

通常は、あなたがsteps_per_epochにあなたが発電機から取るバッチの数を渡します。

独自のKeras Sequenceを実装することもできます。もう少し作業はありますが、マルチスレッド処理を行う場合は、これを使用することをお勧めします。

関連する問題