TensorFlowでのモデルの保存と復元を解説しています。
さらに、復元したモデルを利用して、分析まで行います。
コピペで利用可能なPythonのサンプルコードも載せています。
そのため、簡単にTensorFlowにおけるモデルの保存と復元を検証できます。
基本的には、公式のマニュアルに従います。
https://www.tensorflow.org/tutorials/keras/save_and_load?hl=ja
マニュアルから必要な部分をピックアップしながら、以下の手順で説明していきます。
本記事の内容
- ライブラリのインストール
- ライブラリのインポート
- サンプルデータセットの取得
- モデルの定義・学習
- モデルの保存
- モデルの復元
- 復元したモデルの利用
それでは、上記に沿って解説を行っていきます。
ライブラリのインストール
pip install -q pyyaml h5py
一つ注意が必要です。
このコマンドを実行すると、何も表示されません。
おそらく、成功した場合は何も表示されないはずです。
通常pipでインストールを行うと、インストール過程が表示されます。
しかし、「-q」をオプションにつけると何も表示されません。
pip –helpで調べると以下のように説明があります。
-q, --quiet Give less output. Option is additive, and can be used up to 3 times (corresponding to WARNING, ERROR, and CRITICAL logging levels).
インストールされたかどうか不安な場合は、pip listで確認しましょう。
h5py 2.10.0 ~ PyYAML 5.3.1
問題なくインストールされていますね。
ライブラリのインポート
import tensorflow as tf from tensorflow import keras if __name__ == "__main__": print(tf.version.VERSION)
問題なければ、利用しているTensorFlowのバージョンが表示されます。
2.3.0
私は、比較的新しいものをインストールしています。
マニュアルと同じバージョンです。
サンプルデータセットの取得
実際に学習させたモデルを保存・復元します。
そのため、そのモデルを学習させるためにデータを用意する必要があります。
ここは良く使われる「MNIST dataset 」の出番です。
ただし、全部は使わずに最初の1000件とします。
あくまで、モデルの保存・復元の検証がメインです。
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data() train_labels = train_labels[:1000] test_labels = test_labels[:1000] train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0 test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.0
モデルの定義・学習
まずは、モデル定義の関数を作成します。
# 短いシーケンシャルモデルを返す関数 def create_model(): model = tf.keras.models.Sequential([ keras.layers.Dense(512, activation='relu', input_shape=(784,)), keras.layers.Dropout(0.2), keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) return model
上記で作成した関数を利用して、モデルを定義。
そのモデルにMNISTのサンプルデータを食わせます。
# 新しいモデルのインスタンスを作成して訓練 model = create_model() model.fit(train_images, train_labels, epochs=5)
モデルの保存
モデルの保存形式には、次の2種類があります。
- SavedModel フォーマット
- HDF5ファイル
SavedModel フォーマット
事前にsaved_modelのディレクトリを作成しておいてください。
# モデル全体を SavedModel として保存 model.save('saved_model/my_model')
上記で作成すると、saved_modelディレクトリの下にmy_modelディレクトリが作成されます。
my_modelディレクトリには以下のモノが作成されています。
HDF5ファイル
# HDF5 ファイルにモデル全体を保存 # 拡張子 '.h5' はモデルが HDF5 で保存されているということを暗示する model.save('saved_model/my_model.h5')
上記で作成すると、saved_modelディレクトリの下にmy_model.h5ファイルが作成されます。
saved_modelディレクトリには、以下の状態です。
SavedModel フォーマットのところで作成した、ディレクトリがありますね。
ここまでのコードをまとめると、以下となります。
import tensorflow as tf from tensorflow import keras # 短いシーケンシャルモデルを返す関数 def create_model(): model = tf.keras.models.Sequential([ keras.layers.Dense(512, activation='relu', input_shape=(784,)), keras.layers.Dropout(0.2), keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) return model if __name__ == "__main__": print(tf.version.VERSION) (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data() train_labels = train_labels[:1000] test_labels = test_labels[:1000] train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0 test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.0 # 新しいモデルのインスタンスを作成して訓練 model = create_model() model.fit(train_images, train_labels, epochs=5) # モデル全体を SavedModel として保存 model.save('saved_model/my_model') # HDF5 ファイルにモデル全体を保存 # 拡張子 '.h5' はモデルが HDF5 で保存されているということを暗示する #model.save('saved_model/my_model.h5')
モデルの復元
復元自体は、次のコードで簡単にできます。
SavedModel フォーマットなら作成したディレクトリ「saved_model/my_model」を指定します。
new_model = tf.keras.models.load_model('saved_model/my_model')
HDF5ファイルなら作成したファイル「saved_model/my_model.h5」を指定します。
new_model = tf.keras.models.load_model('saved_model/my_model.h5')
復元したモデルの利用
復元したものを利用してこそ、モデルを保存する意味があります。
保存したモデルを利用しているコードは以下。
import tensorflow as tf if __name__ == "__main__": (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data() train_labels = train_labels[:1000] test_labels = test_labels[:1000] train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0 test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.0 # 同じモデルを読み込んで、重みやオプティマイザーを含むモデル全体を再作成 new_model = tf.keras.models.load_model('saved_model/my_model') #new_model = tf.keras.models.load_model('saved_model/my_model.h5') # 正解率を検査 loss, acc = new_model.evaluate(test_images, test_labels, verbose=2) print("Restored model, accuracy: {:5.2f}%".format(100*acc))
このコードの実行結果は以下。
32/32 - 0s - loss: 0.4259 - accuracy: 0.0840 Restored model, accuracy: 8.40%
かなり低い正解率ですが、利用できていますね。
結果はどうあれ、モデルの保存・利用はこれでOK。