【0から学ぶAI】第230回:モデルの保存と読み込み 〜学習済みモデルの扱い方を解説

目次

前回のおさらいと今回のテーマ

こんにちは!前回は、Kerasを使ってRNN(再帰型ニューラルネットワーク)を実装し、テキストデータの感情分類を行うモデルを構築しました。RNNは、時系列データや自然言語処理に適したモデルであり、長期的な依存関係を捉えるためのLSTMやGRUといった拡張も学びました。

今回は、機械学習モデルを保存し、再利用する方法について解説します。モデルの訓練には多くの計算リソースと時間がかかるため、一度訓練したモデルを保存しておくことで、再度利用する際のコストを大幅に削減できます。この記事では、Kerasを使ってモデルを保存し、再度読み込む方法を具体的に紹介していきます。

モデルの保存と読み込みの重要性

モデルを保存し、後で読み込むことで以下のメリットがあります。

  1. 再訓練の不要: 一度保存したモデルを再度利用する際に、再訓練を行う必要がないため、時間とリソースの節約が可能。
  2. モデルの共有: 保存したモデルファイルを他の開発者と共有することで、異なる環境やチームでも同じモデルを利用可能。
  3. モデルのバージョン管理: 進行中のプロジェクトで、異なるバージョンのモデルを保存し、後で性能を比較することができます。

Kerasを使ったモデルの保存と読み込み

Kerasには、モデルを保存するための便利な関数がいくつか用意されています。ここでは、モデルの保存と読み込みに関する基本的な方法と応用的な使い方を解説します。

1. モデルの保存方法

Kerasでは、以下の2つの方法でモデルを保存できます。

  • モデル全体の保存(構造、重み、訓練設定を含む)
  • モデルの重みのみの保存

(1) モデル全体の保存

モデル全体を保存すると、モデルの構造、重み、最適化設定などがすべて含まれたファイルが作成されます。これにより、後でモデルをそのまま復元できます。

# モデルの定義(例としてシンプルなCNN)
model = tf.keras.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    layers.MaxPooling2D((2, 2)),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

# モデルのコンパイル
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# モデルの保存
model.save('my_model.h5')
  • model.save(‘my_model.h5’): モデル全体をmy_model.h5というファイルに保存します。ファイル形式はHDF5形式で、Kerasが標準でサポートしているフォーマットです。

(2) モデルの重みのみの保存

モデルの重み(パラメータ)のみを保存し、再度モデル構造を定義する場合に適しています。重みの保存にはsave_weightsメソッドを使用します。

# モデルの重みのみを保存
model.save_weights('my_model_weights.h5')
  • model.save_weights(‘my_model_weights.h5’): 重みだけを保存し、再度モデル構造を定義して読み込むことができます。

2. モデルの読み込み方法

保存したモデルを読み込む際には、以下の方法があります。

(1) モデル全体の読み込み

保存されたモデルファイル(例:my_model.h5)を読み込むことで、訓練済みのモデルをそのまま復元できます。

# モデル全体の読み込み
loaded_model = tf.keras.models.load_model('my_model.h5')

# モデルの概要を表示
loaded_model.summary()
  • tf.keras.models.load_model(‘my_model.h5’): 保存されたモデルファイルを読み込み、モデル全体を復元します。

(2) モデルの重みのみを読み込む

保存された重みを読み込む場合は、モデル構造を再度定義し、重みを読み込みます。

# モデル構造の再定義
model = tf.keras.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    layers.MaxPooling2D((2, 2)),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

# モデルの重みを読み込み
model.load_weights('my_model_weights.h5')
  • model.load_weights(‘my_model_weights.h5’): 保存された重みをモデルに適用します。この際、保存時と同じ構造でモデルを定義する必要があります。

モデルの保存と読み込みの応用

モデルチェックポイントの活用

訓練中にモデルの重みを定期的に保存して、訓練が中断された場合でも後から再開できるようにする方法です。

# モデルチェックポイントのコールバック設定
checkpoint_cb = tf.keras.callbacks.ModelCheckpoint(
    'model_checkpoint.h5', save_best_only=True, monitor='val_loss'
)

# モデルの訓練(コールバックを適用)
history = model.fit(x_train, y_train, epochs=10, validation_split=0.2, callbacks=[checkpoint_cb])
  • ModelCheckpoint: 訓練中にモデルの重みを保存するコールバックです。save_best_only=Trueを設定すると、検証損失が改善されたときのみ重みを保存します。

モデルのファイル形式

Kerasでは、モデルをHDF5形式以外にSavedModel形式でも保存できます。SavedModel形式はTensorFlow標準の形式で、より柔軟で他のフレームワークとの互換性も高いです。

# SavedModel形式での保存
model.save('saved_model', save_format='tf')

# SavedModel形式での読み込み
loaded_model = tf.keras.models.load_model('saved_model')
  • save_format=’tf’: TensorFlowのSavedModel形式でモデルを保存します。この形式はディレクトリとして保存され、モデルとそのメタデータが含まれます。

モデル保存に関するベストプラクティス

  • モデルのバージョン管理: 訓練の度に異なるバージョン番号をつけたファイル名(例:model_v1.h5)を使用し、どのバージョンが最も良いかを追跡する。
  • 自動保存の利用: モデルチェックポイントやEarlyStoppingなどのコールバックを活用し、訓練の途中で最適なモデルを自動保存する。
  • 形式の選択: モデルを他のプラットフォーム(例:Webアプリやモバイルアプリ)で利用する場合は、SavedModel形式の使用を検討する。

まとめ

今回は、Kerasを使ったモデルの保存と読み込みについて解説しました。一度訓練したモデルを効率的に保存し、後から再利用することで、時間とリソースの節約ができます。また、モデルチェックポイントを活用して、訓練中に最適なモデルを自動的に保存することもでき、非常に便利です。これを活用して、開発の効率をさらに高めていきましょう!

次回予告

次回は、データ拡張の実践として、画像データを増やす方法を解説します。データセットの数が少ない場合でも、データ拡張を活用することで、モデルの精度を向上させることができます。次回もお楽しみに!


注釈

  • HDF5形式: データの保存と読み込みに使われるファイル形式で、Kerasで広く使用されている。
  • SavedModel形式: TensorFlowの標準保存形式で、モデルの構造、重み、メタデータを保存し、他のプラットフォームでも利用しやすい。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社PROMPTは生成AIに関する様々な情報を発信しています。
記事にしてほしいテーマや調べてほしいテーマがあればお問合せフォームからご連絡ください。
---
PROMPT Inc. provides a variety of information related to generative AI.
If there is a topic you would like us to write an article about or research, please contact us using the inquiry form.

コメント

コメントする

目次