TensorFlow 2.0+によるモデルの保存と読み込みのやり方を解説する

スポンサーリンク

今回は、TensorFlow 2.0+を使ったモデルの読み込み保存について説明します。

この記事は、深層学習プロジェクトにTensorFlowを使い始めたばかりの人を対象とした初中級者向けの記事です。

スポンサーリンク

なぜモデルを保存する必要があるのでしょうか?

ディープラーニングの初心者が犯す非常によくある間違いの1つは、モデルを保存していないことです。

学習中と学習後の両方でディープラーニングモデルを保存することは良い習慣です。

時間の節約になりますし、モデルの再現性も高まります。

以下は、モデルを保存するために考慮すべきいくつかの理由です。

  • 数百万のパラメータと巨大なデータセットを持つ最新の深層学習モデルのトレーニングは、計算と時間の面で高価になる可能性があります。さらに、異なるトレーニングで異なる結果/精度を得ることができます。そのため、その場でトレーニングするのではなく、結果を表示するために保存されたモデルを使用することは常に良いアイデアです。
  • 同じモデルの異なるバージョンを保存することで、モデルの動作を検査し理解することができます。
  • 同じコンパイル済みのモデルを、TensorFlowをサポートする異なる言語やプラットフォームで使用することができます。TensorFlow LiteやTensorFlow JSなど、TensorFlowをサポートする異なる言語やプラットフォームで、コードを変換することなく、同じコンパイル済みモデルを使用できます。

TensorFlowでは、モデルを保存する方法がいくつか用意されています。

次のセクションで、それらすべてを詳しく説明します。

トレーニング中にモデルを保存する方法は?

モデルの学習中にモデルの重みを保存しておくことが重要な場合があります。

あるエポック以降に結果に異常があった場合、チェックポイントを使えば、モデルの以前の状態を調べたり、復元することも容易になります。

TensorFlowのモデルは Model.train() 関数を用いて学習される。

このとき、tf.keras.callbacks.ModelCheckpoint()を使ってモデルのチェックポイントコールバックを定義し、コンパイラに一定のエポック間隔でモデルの重みを保存するように指示する必要がある。

コールバックは難しそうに聞こえますが、使い方としては難しくありません。

以下はその使用例です。

# This is the initialization block of code
# Not important for understanding the saving
# But to execute the next cells containing the code
# for saving and loading
 
import tensorflow as tf
from tensorflow import keras
 
# We define a dummy sequential model.
# This function to create a model will be used throughout the article
 
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)
  ])
 
  model.compile(optimizer='adam',
                loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
                metrics=[tf.metrics.SparseCategoricalAccuracy()])
 
  return model
 
# Create a basic model instance
model = create_model()
 
# Get the dataset
 
(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
# Create a new model using the function
model = create_model()
 
# Specify the checkpoint file
# We use the str.format() for naming files according to epoch
checkpoint_path = "training_2/cp-{epoch:04d}.ckpt"
 
# Get the directory of checkpoint
checkpoint_dir = os.path.dirname(checkpoint_path)
 
# Define the batch size
batch_size = 32
 
# Create a callback that saves the model's weights every 5 epochs
cp_callback = tf.keras.callbacks.ModelCheckpoint(
    filepath=checkpoint_path,
    verbose=1,
    save_weights_only=True,
    save_freq=5*batch_size)
 
 
# Save the weights using the `checkpoint_path` format
model.save_weights(checkpoint_path.format(epoch=0))
 
# Train the model with the the checkpoint callback
model.fit(train_images, train_labels,
          epochs=50,
          batch_size=batch_size,
          callbacks=[cp_callback],
          verbose=0)

チェックポイントからの読み込み

モデルを使用して作成したチェックポイントを復元したい場合、 model.load_weights() 関数を使用することができます。

以下は、重みをロードするためのシンタックスと例です。

# Syntax
 
model.load_weights("<path the checkpoint file(*.cpt)>")
 
# Example
 
# Finds the latest checkpoint
latest = tf.train.latest_checkpoint(checkpoint_dir)
 
# Create a new model
model = create_model()
 
# Load the weights of the latest checkpoint
model.load_weights(latest)

学習済みモデルの重みを保存する

学習後、モデルを保存することもできます。

学習中のチェックポイントに比べれば、比較的簡単な処理です。

モデルの学習後に重みのファイルを保存するには,Model.save_weights()関数を使用します.使用例は以下の通りです.

# Save the weights
model.save_weights('./checkpoints/my_checkpoint')
 
# Create a new model instance
model = create_model()
 
# Restore the weights
model.load_weights('./checkpoints/my_checkpoint')

学習済みモデルの重みをロードする

重みからモデルを読み込むには、チェックポイントの重みを読み込むのと同じように Model.load_weights() を利用します。

# Restore the weights
model.load_weights('./checkpoints/my_checkpoint')

モデル全体の保存と読み込み

前のセクションで、モデルの重みを保存する方法を見ました。

これにはある問題があります。

モデルの重みをモデルにロードする前に、モデルが定義されていなければなりません。

実際のモデルと重みをロードしたいモデルの間に構造的な違いがあると、エラーが発生する可能性があります。

さらに、この重みの保存方法は、異なるプラットフォーム間でモデルを使用したい場合に難しくなります。

例えば、pythonで学習したモデルをTensorFlow JSを使ってブラウザで使いたい場合です。

このような場合、モデル全体、つまり構造を重みと一緒に保存する必要があるかもしれません。

TensorFlowでは、Model.save()という関数を使ってモデルを保存することができます。

以下はその例です。

# Save the whole model in SaveModel format
 
model.save('my_model')

TensorFlowでは、HDF5形式でモデルを保存することも可能です。

HDF5形式で保存するには、拡張子hdf5でファイル名を記述してください。

# Save the model in hdf5 format
 
# The .h5 extension indicates that the model is to be saved in the hdf5 extension.
model.save('my_model.h5')

注:HDF5はTensorFlowで主流になる前にKerasで使用されていたものです。

TensorFlowはSaveModel形式を使用しており、常に推奨される新しい形式を使用することをお勧めします。

保存されたモデルは tf.keras.models.load_model() で読み込むことができる。

この関数は、モデルがSaveModel形式とhdf5形式のどちらで保存されているかを自動的に判別します。

以下はその例です。

# For both hdf5 format and SaveModel format use the appropriate path to the file
 
# SaveModel Format
loaded_model = tf.keras.models.load_model('my_model')
 
# HDF5 format
loaded_model = tf.keras.models.load_model('my_model.h5')

まとめ

これでこのチュートリアルは終わりです。

これで、学習プロセスでモデルの保存と読み込みができるようになったかと思います。

PyTorch、TensorFlow、JAXなどのディープラーニングフレームワークについてもっと学びたい方は、ご期待ください。

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