2017-11-17 6 views
3

私はニューラルネットを持っており、非常に大量のデータを訓練しています。データは私のコンピュータのメモリに収まらないので、それを分解してまとめて読み込む必要があります。だから、むしろのようなエポックカウンタに建て使用kerasより:データセットがメモリに収まらない場合のKerasオプティマイザの状態

model.fit(x=X,y=Y,epochs=20) 

私はforループのようなトレーニングを明示的に書いている:

for i in range(iter): #iter is now my counter for epochs 
      shuffle(datachunks) #pseudocode to shuffle the data around 
      for j in range(datachunks): 
        model.fit(x=X_chunk,y=Y_chunk,epochs=1) 

私の質問は、速度減衰を学習することを伴います。崩壊は、私は推測している「各アップデートは、」(各バッチでであるおそらくここ

keras.optimizers.Adam(lr=0.001,decay=1e-6) 

:私は1つのようオプティマイザにそれを実装することで、kerasに学習率の減衰を実現するための二つの方法を知っていますか?これは私が持っている副次的な質問です...私はかなりの崩壊スケジュールがここにあるかどうかはまだ分かりません)。私は学習率の減衰を実装するために知っている第二の方法はそうのようなコールバックでの学習率スケジューラ経由で:

keras.callbacks.LearningRateScheduler(schedule) 

スケジュール機能は、入力としてエポックを取る必要がありますので、このスケジューラで反復変数はエポックであるべきで、新しい学習率を出力する。私の質問は、これらの学習率低下メカニズムのいずれかが私のために働くのでしょうか?私は明示的なforループを持っており、model.fitを呼び出すたびに1回の訓練しか行いません。コールバックメソッドを使用すると、スケジュールに「1」を送り続けるだけで、学習率は決して低下しませんか?オプティマイザで内蔵ディケイを使用すると、オプティマイザは各反復でリセットされ、元の学習率に戻りますか、またはすべてのループを通じて学習率を引き続き低下させることを忘れませんか?この同じ質問は、以前の勾配の移動するウィンドウ平均である運動量(該当する場合)などの他の超過パラメータにも適用されます。このようにデータを分割すると、kerasはこれらの移動するウィンドウの平均をデータチャンクとエポックで追跡しますか?

+0

データが大きすぎてワンショットで読み込めない場合は、 'fit'の代わりに' fit_generator'を使用してください。 – scarecrow

答えて

1

理想的には、大量のデータを持つジェネレータを使用することをお勧めします。あなたのジェネレータは一度に1つのバッチのデータを処理する必要があります。そして、あなたは(それがエポックが完了するまでのバッチの数にsteps_per_epochを設定することを忘れないでください)あなたのモデルを訓練するためにfit_generatorを呼び出すことができます

def myGenerator(): 
    while True: 
     x,y=getSomeDataFromFile(batchSize) 
     yield (x,y) 

:それはのようなものでなければなりません。

一度に1つのエポックを訓練したい場合は別の方法として、あなたはエポックの数を増加し続けるので、などの開始エポックを指定する必要があります。

model.fit(x, y, epochs=i, initial_epoch=i) 

学習率は、時間の経過とともに減衰します。この方法。

+0

もう少し調べなければなりません。私のケースは、私のデータが約11GBの120個の.npzファイルに分割されているという事実によって複雑になると思う。私は、一度に1つのミニバッチを生成している場合、fit_generatorがミニバッチシャッフルを行う方法について最も混乱しています。 – enumaris

+0

ジェネレータを使用してデータをシャッフルします。ファイルとサンプルをランダムな順序で繰り返し、バッチを生成します。 – ilan

+0

私はこれを実装しており、動作しているようです。ありがとう! – enumaris

関連する問題