【Keras入門】ModelCheckpointとは?ベストモデルを自動保存する方法 | Keras ModelCheckpoint: How to Automatically Save the Best Model

投稿日:2025年11月23日日曜日 最終更新日:

Google Colab Keras ModelCheckpoint

X f B! P L
Keras ModelCheckpoint eye-catch image in flat design.

はじめに

本記事は 【Keras入門】model.fit()とは?GradientTapeとの違い・使い分け・精度の違いを解説 を踏まえた内容になっています。
必要に応じて、あわせてご参照ください。

長時間の学習や過学習を避ける実務では、学習途中での「ベストモデルの自動保存」が非常に重要です。 Keras が提供する ModelCheckpoint コールバックは、そのための基本中の基本。この記事では、実際に使えるコード例と、よくあるトラブルの対処法まで丁寧に解説します。

ModelCheckpointとは?

ModelCheckpoint は学習中にモデル(あるいは重み)を自動保存するコールバックです。 実運用では「検証データの性能(val_loss や val_accuracy)が最良のときのモデル」を保存する用途で使われます。

主な引数と意味

引数説明
filepath保存先のパス/ファイル名(例: 'best_model.h5')。
monitor監視する指標(例: 'val_loss''val_accuracy')。
save_best_onlyTrueにすると改善時のみ保存。ディスク節約のため推奨。
save_weights_onlyTrueで重みのみ保存。モデル構造は別途必要。
mode'min' / 'max' / 'auto'(指標の改善方向)。
save_freq'epoch'(毎エポック)やステップ数での保存。通常は 'epoch'。

最小構成の使い方

from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.callbacks import CSVLogger

# ====== Load dataset ======
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

# ====== Define model ======
model = keras.Sequential([
            layers.Input(shape=(28, 28)),
            layers.Flatten(),
            layers.Dense(128, activation='relu'),
            layers.Dropout(0.2),
            layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# ====== Configure ModelCheckpoint ======
checkpoint = keras.callbacks.ModelCheckpoint(
    filepath='best_model.keras',  # Path to save the best model
    monitor='val_loss',           # Metric to monitor
    save_best_only=True,          # Save only when performance improves
    save_weights_only=False,      # Save full model, not only weights
    mode='min',                   # Lower val_loss is better
    verbose=1                     # Print logs when saving
)

# ====== Train model ======
model.fit(x_train, y_train,
          validation_data=(x_test, y_test),
          epochs=10,
          callbacks=[checkpoint])

ポイント: monitor='val_loss' を使う場合、必ず validation_data(または validation_split)を指定してください。 検証データが無いと保存条件が評価できません。

実行結果

Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11490434/11490434 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
Epoch 1/10
1870/1875 ━━━━━━━━━━━━━━━━━━━━ 0s 5ms/step - accuracy: 0.8599 - loss: 0.4729
Epoch 1: val_loss improved from inf to 0.13552, saving model to best_model.keras
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 19s 8ms/step - accuracy: 0.8601 - loss: 0.4723 - val_accuracy: 0.9596 - val_loss: 0.1355
Epoch 2/10
1866/1875 ━━━━━━━━━━━━━━━━━━━━ 0s 5ms/step - accuracy: 0.9557 - loss: 0.1527
Epoch 2: val_loss improved from 0.13552 to 0.10499, saving model to best_model.keras
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 11s 6ms/step - accuracy: 0.9557 - loss: 0.1527 - val_accuracy: 0.9673 - val_loss: 0.1050
・・(中略)・・
Epoch 9/10
1867/1875 ━━━━━━━━━━━━━━━━━━━━ 0s 8ms/step - accuracy: 0.9860 - loss: 0.0443
Epoch 9: val_loss did not improve from 0.06871
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 15s 8ms/step - accuracy: 0.9860 - loss: 0.0443 - val_accuracy: 0.9796 - val_loss: 0.0728
Epoch 10/10
1856/1875 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - accuracy: 0.9858 - loss: 0.0420
Epoch 10: val_loss did not improve from 0.06871
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9858 - loss: 0.0420 - val_accuracy: 0.9793 - val_loss: 0.0738
<keras.src.callbacks.history.History at 0x7e82ce4bf470>

保存ファイル確認

best_model.kerasが作成されていることがわかります。

!ls -lah
total 1.3M
drwxr-xr-x 1 root root 4.0K Nov 23 01:05 .
drwxr-xr-x 1 root root 4.0K Nov 23 01:03 ..
-rw-r--r-- 1 root root 1.2M Nov 23 01:13 best_model.keras
drwxr-xr-x 4 root root 4.0K Nov 20 14:30 .config
drwxr-xr-x 1 root root 4.0K Nov 20 14:30 sample_data

よくあるトラブルと対処法

ファイルが保存されない

主な原因は validation_data を渡していない、あるいは monitor の名前を間違えている場合です。 対処: validation_data=(x_val, y_val) を指定するか、 monitor'loss' に変更して試してください。

val_loss が 'nan'、または指標が不安定で保存されない

データ前処理や学習率が原因で損失が発散する場合があります。
対処: 学習率を下げる、BatchNormalization を入れる、勾配クリッピングを試す、データの正規化を確認してください。

ファイルが大量に溜まる

save_best_only=False のままだと毎エポック保存されます。
対処: 多くの場合は save_best_only=True を使い、必要に応じてファイル名にエポック番号を入れて整理します。

Google Colab で保存したのに消える

Colab の一時ストレージはセッション終了で消えます。
対処: Google Drive をマウントして保存先を Drive にしてください。例:/content/drive/MyDrive/best_model.keras

save_weights_only と save_best_only の違い

save_weights_only=True は重みのみを保存するためファイルが軽いですが、モデル構造(コード)が必要です。
一方 save_weights_only=False はモデル+重みを保存するので、そのままロードして推論可能です(互換性に注意)。

保存ファイルの拡張子を .h5 にする場合の注意点

.h5 形式で保存しようとすると、TensorFlow 2.15 以降では互換性に関する警告が出ます。特別な理由がなければ、 .keras ファイル形式で保存することが推奨されています。

WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. 

実用的な運用例(応用)

val_accuracy を監視して精度が高いモデルを保存

checkpoint = tf.keras.callbacks.ModelCheckpoint(
    filepath='best_acc.keras',
    monitor='val_accuracy',
    save_best_only=True,
    mode='max',
    verbose=1
)

チェックポイントをフォルダに分けて保存(エポック毎)

checkpoint = tf.keras.callbacks.ModelCheckpoint(
    filepath='checkpoints/epoch_{epoch:02d}_val_loss_{val_loss:.4f}.keras',
    save_best_only=False
)

学習再開用に重みだけを保存

checkpoint = tf.keras.callbacks.ModelCheckpoint(
    filepath='weights_epoch_{epoch:02d}.keras',
    save_weights_only=True,
    save_best_only=False
)

トラブルシューティングのチェックリスト

  1. validation_data が正しく渡されているか?
  2. monitor の名前にスペルミスはないか?(例: val_loss
  3. 保存先のディレクトリに書き込み権限はあるか?(Colab→Drive マウント)
  4. 保存形式(.keras / SavedModel)で互換性の問題がないか?
  5. ファイルが大量に増えないよう save_best_only=True を検討

まとめ

  • ModelCheckpoint は学習中にベストモデルを記録する重要なコールバック。
  • validation_data が無いとベスト判定ができない点に注意。
  • Colab 利用時は Google Drive に保存するのが安全。
  • 保存されない・指標がおかしい場合はまず monitorvalidation_data をチェック。

実務では、ModelCheckpoint + EarlyStopping(および ReduceLROnPlateau)を組み合わせるのが鉄板です。 これらを使いこなせば学習の効率と安定性が大きく向上します。

関連記事