Path: blob/master/site/ja/tutorials/keras/save_and_load.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
モデルの保存と復元
モデルの進行状況は、トレーニング中およびトレーニング後に保存できます。モデルが中断したところから再開できるので、長いトレーニング時間を回避できます。また、保存することによりモデルを共有したり、他の人による作業の再現が可能になります。研究モデルや手法を公開する場合、ほとんどの機械学習の実践者は次を共有します。
モデルを構築するプログラム
モデルのトレーニング済みモデルの重みやパラメータ
このデータを共有することで、他の人がモデルがどの様に動作するかを理解したり、新しいデータに試してみたりすることが容易になります。
注意: TensorFlow モデルはコードであり、信頼できないコードに注意する必要があります。詳細については、TensorFlow を安全に使用するをご覧ください。
オプション
TensorFlow モデルを保存するには、使用している API に応じて様々な方法があります。このガイドでは、TensorFlow でモデルのビルドとトレーニングを行う tf.keras という高レベル API を使用しています。このチュートリアルで使用されている新しい高レベル .keras
形式は、堅牢で効率的な名前ベースの保存方法を提供しており、通常、低レベルやレガシー形式よりも簡単にデバッグできるため、Keras オブジェクトの保存に推奨されています。より高度な保存またはシリアル化ワークフロー、特にカスタムオブジェクトが関わるワークフローについては、「Keras モデルを保存して読み込む」ガイドをご覧ください。他のアプローチについては、「SavedModel 形式の使用」ガイドをご覧ください。
セットアップ
インストールとインポート
TensorFlow をインストールし、依存関係インポートします。
サンプルデータセットの取得
ここでは、重みの保存と読み込みをデモするために、MNIST データセットを使います。デモの実行を速くするため、最初の 1,000 件のサンプルだけを使います。
モデルの定義
簡単なシーケンシャルモデルを構築することから始めます。
トレーニング中にチェックポイントを保存する
再トレーニングせずにトレーニング済みモデルを使用したり、トレーニングプロセスを中断したところから再開することもできます。tf.keras.callbacks.ModelCheckpoint
コールバックを使用すると、トレーニング中でもトレーニングの終了時でもモデルを継続的に保存できます。
チェックポイントコールバックの使い方
トレーニング中にのみ重みを保存する tf.keras.callbacks.ModelCheckpoint
コールバックを作成します。
この結果、エポックごとに更新される一連のTensorFlowチェックポイントファイルが作成されます。
2 つのモデルが同じアーキテクチャを共有している限り、それらの間で重みを共有できます。したがって、重みのみからモデルを復元する場合は、元のモデルと同じアーキテクチャでモデルを作成してから、その重みを設定します。
次に、トレーニングされていない新しいモデルを再構築し、テストセットで評価します。トレーニングされていないモデルは、偶然誤差(10% 以下の正解率)で実行されます。
次に、チェックポイントから重みをロードし、再び評価します。
チェックポイントコールバックのオプション
このコールバックには、チェックポイントに一意な名前をつけたり、チェックポイントの頻度を調整するためのオプションがあります。
新しいモデルをトレーニングし、5 エポックごとに一意な名前のチェックポイントを保存します。
次に、できあがったチェックポイントをレビューし、最新のものを選択します。
注意: デフォルトの TensorFlow 形式では、最新の 5 つのチェックポイントのみが保存されます。
テストのため、モデルをリセットし最新のチェックポイントを読み込みます。
これらのファイルは何?
上記のコードは、バイナリ形式でトレーニングされた重みのみを含む checkpoint 形式のファイルのコレクションに重みを格納します。チェックポイントには、次のものが含まれます。
1 つ以上のモデルの重みのシャード。
どの重みがどのシャードに格納されているかを示すインデックスファイル。
一台のマシンでモデルをトレーニングしている場合は、接尾辞が .data-00000-of-00001
のシャードが 1 つあります。
手動で重みを保存する
tf.keras.Model.save_weights
を使用して、手動で重みを保存します。デフォルトでは、tf.keras
、特に Model.save_weights
メソッドは、.ckpt
拡張子を持つ TensorFlow Checkpoint 形式を使用します。.h5
拡張して HDF5 形式として保存するには、モデルを保存して読み込むガイドをご覧ください。
モデル全体を保存する
tf.keras.Model.save
を呼び出して、単一の model.keras
zip アーカイブに、モデルのアーキテクチャ、重み、およびトレーニング構成を保存します。
モデル全体の保存は、3 つの異なる形式(新しい .keras
形式と 2 つのレガシー形式: SavedModel
と HDF5
)で行えます。path/to/model.keras
として保存すると、自動的に最新の形式で保存されます。
注意: Keras オブジェクトについては、新しい高レベルの .keras
形式を使用することが推奨されています。よりリッチで名前ベースの保存と再読み込みを行えるため、デバッグしやすいのが特徴です。既存のコードについては、低レベルの SavedModel 形式とレガシーの H5 形式が引き続きサポートされています。
次の方法で、SavedModel 形式に切り替えることができます。
save_format='tf'
をsave()
に渡す拡張子なしでファイル名を渡す
次の方法で H5 形式に切り替えることができます。
save_format='h5'
をsave()
に渡す.h5
で終わるファイル名を渡す
Saving a fully-functional model is very useful—you can load them in TensorFlow.js (Saved Model, HDF5) and then train and run them in web browsers, or convert them to run on mobile devices using TensorFlow Lite (Saved Model, HDF5)
*Custom objects (for example, subclassed models or layers) require special attention when saving and loading. Refer to the Saving custom objects section below.
新しい高レベルの .keras
形式
新しい Keras v3 保存形式は .keras
拡張を使用し、名前ベースの保存を実装するよりシンプルで効率的な形式であるため、Python の観点から、読み込んだものが実際に保存したものであることが保証されます。これにより、デバッグをはるかに容易に行えるため、Keras に推奨される形式となっています。
以下のセクションは、.keras
形式でモデルを保存し、復元する方法を説明しています。
.keras
zip アーカイブからフレッシュな Keras モデルを再読み込みします。
読み込まれたモデルで評価と予測を実行してみましょう。
SavedModel 形式
SavedModel 形式は、モデルをシリアル化するもう 1 つの方法です。この形式で保存されたモデルは、tf.keras.models.load_model
を使用して復元でき、TensorFlow Serving と互換性があります。SavedModel をサービングおよび検査する方法についての詳細は、SavedModel ガイドを参照してください。以下のセクションでは、モデルを保存および復元する手順を示します。
SavedModel 形式は、protobuf バイナリと TensorFlow チェックポイントを含むディレクトリです。保存されたモデルディレクトリを調べます。
保存したモデルから新しい Keras モデルを再度読み込みます。
復元されたモデルは、元のモデルと同じ引数でコンパイルされます。読み込まれたモデルで評価と予測を実行してみてください。
HDF5 形式
Keras には、HDF5 標準を使用した基本的なレガシーの高レベル保存形式が備わっています。
保存したファイルを使ってモデルを再作成します。
正解率を検査します。
Keras は、アーキテクチャを検査することでモデルを保存します。この手法ではすべてが保存されます。
重みの値
モデルのアーキテクチャ
モデルのトレーニング構成(
.compile()
メソッドに渡すもの)あれば、オプティマイザとその状態(中断した所からトレーニングを再開するため)
Keras は v1.x
(tf.compat.v1.train
にあります) のオプティマイザを保存できません。これらはチェックポイントと互換性がないためです。v1.x のオプティマイザでは、オプティマイザの状態を読み込ませてモデルを再度コンパイルする必要があります。
カスタムオブジェクトの保存
SavedModel 形式を使用している場合は、このセクションを省略できます。高レベルの .keras
/HDF5 形式と低レベルの SavedModel 形式の違いは、.keras
/HDF5 形式はオブジェクト構成を使用してモデルアーキテクチャを保存するのに対し、SavedModel は実行グラフを保存するという点です。したがって、SavedModel は、元のコードがなくても、サブクラス化されたモデルやカスタムレイヤーなどのカスタムオブジェクトを保存することができます。ただしこれにより、低レベルの SavedModels のデバッグはより困難であるため、名前ベースで、Keras ネイティブであるという特性を備えた高レベルの .keras
形式を代わりに使用することをお勧めします。
カスタムオブジェクトを .keras
と HDF5 に保存するには、以下を実行します。
オブジェクトで
get_config
メソッドを定義し、オプションでfrom_config
クラスメソッドを定義します。get_config(self)
は、オブジェクトの再作成に必要なパラメータの JSON シリアル化可能なディクショナリを返します。from_config(cls, config){/code0 }は、<code data-md-type="codespan">get_config
から返された構成を使用して新しいオブジェクトを作成します。デフォルトでは、この関数は構成を初期化 kwargs (return cls(**config)
) として使用します。
以下のいずれかの方法で、カスタムオブジェクトをモデルに渡します。
@tf.keras.utils.register_keras_serializable
デコレータを使ってカスタムオブジェクトを登録します。(推奨)モデルを読み込むときに、オブジェクトを直接
custom_objects
引数に渡します。引数は、文字列クラス名を Python クラスにマッピングするディクショナリである必要があります。(例:tf.keras.models.load_model(path, custom_objects={'CustomLayer': CustomLayer})
)tf.keras.utils.custom_object_scope
を使用します。custom_objects
ディクショナリ引数にオブジェクトを含め、範囲内にtf.keras.models.load_model(path)
呼び出しを配置します。
カスタムオブジェクトと get_config
の例については、レイヤーとモデルを最初から作成するチュートリアルをご覧ください。