背景
Keras では、 model.fit()
を何度もコールすると続きから学習を再開することが可能です。しかし、 Tensorboad でのログを出力する必要がある場合、epochs
と initial_epoch
を適切に設定する必要があります。
問題点
model.fit()
を単純に何度も呼ぶと、 Tensorboard 用のログには、毎回 0 epoch から始まったとして記録されます。そうすると、下記の画像のように、同じ範囲を何度も繰り返すグラフができてしまいます。
この図の例では、 epochs = 100
を設定し model.fit()
を繰り返しました。
model.fit()
を複数回に分けて実行し、かつ、グラフも正しく途中からはじまり、自然につながったものを書くには、 initial_epoch
と epochs
を適切に設定する必要があります。
解決方法
initial_epoch
を設定したとき、 epochs
は最終 epoch を意味します。最終 epoch というのが何を表しているのか、具体例とともに説明します。
ここでは、一回の施行で 100 epochs の学習を行い、これを 1 step として、合計 5 steps 行うとします。
はじめの step では、
model.fit(x, y, initial_epoch=0, epochs=100) # step1
とすることで学習できます。
次の step では、 initial_epoch=100
とします。このときに、 epochs=100
のままではなくて、 epochs=200
にする必要があります。この epochs=200
というのが最終 epoch という言葉の意味を表しています。
言い換えると、 epochs
は実際に学習する epoch の数ではなく、 N epochs まで学習するという、 epoch の終わりを意味していると言えます。公式ドキュメントにも下記のように書かれています。
initial_epochと組み合わせると,epochsは「最終エポック」として理解されることに注意してください.
このモデルはepochsで与えられた反復回数の訓練をするわけではなく,単にepochsという指標に試行が達するまで訓練します.
では、残りの 4 step を一度に書いてみます。
model.fit(x, y, initial_epoch=100, epochs=200) # step2
model.fit(x, y, initial_epoch=200, epochs=300) # step3
model.fit(x, y, initial_epoch=300, epochs=400) # step4
model.fit(x, y, initial_epoch=400, epochs=500) # step5
ちなみに、 例えば step 5 では、 initial_epoch=400
, epochs=500
となっていますが、 initial_epoch=401
のように開始を 1 ずらさなくてもいいのでしょうか?
keras のコードを確認してみると、
for epoch in range(initial_epoch, epochs):
...
というように記述されています。このことから、 initial_epoch=400
, epochs=500
で問題ないことがわかります。
では、以上を踏まえて、 code snippet としてまとめて終わりとします。
epochs = 100
step = 5
for s in range(step):
start_epochs = epochs * s
end_epochs = start_epochs + epochs
model.fit(x, y, initial_epoch=start_epochs, epochs=end_epochs)