質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.82%

keras で 任意のタイミングで学習を中断させ、中断した epoch から再開する方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,453

Ruthird

score 15

前提

業務でかなりの量(組み合わせ)の オートエンコーダーの学習を行う予定です。

以下のように、学習中 1epoch毎 にモデルを保存(上書き)させていて、
もし学習済、または学習途中のモデルがある場合は、
その結果を使うよう以下のようなコードを書いてみました。

checkpoint = ModelCheckpoint(filepath = os.path.join(MODEL_DIR, "_model.h5"))


(中略)


if os.path.isfile(os.path.join(MODEL_DIR, "_model.h5")):    
    model.load_weights(os.path.join(MODEL_DIR, "_model.h5"))

model.fit(Xtrain, Ytrain,
          batch_size = BATCH_SIZE, epochs = NUM_EPOCHS,
          validation_split = 0.2,
          callbacks = [checkpoint, TensorBoard(log_dir = log_dir)])

実現したいこと

この状態で強制的に訓練を停止させて再度実行してしまうと
最初から再開することになってしまうのですが
停止させた epoch から再開するにはどうすれば良いでしょうか?

試したこと

model.fit() に initial_epoch の設定があり
デフォルトが0になっているから最初から再開することになることはわかったのですが、
ここの引数に停止させたときの epoch を後から入力させるのも手間だし、
突発で止まってしまったときは どこで止まったかがわからなくなってしまいます。

止めた時の epoch の情報がモデルデータなどから自動的にわかり、
そのまま実行をすればその epoch から再開できるようなコードの書き方はないでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Q71

    2019/09/24 23:07

    その訓練用のコードには、訓練結果を確認するコードはついていないのでしょうか。訓練結果を確認する=保存したモデルを読み込む、です。これによって、各パラメータの初期値を変更できます。

    キャンセル

  • Ruthird

    2019/09/25 01:29

    ご意見すみません。
    自己解決してしまいましたので、自身がやりたかったことは 回答欄に記載しました。

    訓練結果を見るコードももちろんあるのですが、
    質問した際は訓練(学習)が終わってない状態の話でしたので その時点では扱っていませんでした。
    訓練回数が多くなりそうだったので、途中で停止することを想定していたのですが、

    モデルを読み込む=モデルを読み込んで結果を確認する

    ではなく、

    モデルを読み込む=モデルを読み込んで訓練を再開する(続行する)

    方法の質問をしたつもりでした。
    分かりづらい質問で申し訳ありません。

    キャンセル

回答 1

check解決した方法

0

長期間放置してしまい申し訳ありません。
その間に回答にたどり着いてしまいました。

for iter in range(STRAT_NUM + 1, NUM_ITERS + 1):

    hist = model.fit(X_train, y_train, batch_size = BATCH_SIZE,
                     initial_epoch = (iter - 1) * NUM_EPOCHS, epochs = iter * NUM_EPOCHS,
                     verbose = ver_num, shuffle = True, validation_data = (X_val, y_val))

と model.fit() を 普通に for文中 に置いてしまい、
for文中で model.fit() の後に model や weight の保存を行う。
ついでに weight のファイル名を iter から付けるようにする。

この状態で途中で停止した場合に途中から再開すると
initial_epoch に iter が入っており、
iter は START_NUM を weightのファイル名の 停止時の iter から読み込むようにすることで
停止させた タイミング(NUM_ITERS毎) から再開することができました。
(初めて学習するときは START_NUM = 0)

確認いただいた皆様、申し訳ありませんでした。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る