📋 このステップで学ぶこと
なぜモデルの保存が重要なのか?
モデル全体の保存(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)
# 自分のモデルに組み込む
# → この場合、重みだけを転用している
×
artnasekai
#artnasekai #学習メモ