2017-01-26 21 views
3

num_samplesを大きくしてnb_epoch = 1にすることで、まったく同じ結果が得られるようです。私は、複数のエポックの目的が同じデータに対して何度も繰り返すことになっていると思っていましたが、ケラスは各エポックの終わりにジェネレータを再インスタンス化しません。それだけで続ける。このオートエンコーダを訓練例えば:私はと同じ結果を得るようKerasのfit_generatorのnb_epochの目的は何ですか?

import numpy as np 
from keras.layers import (Convolution2D, MaxPooling2D, 
    UpSampling2D, Activation) 
from keras.models import Sequential 

rand_imgs = [np.random.rand(1, 100, 100, 3) for _ in range(1000)] 

def keras_generator(): 
    i = 0 
    while True: 
     print(i) 
     rand_img = rand_imgs[i] 
     i += 1 
     yield (rand_img, rand_img) 


layers = ([ 
    Convolution2D(20, 5, 5, border_mode='same', 
     input_shape=(100, 100, 3), activation='relu'), 

    MaxPooling2D((2, 2), border_mode='same'), 

    Convolution2D(3, 5, 5, border_mode='same', activation='relu'), 

    UpSampling2D((2, 2)), 

    Convolution2D(3, 5, 5, border_mode='same', activation='relu')]) 

autoencoder = Sequential() 
for layer in layers: 
    autoencoder.add(layer) 

gen = keras_generator() 
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy') 
history = autoencoder.fit_generator(gen, samples_per_epoch=100, nb_epoch=2) 

それはそうです(samples_per_epoch = 100、nb_epoch = 2)私がそうであるように(samples_per_epoch = 200、nb_epoch = 1)。私はfit_generatorを意図して使用していますか?

答えて

3

はい - keras.fit_generatorを使用する場合は、これら2つの方法が同等です。 - しかし、epochsを維持することは合理的である理由はさまざまあります

  1. ログ:この場合epochは、あなたがトレーニングについて(例えば時間やロスのようないくつかの重要な統計情報を記録したい後にデータの量を含みますエポックの終わり)。
  2. 、あなたのハードディスクからデータをロードするために発電機を使用しているとき、ディレクトリ構造を維持する - この場合には - あなたはあなたのディレクトリに持っているどのように多くのファイルがわかっている場合 - あなたは希望エポックような値にbatch_sizenb_epochを調整することができますあなたのデータセットのすべての例を調べること。
  3. flowジェネレータを使用する場合のデータ構造の維持 - この場合、 Pythonにロードされた画像のセットで、異なる種類のデータ変換を適用する場合は、batch_sizenb_epochを設定して、エポックがデータセット内のすべての例を通過するように設定すると、訓練プロセス。
関連する問題