STEP 9:モデルの保存と読み込み

💾 STEP 9: モデルの保存と読み込み

学習したモデルを保存して、いつでも再利用できるようにしよう

📋 このステップで学ぶこと

  • なぜモデルの保存が重要なのか?
  • モデル全体の保存(model.save())
  • 重みのみの保存(save_weights())
  • モデルの読み込み方法
  • Google Driveへの保存(Google Colab対策)
  • 保存形式の違い(.keras / .h5)

🎯 1. なぜモデルの保存が必要か?

1-1. Google Colabの問題

STEP 6で学んだように、Google Colabには重要な制限があります。

⚠️ Google Colabの制限(復習)
  • セッション切断:最大12時間で自動切断
  • アイドルタイムアウト:90分操作しないと切断
  • ストレージの一時性:セッション終了で全ファイル消失
😱 こんな経験ありませんか?

「5時間かけて学習したモデルが、セッション切断で全部消えた…」

これを防ぐために、モデルの保存が必須です!

1-2. 保存が必要な3つの理由

📌 理由1:学習結果を失わないため

数時間かけて学習したモデルを、いつでも再利用できます。
セッションが切れても安心!

📌 理由2:途中から学習を再開するため

50エポック学習した後、追加で50エポック学習したい場合:
保存したモデルを読み込んで、続きから学習できます。

📌 理由3:本番環境で使うため

学習したモデルをWebアプリやスマホアプリに組み込む際、
保存したモデルファイルを読み込んで予測を行います。

💾 2. モデル全体の保存(model.save())

2-1. model.save()とは?

model.save()は、モデルのすべての情報を1つのファイルに保存します。

✅ model.save()で保存される情報
  • モデルのアーキテクチャ:層の構造(何層で、各層のユニット数は?)
  • 重み(weights):学習で獲得した全パラメータ
  • オプティマイザの状態:Adamなどの内部状態
  • コンパイル情報:損失関数、評価指標など

2-2. 基本的な使い方

📝 コードの解説

model.save(‘ファイル名’)

モデル全体を指定したファイル名で保存します。
拡張子は .keras(推奨)または .h5 を使います。

# モデルを作成して学習 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical # データ準備 (X_train, y_train), (X_test, y_test) = mnist.load_data() X_train = X_train / 255.0 X_test = X_test / 255.0 y_train = to_categorical(y_train) y_test = to_categorical(y_test) # モデル構築 model = Sequential([ Flatten(input_shape=(28, 28)), Dense(128, activation=’relu’), Dense(64, activation=’relu’), Dense(10, activation=’softmax’) ]) model.compile(optimizer=’adam’, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) # 学習 model.fit(X_train, y_train, epochs=5, batch_size=128, validation_split=0.2) # ★ モデルを保存 ★ model.save(‘my_model.keras’) print(“モデルを保存しました!”)
実行結果:
Epoch 1/5
375/375 - loss: 0.3521 - accuracy: 0.9012 - val_loss: 0.1654 - val_accuracy: 0.9521
...
Epoch 5/5
375/375 - loss: 0.0523 - accuracy: 0.9845 - val_loss: 0.0912 - val_accuracy: 0.9732

モデルを保存しました!

2-3. 保存形式の違い

形式 拡張子 特徴 推奨度
Keras形式 .keras TensorFlow 2.x の新しい標準形式 ★★★★★ 推奨
HDF5形式 .h5 従来の形式、互換性が高い ★★★★☆ OK
SavedModel形式 フォルダ TensorFlow Serving用 ★★★☆☆ 特殊用途
# 保存形式の例 # 方法1: .keras形式(推奨) model.save(‘my_model.keras’) # 方法2: .h5形式(従来の形式) model.save(‘my_model.h5’) # 方法3: SavedModel形式(フォルダとして保存) model.save(‘my_model_folder’)

📂 3. モデルの読み込み(load_model())

3-1. load_model()とは?

load_model()は、保存したモデルを読み込んで、すぐに使える状態にします。

📝 コードの解説

load_model(‘ファイル名’)

保存したモデルファイルを読み込みます。
読み込んだモデルは、保存時と全く同じ状態です。

from tensorflow.keras.models import load_model # ★ モデルを読み込み ★ loaded_model = load_model(‘my_model.keras’) # 読み込んだモデルの確認 loaded_model.summary()
実行結果:
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 flatten (Flatten)           (None, 784)               0         
 dense (Dense)               (None, 128)               100480    
 dense_1 (Dense)             (None, 64)                8256      
 dense_2 (Dense)             (None, 10)                650       
=================================================================
Total params: 109,386
Trainable params: 109,386
Non-trainable params: 0
_________________________________________________________________

3-2. 読み込んだモデルで予測

# 読み込んだモデルで予測 predictions = loaded_model.predict(X_test[:5]) # 予測結果を表示 import numpy as np for i in range(5): predicted_label = np.argmax(predictions[i]) actual_label = np.argmax(y_test[i]) print(f”画像{i+1}: 予測={predicted_label}, 正解={actual_label}”)
実行結果:
画像1: 予測=7, 正解=7
画像2: 予測=2, 正解=2
画像3: 予測=1, 正解=1
画像4: 予測=0, 正解=0
画像5: 予測=4, 正解=4

→ 保存前と同じ精度で予測できている!

3-3. 読み込んだモデルで追加学習

# 読み込んだモデルで追加学習(続きから学習) loaded_model.fit(X_train, y_train, epochs=3, batch_size=128, validation_split=0.2) # 追加学習後の評価 test_loss, test_acc = loaded_model.evaluate(X_test, y_test) print(f”追加学習後のテスト精度: {test_acc:.4f}”)
実行結果:
Epoch 1/3
375/375 - loss: 0.0412 - accuracy: 0.9876 - val_loss: 0.0823 - val_accuracy: 0.9756
Epoch 2/3
375/375 - loss: 0.0321 - accuracy: 0.9901 - val_loss: 0.0789 - val_accuracy: 0.9778
Epoch 3/3
375/375 - loss: 0.0256 - accuracy: 0.9923 - val_loss: 0.0812 - val_accuracy: 0.9782

追加学習後のテスト精度: 0.9785

→ 保存した状態から続けて学習できた!

⚖️ 4. 重みのみの保存(save_weights())

4-1. なぜ重みだけを保存する?

📊 model.save() vs save_weights() の違い

model.save():
→ モデル構造 + 重み + オプティマイザ(全部入り)
→ ファイルサイズ大きめ
→ すぐに使える

save_weights():
→ 重みのみ
→ ファイルサイズ小さい
→ 読み込み時にモデル構造を再定義する必要あり

✅ save_weights()を使う場面
  • ファイルサイズを小さくしたい:重みだけなので軽い
  • モデル構造を変更したい:一部の層だけ重みを転用
  • 転移学習:事前学習済みの重みを別のモデルに適用

4-2. 重みの保存と読み込み

# 重みの保存 model.save_weights(‘my_weights.weights.h5′) print(“重みを保存しました!”) # 重みの読み込み(同じ構造のモデルが必要) # まずモデル構造を再定義 new_model = Sequential([ Flatten(input_shape=(28, 28)), Dense(128, activation=’relu’), Dense(64, activation=’relu’), Dense(10, activation=’softmax’) ]) # 重みを読み込み new_model.load_weights(‘my_weights.weights.h5′) print(“重みを読み込みました!”) # コンパイルが必要(重みだけではオプティマイザ情報がない) new_model.compile(optimizer=’adam’, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) # 評価 test_loss, test_acc = new_model.evaluate(X_test, y_test) print(f”テスト精度: {test_acc:.4f}”)
実行結果:
重みを保存しました!
重みを読み込みました!
313/313 - loss: 0.0823 - accuracy: 0.9756
テスト精度: 0.9756

→ 重みだけでも同じ精度で予測できる!
⚠️ 重み読み込み時の注意点
  • モデル構造が一致している必要あり:層の数、ユニット数が同じでないとエラー
  • コンパイルが必要:重みだけではオプティマイザ情報がないため

☁️ 5. Google Driveへの保存(Colab対策)

5-1. なぜGoogle Driveに保存する?

💡 Google Colabの問題を解決

Google Colabのセッションが切れると、Colab内のファイルはすべて消えます

しかし、Google Driveに保存しておけば、セッションが切れてもファイルは残ります

次回のセッションで読み込めば、学習の続きができます。

5-2. Google Driveのマウント

📝 コードの解説

drive.mount(‘/content/drive’)

Google DriveをColabに接続(マウント)します。
実行すると認証画面が表示されるので、Googleアカウントでログインします。

# Google Driveをマウント from google.colab import drive drive.mount(‘/content/drive’) # マウント後、Google Driveは以下のパスでアクセス可能 # /content/drive/MyDrive/
実行結果:
Mounted at /content/drive

→ 認証が成功すると、Google Driveが使えるようになる

5-3. Google Driveへモデルを保存

# Google Driveにモデルを保存 model.save(‘/content/drive/MyDrive/my_model.keras’) print(“Google Driveに保存しました!”) # 確認 import os if os.path.exists(‘/content/drive/MyDrive/my_model.keras’): print(“ファイルが存在します!”)
実行結果:
Google Driveに保存しました!
ファイルが存在します!

5-4. Google Driveからモデルを読み込み

# 新しいセッションでの読み込み # 1. まずGoogle Driveをマウント from google.colab import drive drive.mount(‘/content/drive’) # 2. モデルを読み込み from tensorflow.keras.models import load_model loaded_model = load_model(‘/content/drive/MyDrive/my_model.keras’) # 3. 確認 loaded_model.summary() print(“モデルを読み込みました!”)

5-5. 推奨するフォルダ構成

Google Drive └── MyDrive └── DeepLearning ← 専用フォルダを作成 ├── models ← モデル保存用 │ ├── mnist_model.keras │ └── cifar10_model.keras ├── weights ← 重み保存用 │ └── best_weights.weights.h5 └── data ← データ保存用 └── processed_data.npy
# フォルダ作成のコード import os # ベースパス base_path = ‘/content/drive/MyDrive/DeepLearning’ # フォルダを作成 os.makedirs(f'{base_path}/models’, exist_ok=True) os.makedirs(f'{base_path}/weights’, exist_ok=True) os.makedirs(f'{base_path}/data’, exist_ok=True) print(“フォルダを作成しました!”) # モデルを保存 model.save(f'{base_path}/models/mnist_model.keras’)

🎯 6. 実践的な保存パターン

6-1. 学習中に定期的に保存(ModelCheckpoint)

ModelCheckpointを使うと、学習中に自動でモデルを保存できます。
これはSTEP 14で詳しく学びますが、基本的な使い方を紹介します。

from tensorflow.keras.callbacks import ModelCheckpoint # 最良のモデルを自動保存 checkpoint = ModelCheckpoint( ‘best_model.keras’, # 保存先 monitor=’val_accuracy’, # 監視する指標 save_best_only=True, # 最良の時だけ保存 verbose=1 ) # 学習時にコールバックを指定 model.fit( X_train, y_train, epochs=10, validation_split=0.2, callbacks=[checkpoint] # ここで指定 )
実行結果:
Epoch 1/10
Epoch 1: val_accuracy improved from -inf to 0.9521, saving model to best_model.keras
...
Epoch 5/10
Epoch 5: val_accuracy improved from 0.9732 to 0.9756, saving model to best_model.keras
...
Epoch 10/10
Epoch 10: val_accuracy did not improve from 0.9756

→ 精度が改善したときだけ自動保存される!

6-2. 完成コード(Google Drive対応)

from tensorflow.keras.models import Sequential, load_model from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical from tensorflow.keras.callbacks import ModelCheckpoint from google.colab import drive import os # ===== 1. Google Driveをマウント ===== drive.mount(‘/content/drive’) save_path = ‘/content/drive/MyDrive/DeepLearning/models’ os.makedirs(save_path, exist_ok=True) # ===== 2. データ準備 ===== (X_train, y_train), (X_test, y_test) = mnist.load_data() X_train = X_train / 255.0 X_test = X_test / 255.0 y_train = to_categorical(y_train) y_test = to_categorical(y_test) # ===== 3. モデル構築 ===== model = Sequential([ Flatten(input_shape=(28, 28)), Dense(128, activation=’relu’), Dense(64, activation=’relu’), Dense(10, activation=’softmax’) ]) model.compile(optimizer=’adam’, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) # ===== 4. コールバック設定 ===== checkpoint = ModelCheckpoint( f'{save_path}/best_mnist_model.keras’, monitor=’val_accuracy’, save_best_only=True, verbose=1 ) # ===== 5. 学習 ===== history = model.fit( X_train, y_train, epochs=10, batch_size=128, validation_split=0.2, callbacks=[checkpoint] ) # ===== 6. 最終モデルも保存 ===== model.save(f'{save_path}/final_mnist_model.keras’) print(f”\nモデルを {save_path} に保存しました!”)

📝 STEP 9 のまとめ

✅ このステップで学んだこと
  • model.save():モデル全体を保存(構造 + 重み + オプティマイザ)
  • load_model():保存したモデルを読み込み
  • save_weights():重みのみを保存(ファイルサイズ小さい)
  • load_weights():重みを読み込み(同じ構造のモデルが必要)
  • Google Driveへの保存:セッション切断対策に必須
  • 推奨形式:.keras形式(TensorFlow 2.x標準)
💡 覚えておくべき3つのポイント
# 1. モデル全体を保存 model.save(‘my_model.keras’) # 2. モデルを読み込み loaded_model = load_model(‘my_model.keras’) # 3. Google Driveに保存(Colab対策) from google.colab import drive drive.mount(‘/content/drive’) model.save(‘/content/drive/MyDrive/my_model.keras’)
🚀 次のステップへ

モデルの保存と読み込みを習得したので、次のSTEP 10では逆伝播(Backpropagation)の理論を学びます。

ニューラルネットワークがどのように学習するのか、その仕組みを理解しましょう!

📝 練習問題

問題1 やさしい

model.save()で保存される情報

model.save()で保存される情報として、含まれないものを選んでください。

  • A. モデルのアーキテクチャ(層の構造)
  • B. 学習した重み
  • C. 訓練データ
  • D. オプティマイザの状態
正解:C

model.save()で保存される情報

model.save()は訓練データを保存しません

【model.save()で保存される情報】 ✅ A. モデルのアーキテクチャ(層の構造) ✅ B. 学習した重み(パラメータ) ❌ C. 訓練データ(保存されない) ✅ D. オプティマイザの状態(Adamの内部状態など) ✅ コンパイル情報(損失関数、評価指標) 訓練データはモデルファイルには含まれません。 データは別途管理する必要があります。
問題2 やさしい

保存形式の推奨

TensorFlow 2.xで推奨されるモデルの保存形式はどれですか?

  • A. .pkl形式
  • B. .keras形式
  • C. .csv形式
  • D. .json形式
正解:B

.keras形式が推奨される理由

  • TensorFlow 2.xの新しい標準形式
  • モデル全体を1つのファイルに保存
  • 読み込みが簡単
# 推奨される保存方法 model.save(‘my_model.keras’) # 従来の形式(.h5)も使える model.save(‘my_model.h5’)
問題3 ふつう

重みのみの保存

save_weights()で重みを保存した後、読み込む際に必要なことは何ですか?

  • A. 何もしなくてよい
  • B. 同じ構造のモデルを定義してからload_weights()を呼ぶ
  • C. 異なる構造のモデルでもload_weights()で読み込める
  • D. Google Driveにマウントする
正解:B

重み読み込みの手順

# 1. save_weights()で保存 model.save_weights(‘my_weights.weights.h5′) # 2. 読み込み時:まず同じ構造のモデルを定義 new_model = Sequential([ Flatten(input_shape=(28, 28)), Dense(128, activation=’relu’), # 元と同じ構造 Dense(64, activation=’relu’), Dense(10, activation=’softmax’) ]) # 3. 重みを読み込み new_model.load_weights(‘my_weights.weights.h5′) # 4. コンパイルも必要 new_model.compile(optimizer=’adam’, loss=’categorical_crossentropy’)

注意:モデル構造が異なるとエラーになります。

問題4 ふつう

Google Colabでの保存

Google Colabでセッションが切れてもモデルを失わないためには、どこに保存すべきですか?

  • A. /content/フォルダ
  • B. /tmp/フォルダ
  • C. /content/drive/MyDrive/フォルダ(Google Drive)
  • D. デスクトップ
正解:C

Google Driveに保存する理由

【各フォルダの特徴】 /content/ → Colabのデフォルトフォルダ → セッション終了で消える ❌ /tmp/ → 一時フォルダ → セッション終了で消える ❌ /content/drive/MyDrive/(Google Drive) → セッション終了しても残る ✅ → 次回のセッションで読み込める ✅
# Google Driveへの保存方法 from google.colab import drive drive.mount(‘/content/drive’) model.save(‘/content/drive/MyDrive/my_model.keras’)
問題5 むずかしい

model.save()とsave_weights()の使い分け

以下の場面で、save_weights()の方が適しているのはどれですか?

  • A. 学習したモデルをそのまま本番環境で使いたい
  • B. 事前学習済みの重みを別のモデル構造に転用したい
  • C. 追加学習のために途中の状態を保存したい
  • D. 同僚にモデルを共有したい
正解:B

使い分けの指針

【model.save()が適している場面】 ✅ A. 本番環境で使いたい → 構造も含めて保存 ✅ C. 追加学習したい → オプティマイザ状態も保存 ✅ D. 共有したい → すぐに使える状態で共有 【save_weights()が適している場面】 ✅ B. 重みを別のモデルに転用したい → 転移学習で事前学習済みの重みだけを使う → モデル構造を変更したい場合 例:VGG16の重みを、自分のカスタムモデルに転用
# 転移学習での使用例 # VGG16の重みを取得して、一部の層だけ使う from tensorflow.keras.applications import VGG16 # 事前学習済みの重みを持つVGG16 base_model = VGG16(weights=’imagenet’, include_top=False) # 自分のモデルに組み込む # → この場合、重みだけを転用している
📝

学習メモ

ディープラーニング基礎 - Step 9

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE