はじめに
本記事は 【Keras入門】model.fit()とは?GradientTapeとの違い・使い分け・精度の違いを解説 を踏まえた内容になっています。
必要に応じて、あわせてご参照ください。
長時間の学習や過学習を避ける実務では、学習途中での「ベストモデルの自動保存」が非常に重要です。
Keras が提供する ModelCheckpoint コールバックは、そのための基本中の基本。この記事では、実際に使えるコード例と、よくあるトラブルの対処法まで丁寧に解説します。
ModelCheckpointとは?
ModelCheckpoint は学習中にモデル(あるいは重み)を自動保存するコールバックです。
実運用では「検証データの性能(val_loss や val_accuracy)が最良のときのモデル」を保存する用途で使われます。
主な引数と意味
| 引数 | 説明 |
|---|---|
filepath | 保存先のパス/ファイル名(例: 'best_model.h5')。 |
monitor | 監視する指標(例: 'val_loss'、'val_accuracy')。 |
save_best_only | Trueにすると改善時のみ保存。ディスク節約のため推奨。 |
save_weights_only | Trueで重みのみ保存。モデル構造は別途必要。 |
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
)
トラブルシューティングのチェックリスト
- validation_data が正しく渡されているか?
- monitor の名前にスペルミスはないか?(例:
val_loss) - 保存先のディレクトリに書き込み権限はあるか?(Colab→Drive マウント)
- 保存形式(.keras / SavedModel)で互換性の問題がないか?
- ファイルが大量に増えないよう
save_best_only=Trueを検討
まとめ
- ModelCheckpoint は学習中にベストモデルを記録する重要なコールバック。
- validation_data が無いとベスト判定ができない点に注意。
- Colab 利用時は Google Drive に保存するのが安全。
- 保存されない・指標がおかしい場合はまず
monitorとvalidation_dataをチェック。
実務では、ModelCheckpoint + EarlyStopping(および ReduceLROnPlateau)を組み合わせるのが鉄板です。 これらを使いこなせば学習の効率と安定性が大きく向上します。

0 件のコメント:
コメントを投稿