【超簡単】TensorFlowにおけるモデルの保存・復元・再利用

【超簡単】TensorFlowにおけるモデルの保存・復元・再利用 機械学習

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。

タイトルとURLをコピーしました