Path: blob/master/site/ja/guide/keras/save_and_serialize.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
Kerasモデルの保存と読み込み
重み値のみを保存。(通常、モデルのトレーニング時に使用)。
from tensorflow import keras model = keras.models.load_model('path/to/location')
モデルに含まれるレイヤーとそれらの接続方法を指定するアーキテクチャまたは構成。
重み値のセット(「モデルの状態」)。
オプティマイザ(モデルのコンパイルによって定義されます)。
損失とメトリックのセット(モデルをコンパイルするか、
add_loss()
またはadd_metric()
を呼び出すことにより定義されます)。
セットアップ
import numpy as npimport tensorflow as tffrom tensorflow import keras
tf.keras.models.load_model()
重み値のみを保存します。 これは通常、モデルのトレーニング時に使用されます。
例:
モデルの保存と読み込み方法
このガイドを読む時間が 10 秒しかない場合は、次のことを知っておく必要があります。
Keras モデルの保存
モデルの読み込み
詳細を見てみましょう。
セットアップ
モデル全体の保存と読み込み
モデル全体を1つのアーティファクトとして保存できます。その場合、以下が含まれます。
モデルのアーキテクチャ/構成
モデルの重み値(トレーニング時に学習される)
モデルのコンパイル情報(
compile()
が呼び出された場合)あれば、オプティマイザとその状態(中断した所からトレーニングを再開するため)
API
model.save()
またはtf.keras.models.save_model()
tf.keras.models.load_model()
モデル全体をディスクに保存するには TensorFlow SavedModel 形式と古い Keras H5 形式の 2 つの形式を使用できます。推奨される形式は SavedModel です。これは、model.save()
を使用する場合のデフォルトです。
次の方法で H5 形式に切り替えることができます。
save_format='h5'
をsave()
に渡す。.h5
または.keras
で終わるファイル名をsave()
に渡す。
SavedModel 形式
SavedModel は、モデルアーキテクチャ、重み、および呼び出し関数のトレースされた Tensorflow サブグラフを保存する、より包括的な保存形式です。これにより、Keras は組み込みレイヤーとカスタムオブジェクトの両方を復元できます。
例:
SavedModel に含まれるもの
model.save('my_model')
を呼び出すと、以下を含むmy_model
という名前のフォルダが作成されます。
以下は、**config メソッドを上書きせずに **SavedModel 形式からカスタムレイヤーを読み込んだ場合の例です。
SavedModel 形式についての詳細は「SavedModel ガイド(ディスク上の SavedModel 形式)」をご覧ください。
SavedModel によるカスタムオブジェクトの処理
モデルとそのレイヤーを保存する場合、SavedModel 形式はクラス名、呼び出し関数、損失、重み(および実装されている場合は構成)を保存します。呼び出し関数は、モデル/レイヤーの計算グラフを定義します。
モデル/レイヤーの構成がない場合、トレーニング、評価、および推論に使用できる元のモデルのようなモデルを作成するために呼び出し関数が使用されます。
しかしながら、カスタムモデルまたはレイヤークラスを作成する場合は、常に get_config
および from_config
メソッドを使用して定義することをお勧めします。これにより、必要に応じて後で計算を簡単に更新できます。詳細については「カスタムオブジェクト」をご覧ください。
例:
上記の例のように、ローダーは、元のモデルのように機能する新しいモデルクラスを動的に作成します。
SavedModel の構成
TensoFlow 2.4 の新機能引数 save_traces
が model.save
に追加されました。これにより、SavedModel 関数のトレースを切り替えることができます。関数は、Keras が元のクラス定義なしでカスタムオブジェクトを再読み込みできるように保存されるため、save_traces=False
の場合、すべてのカスタムオブジェクトには get_config
/from_config
メソッドが定義されている必要があります。読み込み時に、カスタムオブジェクトを custom_objects
引数に渡す必要があります。save_traces=False
は、SavedModel が使用するディスク容量を削減し、時間を節約します。
Keras H5 形式
Keras は、モデルのアーキテクチャ、重み値、および compile()
情報を含む1つの HDF5 ファイルの保存もサポートしています。これは、SavedModel に代わる軽量な形式です。
例:
制限事項
SavedModel 形式と比較して、H5 ファイルに含まれないものが 2 つあります。
カスタムレイヤーなどのカスタムオブジェクトの計算グラフは、保存されたファイルに含まれません。読み込む際に、Keras はモデルを再構築するためにこれらのオブジェクトの Python クラス/関数にアクセスする必要があります。詳細については、「カスタムオブジェクト」をご覧ください。
tf.keras.models.model_to_json()
およびtf.keras.models.model_from_json()
アーキテクチャの保存
*これは、サブクラス化されたモデルではなく、Functional または Sequential API を使用して定義されたモデルにのみ適用されることに注意してください。
*これは、サブクラス化されたモデルではなく、Functional または Sequential API を使用して定義されたモデルにのみ適用されることに注意してください。
Sequential モデルまたは Functional API モデルの構成
これらのタイプのモデルは、レイヤーの明示的なグラフです。それらの構成は常に構造化された形式で提供されます。
レイヤーの例:
get_config()
およびfrom_config()
tf.keras.models.model_to_json()
およびtf.keras.models.model_from_json()
get_config()
および from_config()
config = model.get_config()
を呼び出すと、モデルの構成を含む Python dict が返されます。その後、同じモデルを Sequential.from_config(config)
(Sequential
モデルの場合)またはModel.from_config(config)
(Functional API モデルの場合)で再度構築できます。
同じワークフローは、シリアル化可能なレイヤーでも使用できます。
レイヤーの例:
Sequential モデルの例:
Functional モデルの例:
例:
これは、get_config
/ from_config
と似ていますが、モデルを JSON 文字列に変換します。この文字列は、元のモデルクラスなしで読み込めます。また、これはモデル固有であり、レイヤー向けではありません。
例:
カスタムオブジェクト
モデルとレイヤー
サブクラス化されたモデルとレイヤーのアーキテクチャは、メソッド __init__
および call
で定義されています。それらは Python バイトコードと見なされ、JSON と互換性のある構成にシリアル化できません。pickle
などを使用してバイトコードのシリアル化を試すことができますが、これは安全ではなく、モデルを別のシステムに読み込むことはできません。
カスタム定義されたレイヤーのあるモデル、またはサブクラス化されたモデルを保存/読み込むには、get_config
および from_config
(オプション)メソッドを上書きする必要があります。さらに、Keras が認識できるように、カスタムオブジェクトの登録を使用する必要があります。
カスタム関数
カスタム定義関数(アクティブ化の損失や初期化など)には、get_config
メソッドは必要ありません。カスタムオブジェクトとして登録されている限り、読み込みには関数名だけで十分です。
TensorFlow グラフのみの読み込み
例:
この方法にはいくつかの欠点があることに注意してください。
tf.saved_model.load
により返されるオブジェクトは、Keras モデルではないので、簡単には使えません。たとえば、.predict()
や.fit()
へのアクセスはありません。tf.saved_model.load
により返されるオブジェクトは、Keras モデルではないため簡単には使えません。例えば、.predict()
や.fit()
へのアクセスはありません。
この方法は推奨されていませんが、カスタムオブジェクトのコードを紛失した場合や tf.keras.models.load_model()
でモデルを読み込む際に問題が発生した場合など、困った状況で役に立ちます。
詳細は、tf.saved_model.load
に関するページをご覧ください。
構成メソッドの定義
仕様
get_config
は、Keras のアーキテクチャおよびモデルを保存する API と互換性があるように、JSON のシリアル化が可能なディクショナリを返す必要があります。カスタムレイヤーと関数の例
TensorFlow グラフのみの読み込み
例:
Keras は構成を生成したクラスについての情報を保持します。上記の例では、tf.keras.layers.serialize
はシリアル化された形態のカスタムレイヤーを生成します。
属性/グラフのエッジは、変数名ではなく、親オブジェクトで使用される名前で命名されていることに注意してください。以下の例のCustomLayer
では、変数CustomLayer.var
は、"var_a"
ではなく、"var"
をキーの一部として保存されます。
読み込み関数で
custom_objects
引数を設定する。(上記の「config メソッドの定義」セクションの例をご覧ください)tf.keras.utils.custom_object_scope
またはtf.keras.utils.CustomObjectScope
tf.keras.utils.register_keras_serializable
カスタムレイヤーと関数の例
例:
with keras.utils.custom_object_scope(custom_objects): new_model = keras.models.clone_model(model)
例:
転移学習を行う場合。以前のモデルの状態を再利用して新しいモデルをトレーニングするため、以前のモデルのコンパイル情報は必要ありません。
モデルの重みのみを保存および読み込むように選択できます。これは次の場合に役立ちます。
推論のためのモデルだけが必要とされる場合。この場合、トレーニングを再開する必要がないため、コンパイル情報やオプティマイザの状態は必要ありません。
転移学習を行う場合。以前のモデルの状態を再利用して新しいモデルをトレーニングするため、以前のモデルのコンパイル情報は必要ありません。
メモリ内の重み転移のための API
異なるオブジェクト間で重みをコピーするには get_weights
および set_weights
を使用します。
tf.keras.layers.Layer.get_weights()
: numpy 配列のリストを返します。tf.keras.layers.Layer.set_weights()
: モデルの重みをweights
引数の値に設定します。
以下に例を示します。
インメモリで、1 つのレイヤーから別のレイヤーに重みを転送する
インメモリで 1 つのモデルから互換性のあるアーキテクチャを備えた別のモデルに重みを転送する
ステートレスレイヤーの場合
ステートレスレイヤーの場合
重みをディスクに保存して再度読み込むための API
以下の形式で model.save_weights
を呼び出すことにより、重みをディスクに保存できます。
TensorFlow Checkpoint
HDF5
model.save_weights
のデフォルトの形式は TensorFlow Checkpoint です。保存形式を指定する方法は 2 つあります。
save_format
引数: 値をsave_format = "tf"
またはsave_format = "h5"
に設定します。path
引数: パスが.h5
または.hdf5
で終わる場合、HDF5 形式が使用されます。save_format
が設定されていない限り、他のサフィックスでは、TensorFlow Checkpoint になります。
path
引数:パスが.h5
または.hdf5
で終わる場合、HDF5 形式が使用されます。save_format
が設定されていない限り、他のサフィックスでは、TensorFlow Checkpoint になります。
TF Checkpoint 形式
例:
形式の詳細
ネストされたレイヤーがモデルに含まれている場合、layer.trainable
を変更すると、layer.weights
の順序が異なる場合があることに注意してください。
属性/グラフのエッジは、変数名ではなく、親オブジェクトで使用される名前で命名されていることに注意してください。以下の例の CustomLayer
では、変数 CustomLayer.var
は、"var_a"
ではなく、"var"
をキーの一部として保存されます。
転移学習の例
基本的に、2 つのモデルが同じアーキテクチャを持っている限り、同じチェックポイントを共有できます。
例:
通常、モデルの作成には同じ API を使用することをお勧めします。Sequential と Functional、またはFunctional とサブクラス化などの間で切り替える場合は、常に事前トレーニング済みモデルを再構築し、事前トレーニング済みの重みをそのモデルに読み込みます。
では、モデルのアーキテクチャがまったく異なる場合、どうすれば重みを保存して異なるモデルに読み込むことができるのでしょうか?tf.train.Checkpoint
を使用すると、正確なレイヤー/変数を保存および復元することができます。
例:
HDF5 形式
HDF5 形式には、レイヤー名でグループ化された重みが含まれています。重みは、トレーニング可能な重みのリストをトレーニング不可能な重みのリストに連結することによって並べられたリストです(layer.weights
と同じ)。したがって、チェックポイントに保存されているものと同じレイヤーとトレーニング可能な状態がある場合、モデルは HDF 5 チェックポイントを使用できます。
例:
ネストされたレイヤーがモデルに含まれている場合、layer.trainable
を変更すると、layer.weights
の順序が異なる場合があることに注意してください。
転移学習の例
HDF5 から事前トレーニングされた重みを読み込む場合は、元のチェックポイントモデルに重みを読み込んでから、目的の重み/レイヤーを新しいモデルに抽出することをお勧めします。
例: