In [ ]:
#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
In [ ]:
#@title MIT License
#
# Copyright (c) 2017 François Chollet
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
Note: これらのドキュメントは私たちTensorFlowコミュニティが翻訳したものです。コミュニティによる 翻訳はベストエフォートであるため、この翻訳が正確であることや英語の公式ドキュメントの 最新の状態を反映したものであることを保証することはできません。 この翻訳の品質を向上させるためのご意見をお持ちの方は、GitHubリポジトリtensorflow/docsにプルリクエストをお送りください。 コミュニティによる翻訳やレビューに参加していただける方は、 docs-ja@tensorflow.org メーリングリストにご連絡ください。
モデルは訓練中にも、訓練が終わったあとも保存できます。このことは、長い訓練時間を掛けなくても、やめたところから再開できるということを意味します。モデルが保存可能であることは、あなたが作ったモデルを他の人と共有できるということでもあります。研究結果であるモデルや手法を公開する際、機械学習の実務家はほとんど次のものを共有します。
このデータを共有することで、他の人がモデルだどの様に動作するかを理解したり、新しいデータに試してみたりすることが容易になります。
注意:信頼できないプログラムには気をつけましょう。TensorFlowのモデルもプログラムです。詳しくは、Using TensorFlow Securelyを参照してください。
TensorFlowのモデルを保存する方法は、使っているAPIによって異なります。このガイドはTensorFlowのモデルを構築し訓練するためのハイレベルなAPIであるtf.kerasを使っています。この他のアプローチについては、TensorFlowの Save and Restore ガイド、あるいは、Saving in eagerを参照してください。
TensorFlowと依存関係のライブラリをインストールし、インポートします。
In [ ]:
!pip install h5py pyyaml
ここでは、モデルを訓練し重みの保存をデモするために、 MNIST dataset を使います。デモの実行を速くするため、最初の1,000件のサンプルだけを使います。
In [ ]:
import os
import tensorflow.compat.v1 as tf
from tensorflow import keras
tf.__version__
In [ ]:
(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
重みの保存と読み込みのデモを行うための簡単なモデルを定義しましょう。
In [ ]:
# 短いシーケンシャルモデルを返す関数
def create_model():
model = tf.keras.models.Sequential([
keras.layers.Dense(512, activation=tf.nn.relu, input_shape=(784,)),
keras.layers.Dropout(rate=0.2),
keras.layers.Dense(10, activation=tf.keras.activations.softmax)
])
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.sparse_categorical_crossentropy,
metrics=['accuracy'])
return model
# 基本的なモデルのインスタンスを作る
model = create_model()
model.summary()
In [ ]:
checkpoint_path = "training_1/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
# チェックポイントコールバックを作る
cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path,
save_weights_only=True,
verbose=1)
model = create_model()
model.fit(train_images, train_labels, epochs = 10,
validation_data = (test_images,test_labels),
callbacks = [cp_callback]) # 訓練にコールバックを渡す
# オプティマイザの状態保存についての警告が表示されるかもしれません。
# これらの警告は(このノートブックで発生する同様な警告を含めて)
# 古い用法を非推奨にするためのもので、無視して構いません。
この結果、エポックごとに更新される一連のTensorFlowチェックポイントファイルが作成されます。
In [ ]:
!ls {checkpoint_dir}
訓練していない新しいモデルを作ります。重みだけからモデルを復元する場合には、元のモデルと同じアーキテクチャのモデルが必要です。モデルのアーキテクチャが同じであるため、モデルの異なるインスタンスであっても重みを共有することができるのです。
訓練していない全く新しいモデルを作り、テストデータセットで評価します。訓練をしていないモデルは偶然のレベル(正解率10%以下)の性能しか無いはずです。
In [ ]:
model = create_model()
loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print("Untrained model, accuracy: {:5.2f}%".format(100*acc))
次に、チェックポイントから重みをロードし、再び評価します。
In [ ]:
model.load_weights(checkpoint_path)
loss,acc = model.evaluate(test_images, test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
In [ ]:
# ファイル名に(`str.format`を使って)エポック数を埋め込みます
checkpoint_path = "training_2/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
cp_callback = tf.keras.callbacks.ModelCheckpoint(
checkpoint_path, verbose=1, save_weights_only=True,
# 重みを5エポックごとに保存します
period=5)
model = create_model()
model.fit(train_images, train_labels,
epochs = 50, callbacks = [cp_callback],
validation_data = (test_images,test_labels),
verbose=0)
次に、出来上がったチェックポイントを確認し、最後のものを選択します。
In [ ]:
! ls {checkpoint_dir}
In [ ]:
latest = tf.train.latest_checkpoint(checkpoint_dir)
latest
注意:デフォルトのtensorflowフォーマットは、直近の5つのチェックポイントのみを保存します。
テストのため、モデルをリセットし最後のチェックポイントをロードします。
In [ ]:
model = create_model()
model.load_weights(latest)
loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
上記のコードでは、重みだけをバイナリでcheckpoint形式の一連のファイルに保存します。チェックポイントには、次のものが含まれます。
1台のマシンだけでモデルの訓練を行っている場合には、.data-00000-of-00001
のようなサフィックスのついたファイルが1つだけ作成されます。
In [ ]:
# 重みの保存
model.save_weights('./checkpoints/my_checkpoint')
# 重みの復元
model = create_model()
model.load_weights('./checkpoints/my_checkpoint')
loss,acc = model.evaluate(test_images, test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
重みの値、モデルの設定、そして(構成によりますが※訳注1)オプティマイザの設定までも含んだモデル全体をファイルに保存することができます。これにより、モデルのある時点の状態を保存し、オリジナルのPythonコードにアクセスしなくとも、中断したところから訓練を再開することができます。
(※訳注1:tf.trainモジュールに含まれるオプティマイザではないオプティマイザを使用しているモデルをHDF5ファイルに保存する場合にはオプティマイザの設定を保存できます。)
完全に機能するモデルを保存できるのは便利です。保存したモデルをTensorFlow.js (HDF5, Saved Model)でロードし、ブラウザで訓練したり、実行したりすることができるほか、TensorFlow Lite (HDF5, Saved Model) を使ってモバイルデバイスで実行できるように変換することも可能です。
Kerasでは、HDF5 標準を使った基本的なファイルフォーマットが利用できます。ここでの利用目的では、保存されたモデルは単独のバイナリラージオブジェクト(blob)として扱うことができます。
In [ ]:
model = create_model()
model.fit(train_images, train_labels, epochs=5)
# モデル全体を1つのHDF5ファイルに保存します。
model.save('my_model.h5')
保存したファイルを使ってモデルを再作成します。
In [ ]:
# 重みとオプティマイザを含む全く同じモデルを再作成
new_model = keras.models.load_model('my_model.h5')
new_model.summary()
正解率を検査します。
In [ ]:
loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
この方法では、次のすべてが保存されます。
Kerasは保存する際にアーキテクチャを調べます。いまのところ、TensorFlowのオプティマイザ(tf.train
に含まれるもの)を保存することはできません。TensorFlowのオプティマイザを使用している場合には、モデルをロードしたあと再コンパイルする必要があり、オプティマイザの状態は失われます。
注意:この手法によるtf.keras
モデルの保存は実験的なもので、将来のバージョンで変更される可能性があります。
新しいモデルを作ります。
In [ ]:
model = create_model()
model.fit(train_images, train_labels, epochs=5)
saved_model
を作成します。
In [ ]:
saved_model_path = tf.contrib.saved_model.save_keras_model(model, "./saved_models")
SavedModel はタイムスタンプ付きのディレクトリに保存されます。
In [ ]:
!ls saved_models/
保存されたモデル(SavedModel)から新しいKerasモデルをリロードします。
In [ ]:
new_model = tf.contrib.saved_model.load_keras_model(saved_model_path)
new_model
復元されたモデルを実行します。
In [ ]:
# モデルを評価する前にコンパイルする必要があります。
# モデルをデプロイするだけであればこのステップは不要です。
new_model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.sparse_categorical_crossentropy,
metrics=['accuracy'])
# モデルを評価します。
loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
tf.keras
を使った保存とロードのクイックガイドでした。
tf.keras guide にはtf.keras
での保存とロードについて、もう少し記載されています
Eager Executionでの保存についてはSaving in eager を参照ください
Save and Restoreガイドには、TensorFlowでの保存についてローレベルの詳細が記載されています