NLP(自然言語処理)訓練の中断と再開(ModelCheckpoint)

訓練に用いるデータが大きくなると,訓練に必要な時間も長くなり,一度に訓練するのが困難になります。

そこで,それぞれのエポックが終了したときにモデルを保存し,あとで訓練を再開する方法を導入します。

ModelCheckpoint

from keras.callbacks import ModelCheckpoint
cp_callback = ModelCheckpoint(
    filepath="model.h5", 
    verbose=1, 
    save_weights_only=False,
    save_freq="epoch")

ModelCheckpoint()はそれぞれのエポックが終了したときに,モデルの重みやモデルそのものを保存します。

filepathは保存するファイル名です。ここではモデルそのもを保存するので,h5形式を指定します。

verbose=1は,保存するときにメッセージを表示します。verbose=0とするとメッセージは表示されません。

save_weights_only=Trueは,モデルの重みのみを保存します。一方でsave_weights_only=Falseはモデルそのものを保存します。

モデルが保存されるとき,モデルは重みを含みます。したがって,あとで学習を再開するときに,重みとモデルの両方を読み込む必要はなく,モデルのみを読み込みます。

save_freq="epoch"はそれぞれのエポックが終了したときに,ファイルを上書きします。この値は変更しないことが推奨されています。

model.fit(
    ...... ,
    callbacks=cp_callback)

最終的に,ModelCheckpoint()fit()callbacksで呼び出します。

訓練の再開

model = load_model('model.h5')

load_model()は保存されたモデルを読み込みます。

モデルそのものを読み込んだ場合,再びモデルを構築する必要はありません。具体的には,Sequential()mode.add()model.compile()が不要です。

これらのコードを削除またはコメントアウトし,model.fit()を実行します。

model.fit(
    ...... ,
    initial_epoch=10,
    callbacks=cp_callback)

initial_epochは訓練を何番目のepochから開始するかを表します。例えば,前回の訓練を10 epochで終了した場合,initial_epoch=10とすると,11 epochから訓練を再開します。

initial_epochを使用しない場合,1 epochから数えることになります。

initial_epochは必ずしも値を指定する必要はありませんが,訓練の量と結果の関係が分からなくなるので,値を指定した方がよいでしょう。