Copyright 2018 The TensorFlow Authors.
TensorFlow 1 のコードを TensorFlow 2 に移行する
本ドキュメントは、低レベル TensorFlow API のユーザーを対象としています。高レベル API(tf.keras
)をご使用の場合は、コードを TensorFlow 2.x と完全互換にするためのアクションはほとんどまたはまったくありません。
オプティマイザのデフォルトの学習率を確認してください。
メトリクスが記録される「名前」が変更されている可能性があることに注意してください。
TensorFlow 2.x で 1.X のコードを未修正で実行することは、(contrib を除き)依然として可能です。
しかし、これでは TensorFlow 2.0 で追加された改善の多くを活用できません。このガイドでは、コードのアップグレード、さらなる単純化、パフォーマンス向上、そしてより容易なメンテナンスについて説明します。
自動変換スクリプト
このドキュメントで説明される変更を実装する前に行うべき最初のステップは、アップグレードスクリプトを実行してみることです。
これはコードを TensorFlow 2.x にアップグレードする際の初期パスとしては十分ですが、v2 特有のコードに変換するわけではありません。コードは依然として tf.compat.v1
エンドポイントを使用して、プレースホルダー、セッション、コレクション、その他 1.x スタイルの機能へのアクセスが可能です。
トップレベルの動作の変更
tf.compat.v1.disable_v2_behavior()
を使用することで TensorFlow 2.x でコードが機能する場合でも、対処すべきグローバルな動作の変更があります。主な変更点は次のとおりです。
Eager execution、
v1.enable_eager_execution()
: 暗黙的にtf.Graph
を使用するコードは失敗します。このコードは必ずwith tf.Graph().as_default()
コンテキストでラップしてください。リソース変数、
v1.enable_resource_variables()
: 一部のコードは、TensorFlow 参照変数によって有効化される非決定的な動作に依存する場合があります。 リソース変数は書き込み中にロックされるため、より直感的な一貫性を保証します。これによりエッジケースでの動作が変わる場合があります。
これにより余分なコピーが作成されるため、メモリ使用量が増える可能性があります。
これを無効にするには、
use_resource=False
をtf.Variable
コンストラクタに渡します。
テンソルの形状、
v1.enable_v2_tensorshape()
: TensorFlow 2.x は、テンソルの形状の動作を簡略化されており、t.shape[0].value
の代わりにt.shape[0]
とすることができます。簡単な変更なので、すぐに修正しておくことをお勧めします。例については TensorShape をご覧ください。制御フロー、
v1.enable_control_flow_v2()
: TensorFlow 2.x 制御フローの実装が簡略化されたため、さまざまなグラフ表現を生成します。問題が生じた場合には、バグを報告してください。
TensorFlow 2.x のコードを作成する
このガイドでは、TensorFlow 1.x のコードを TensorFlow 2.x に変換するいくつかの例を確認します。これらの変更によって、コードがパフォーマンスの最適化および簡略化された API 呼び出しを活用できるようになります。
それぞれのケースのパターンは次のとおりです。
1. v1.Session.run
呼び出しを置き換える
すべての v1.Session.run
呼び出しは、Python 関数で置き換える必要があります。
feed_dict
およびv1.placeholder
は関数の引数になります。fetch
は関数の戻り値になります。Eager execution では、
pdb
などの標準的な Python ツールを使用して、変換中に簡単にデバッグできます。
次に、tf.function
デコレータを追加して、グラフで効率的に実行できるようにします。 この機能についての詳細は、AutoGraph ガイドをご覧ください。
注意点:
v1.Session.run
とは異なり、tf.function
は固定のリターンシグネチャを持ち、常にすべての出力を返します。これによってパフォーマンスの問題が生じる場合は、2 つの個別の関数を作成します。tf.control_dependencies
または同様の演算は必要ありません。tf.function
は、記述された順序で実行されたかのように動作します。たとえば、tf.Variable
割り当てとtf.assert
は自動的に実行されます。
「モデルを変換する」セクションには、この変換プロセスの実際の例が含まれています。
2. Python オブジェクトを変数と損失の追跡に使用する
TensorFlow 2.x では、いかなる名前ベースの変数追跡もまったく推奨されていません。 変数の追跡には Python オブジェクトを使用します。
v1.get_variable
の代わりに tf.Variable
を使用してください。
すべてのv1.variable_scope
は Python オブジェクトに変換が可能です。通常は次のうちの 1 つになります。
tf.keras.layers.Layer
tf.keras.Model
tf.Module
tf.Graph.get_collection(tf.GraphKeys.VARIABLES)
などの変数のリストを集める必要がある場合には、Layer
および Model
オブジェクトの .variables
と .trainable_variables
属性を使用します。
これら Layer
クラスと Model
クラスは、グローバルコレクションの必要性を除去した別のプロパティを幾つか実装します。.losses
プロパティは、tf.GraphKeys.LOSSES
コレクション使用の置き換えとなります。
詳細は Keras ガイドをご覧ください。
警告 : 多くの tf.compat.v1
シンボルはグローバルコレクションを暗黙的に使用しています。
3. トレーニングループをアップグレードする
ご利用のユースケースで動作する最高レベルの API を使用してください。独自のトレーニングループを構築するよりも tf.keras.Model.fit
の選択を推奨します。
これらの高レベル関数は、独自のトレーニングループを書く場合に見落とされやすい多くの低レベル詳細を管理します。例えば、それらは自動的に正則化損失を集めて、モデルを呼び出す時にtraining=True
引数を設定します。
4. データ入力パイプラインをアップグレードする
データ入力には tf.data
データセットを使用してください。それらのオブジェクトは効率的で、表現力があり、TensorFlow とうまく統合します。
次のように、tf.keras.Model.fit
メソッドに直接渡すことができます。
また、標準的な Python で直接にイテレートすることもできます。
5. compat.v1
シンボルを移行する
tf.compat.v1
モジュールには、元のセマンティクスを持つ完全な TensorFlow 1.x API が含まれています。
TensorFlow 2 アップグレードスクリプトは、変換が安全な場合、つまり v2 バージョンの動作が完全に同等であると判断できる場合は、シンボルを 2.0 と同等のものに変換します。(たとえば、これらは同じ関数なので、v1.arg_max
の名前を tf.argmax
に変更します。)
コードの一部を使用してアップグレードスクリプトを実行した後に、compat.v1
が頻出する可能性があります。 コードを調べ、それらを手動で同等の v2 のコードに変換する価値はあります。(該当するものがある場合には、ログに表示されているはずです。)
モデルを変換する
低レベル変数 & 演算子実行
低レベル API の使用例を以下に示します。
変数スコープを使用して再利用を制御する。
v1.get_variable
で変数を作成する。コレクションに明示的にアクセスする。
次のようなメソッドでコレクションに暗黙的にアクセスする。
v1.global_variables
v1.losses.get_regularization_loss
v1.placeholder
を使用してグラフ入力のセットアップをする。Session.run
でグラフを実行する。変数を手動で初期化する。
変換前
TensorFlow 1.x を使用したコードでは、これらのパターンは以下のように表示されます。
変換後
変換されたコードでは :
変数はローカル Python オブジェクトです。
forward
関数は依然として計算を定義します。Session.run
呼び出しはforward
への呼び出しに置き換えられます。パフォーマンス向上のためにオプションで
tf.function
デコレータを追加可能です。どのグローバルコレクションも参照せず、正則化は手動で計算されます。
セッションやプレースホルダーはありません。
tf.layers
ベースのモデル
v1.layers
モジュールは、変数を定義および再利用するv1.variable_scope
に依存するレイヤー関数を含めるために使用されます。
変換前
変換後
レイヤーの単純なスタックが
tf.keras.Sequential
にぴったり収まります。(より複雑なモデルについてはカスタムレイヤーとモデルおよび Functional API をご覧ください。)モデルが変数と正則化損失を追跡します。
v1.layers
からtf.keras.layers
への直接的なマッピングがあるため、変換は一対一対応でした。
ほとんどの引数はそのままです。しかし、以下の点は異なります。
training
引数は、それが実行される時点でモデルによって各レイヤーに渡されます。元の
model
関数への最初の引数(入力x
)はなくなりました。これはオブジェクトレイヤーがモデルの呼び出しからモデルの構築を分離するためです。
また以下にも注意してください。
tf.contrib
からの初期化子の正則化子を使用している場合は、他よりも多くの引数変更があります。コードはコレクションに書き込みを行わないため、
v1.losses.get_regularization_loss
などの関数はそれらの値を返さなくなり、トレーニングループが壊れる可能性があります。
変数とv1.layers
の混在
既存のコードは低レベルの TensorFlow 1.x 変数と演算子に高レベルのv1.layers
が混ざっていることがよくあります。
変換前
変換後
このコードを変換するには、前の例で示したレイヤーからレイヤーへのマッピングのパターンに従います。
一般的なパターンは次の通りです。
__init__
でレイヤーパラメータを収集する。build
で変数を構築する。call
で計算を実行し、結果を返す。
v1.variable_scope
は事実上それ自身のレイヤーです。従ってtf.keras.layers.Layer
として書き直します。詳細はガイドをご覧ください。
注意点:
サブクラス化された Keras モデルとレイヤーは v1 グラフ(自動制御依存性なし)と eager モードの両方で実行される必要があります。
call()
をtf.function()
にラップして、AutoGraph と自動制御依存性を得るようにします。
training
引数を受け取ってcall
することを忘れないようにしてください。それは
tf.Tensor
である場合があります。それは Python ブール型である場合があります。
self.add_weight()
を使用して、コンストラクタまたはModel.build
でモデル変数を作成します。Model.build
では、入力形状にアクセスできるため、適合する形状で重みを作成できます。tf.keras.layers.Layer.add_weight
を使用すると、Keras が変数と正則化損失を追跡できるようになります。
オブジェクトに
tf.Tensors
を保持してはいけません。それらは
tf.function
または eager コンテキスト内のいずれかで作成される可能性がありますが、それらのテンソルは異なる振る舞いをします。状態には
tf.Variable
を使用してください。これは常に両方のコンテキストから使用可能です。tf.Tensors
は中間値専用です。
Slim & contrib.layers に関する注意
古い TensorFlow 1.x コードの大部分は Slim ライブラリを使用しており、これはtf.contrib.layers
として TensorFlow 1.x でパッケージ化されていました。 contrib
モジュールに関しては、TensorFlow 2.x ではtf.compat.v1
内でも、あっても利用できなくなりました。Slim を使用したコードの TensorFlow 2.x への変換は、v1.layers
を使用したレポジトリの変換よりも複雑です。現実的には、まず最初に Slim コードをv1.layers
に変換してから Keras に変換するほうが賢明かもしれません。
arg_scopes
を除去します。すべての引数は明示的である必要があります。それらを使用する場合、
normalizer_fn
とactivation_fn
をそれら自身のレイヤーに分割します。分離可能な畳み込みレイヤーは 1 つまたはそれ以上の異なる Keras レイヤー(深さ的な、ポイント的な、分離可能な Keras レイヤー)にマップします。
Slim と
v1.layers
には異なる引数名とデフォルト値があります。一部の引数には異なるスケールがあります。
Slim 事前トレーニング済みモデルを使用する場合は、
tf.keras.applications
から Keras 事前トレーニング済みモデル、または元の Slim コードからエクスポートされた TensorFlow ハブの TensorFlow 2 SavedModel をお試しください。
一部のtf.contrib
レイヤーはコアの TensorFlow に移動されていない可能性がありますが、代わりに TensorFlow アドオンパッケージに移動されています。
トレーニング
tf.keras
モデルにデータを供給する方法は沢山あります。それらは Python ジェネレータと Numpy 配列を入力として受け取ります。
モデルへのデータ供給方法として推奨するのは、データ操作用の高パフォーマンスクラスのコレクションを含むtf.data
パッケージの使用です。
依然としてtf.queue
を使用している場合、これらは入力パイプラインとしてではなく、データ構造としてのみサポートされます。
データセットを使用する
TensorFlow Dataset パッケージ(tfds
)には、事前定義されたデータセットをtf.data.Dataset
オブジェクトとして読み込むためのユーティリティが含まれています。
この例として、tfds
を使用して MNISTdataset を読み込んでみましょう。
次に、トレーニング用のデータを準備します。
各画像をリスケールする。
例の順序をシャッフルする。
画像とラベルのバッチを集める。
例を短く保つために、データセットをトリミングして 5 バッチのみを返すようにします。
Keras トレーニングループを使用する
トレーニングプロセスの低レベル制御が不要な場合は、Keras 組み込みのfit
、evaluate
、predict
メソッドの使用が推奨されます。これらのメソッドは(シーケンシャル、関数型、またはサブクラス化)実装を問わず、モデルをトレーニングするための統一インターフェースを提供します。
これらのメソッドには次のような優位点があります。
Numpy 配列、Python ジェネレータ、
tf.data.Datasets
を受け取ります。正則化と活性化損失を自動的に適用します。
マルチデバイストレーニングのために
tf.distribute
をサポートします。任意の callable は損失とメトリクスとしてサポートします。
tf.keras.callbacks.TensorBoard
のようなコールバックとカスタムコールバックをサポートします。自動的に TensorFlow グラフを使用し、高性能です。
ここにDataset
を使用したモデルのトレーニング例を示します。(この機能ついての詳細はチュートリアルをご覧ください。)
ループを自分で書く
Keras モデルのトレーニングステップは動作していても、そのステップの外でより制御が必要な場合は、データ イテレーション ループでtf.keras.Model.train_on_batch
メソッドの使用を検討してみてください。
tf.keras.callbacks.Callback
として、多くのものが実装可能であることに留意してください。
このメソッドには前のセクションで言及したメソッドの優位点の多くがありますが、外側のループのユーザー制御も与えます。
tf.keras.Model.test_on_batch
またはtf.keras.Model.evaluate
を使用して、トレーニング中のパフォーマンスをチェックすることも可能です。
注意: train_on_batch
とtest_on_batch
は、デフォルトで単一バッチの損失とメトリクスを返します。reset_metrics=False
を渡すと累積メトリックを返しますが、必ずメトリックアキュムレータを適切にリセットすることを忘れないようにしてくだい。また、AUC
のような一部のメトリクスは正しく計算するためにreset_metrics=False
が必要なことも覚えておいてください。
上のモデルのトレーニングを続けます。
トレーニングステップをカスタマイズする
より多くの柔軟性と制御を必要とする場合、独自のトレーニングループを実装することでそれが可能になります。以下の 3 つのステップを踏みます。
Python ジェネレータか
tf.data.Dataset
をイテレートして例のバッチを作成します。tf.GradientTape
を使用して勾配を集めます。tf.keras.optimizers
の 1 つを使用して、モデルの変数に重み更新を適用します。
留意点:
サブクラス化されたレイヤーとモデルの
call
メソッドには、常にtraining
引数を含めます。training
引数を確実に正しくセットしてモデルを呼び出します。使用方法によっては、モデルがデータのバッチ上で実行されるまでモデル変数は存在しないかもしれません。
モデルの正則化損失などを手動で処理する必要があります。
v1 と比べて簡略化されている点に注意してください :
変数初期化子を実行する必要はありません。作成時に変数は初期化されます。
たとえ
tf.function
演算が eager モードで振る舞う場合でも、手動の制御依存性を追加する必要はありません。
新しいスタイルのメトリクスと損失
TensorFlow 2.x では、メトリクスと損失はオブジェクトです。Eager で実行的にtf.function
内で動作します。
損失オブジェクトは呼び出し可能で、(y_true, y_pred) を引数として期待します。
メトリックオブジェクトには次のメソッドがあります 。
Metric.update_state()
— 新しい観測を追加するMetric.result()
— 観測値が与えられたとき、メトリックの現在の結果を得るMetric.reset_states()
— すべての観測をクリアする
オブジェクト自体は呼び出し可能です。呼び出しはupdate_state
と同様に新しい観測の状態を更新し、メトリクスの新しい結果を返します。
メトリックの変数を手動で初期化する必要はありません。また、TensorFlow 2.x は自動制御依存性を持つため、それらについても気にする必要はありません。
次のコードは、メトリックを使用してカスタムトレーニングループ内で観測される平均損失を追跡します。
TensorFlow 2.x では、Keras モデルはメトリクス名の処理に関してより一貫性があります。
メトリクスリストで文字列を渡すと、まさにその文字列がメトリクスのname
として使用されます。これらの名前はmodel.fit
によって返される履歴オブジェクトと、keras.callbacks
に渡されるログに表示されます。これはメトリクスリストで渡した文字列に設定されています。
これはmetrics=["accuracy"]
を渡すとdict_keys(['loss', 'acc'])
になっていた、以前のバージョンとは異なります。
Keras オプティマイザ
v1.train.AdamOptimizer
やv1.train.GradientDescentOptimizer
などのv1.train
内のオプティマイザは、tf.keras.optimizers
内に同等のものを持ちます。
v1.train
をkeras.optimizers
に変換する
オプティマイザを変換する際の注意事項を次に示します。
オプティマイザをアップグレードすると、古いチェックポイントとの互換性がなくなる可能性があります。
epsilon のデフォルトはすべて
1e-8
ではなく1e-7
になりました。(これはほとんどのユースケースで無視できます。)v1.train.GradientDescentOptimizer
はtf.keras.optimizers.SGD
で直接置き換えが可能です。v1.train.MomentumOptimizer
はモメンタム引数(tf.keras.optimizers.SGD(..., momentum=...)
)を使用してSGD
オプティマイザで直接置き換えが可能です。v1.train.AdamOptimizer
を変換してtf.keras.optimizers.Adam
を使用することが可能です。beta1
引数とbeta2
引数の名前は、beta_1
とbeta_2
に変更されています。v1.train.RMSPropOptimizer
はtf.keras.optimizers.RMSprop
に変換可能です。decay
引数の名前はrho
に変更されています。v1.train.AdadeltaOptimizer
はtf.keras.optimizers.Adadelta
に直接変換が可能です。tf.train.AdagradOptimizer
はtf.keras.optimizers.Adagrad
に直接変換が可能です。tf.train.FtrlOptimizer
はtf.keras.optimizers.Ftrl
に直接変換が可能です。accum_name
およびlinear_name
引数は削除されています。tf.contrib.AdamaxOptimizer
とtf.contrib.NadamOptimizer
はtf.keras.optimizers.Adamax
とtf.keras.optimizers.Nadam
に直接変換が可能です。beta1
引数とbeta2
引数の名前は、beta_1
とbeta_2
に変更されています。
TensorBoard
TensorFlow 2 には、TensorBoard で視覚化するための要約データを記述するために使用されるtf.summary
API の大幅な変更が含まれています。新しいtf.summary
の概要については、TensorFlow 2 API を使用した複数のチュートリアルがあります。これには、TensorBoard TensorFlow 2 移行ガイドも含まれています。
保存と読み込み
チェックポイントの互換性
TensorFlow 2.x はオブジェクトベースのチェックポイントを使用します。
古いスタイルの名前ベースのチェックポイントは、注意を払えば依然として読み込むことができます。コード変換プロセスは変数名変更という結果になるかもしれませんが、回避方法はあります。
最も単純なアプローチは、チェックポイント内の名前と新しいモデルの名前を揃えて並べることです。
変数にはすべて依然として設定が可能な
name
引数があります。Keras モデルはまた
name
引数を取り、それらの変数のためのプレフィックスとして設定されます。v1.name_scope
関数は、変数名のプレフィックスの設定に使用できます。これはtf.variable_scope
とは大きく異なります。これは名前だけに影響するもので、変数と再利用の追跡はしません。
ご利用のユースケースで動作しない場合は、v1.train.init_from_checkpoint
を試してみてください。これはassignment_map
引数を取り、古い名前から新しい名前へのマッピングを指定します。
注意 : 読み込みを遅延できるオブジェクトベースのチェックポイントとは異なり、名前ベースのチェックポイントは関数が呼び出される時に全ての変数が構築されていることを要求します。一部のモデルは、build
を呼び出すかデータのバッチでモデルを実行するまで変数の構築を遅延します。
TensorFlow Estimatorリポジトリには事前作成された Estimator のチェックポイントを TensorFlow 1.X から 2.0 にアップグレードするための変換ツールが含まれています。これは、同様のユースケースのツールを構築する方法の例として有用な場合があります。
保存されたモデルの互換性
保存されたモデルには、互換性に関する重要な考慮事項はありません。
TensorFlow 1.x saved_models は TensorFlow 2.x で動作します。
TensorFlow 2.x saved_models は全ての演算がサポートされていれば TensorFlow 1.x で動作します。
Graph.pb または Graph.pbtxt
未加工のGraph.pb
ファイルを TensorFlow 2.x にアップグレードする簡単な方法はありません。確実な方法は、ファイルを生成したコードをアップグレードすることです。
ただし、「凍結グラフ」(変数が定数に変換されたtf.Graph
)がある場合、v1.wrap_function
を使用してconcrete_function
への変換が可能です。
たとえば、次のような凍結された Inception v1 グラフ(2016 年)があります。
tf.GraphDef
を読み込みます。
これをconcrete_function
にラップします。
入力としてテンソルを渡します。
Estimator
Estimator でトレーニングする
Estimator は TensorFlow 2.0 でサポートされています。
Estimator を使用する際には、TensorFlow 1.x. からのinput_fn()
、tf.estimator.TrainSpec
、tf.estimator.EvalSpec
を使用できます。
ここに train と evaluate specs を伴う input_fn
を使用する例があります。
input_fn と train/eval specs を作成する
Keras モデル定義を使用する
TensorFlow 2.x で Estimator を構築する方法には、いくつかの違いがあります。
モデルは Keras を使用して定義することを推奨します。次にtf.keras.estimator.model_to_estimator
ユーティリティを使用して、モデルを Estimator に変更します。次のコードは Estimator を作成してトレーニングする際に、このユーティリティをどのように使用するかを示します。
注意 : Keras で重み付きメトリクスを作成し、model_to_estimator
を使用してそれらを Estimator API で重み付きメトリクスを変換することはサポートされません。それらのメトリクスは、add_metrics
関数を使用して Estimator 仕様で直接作成する必要があります。
カスタム model_fn
を使用する
保守する必要がある既存のカスタム Estimator model_fn
を持つ場合には、model_fn
を変換して Keras モデルを使用できるようにすることが可能です。
しかしながら、互換性の理由から、カスタムmodel_fn
は依然として1.x スタイルのグラフモードで動作します。これは eager execution はなく自動制御依存性もないことも意味します。
注意: 長期的には、特にカスタムの model_fn
を使って、tf.estimator
から移行することを計画する必要があります。代替の API は tf.keras
と tf.distribute
です。トレーニングの一部に Estimator
を使用する必要がある場合は、tf.keras.estimator.model_to_estimator
コンバータを使用して keras.Model
から Estimator
を作成する必要があります。
最小限の変更で model_fn をカスタマイズする
TensorFlow 2.0 でカスタムmodel_fn
を動作させるには、既存のコードの変更を最小限に留めたい場合、optimizers
やmetrics
などのtf.compat.v1
シンボルを使用することができます。
カスタムmodel_fn
で Keras モデルを使用することは、それをカスタムトレーニングループで使用することに類似しています。
mode
引数を基に、training
段階を適切に設定します。モデルの
trainable_variables
をオプティマイザに明示的に渡します。
しかし、カスタムループと比較して、重要な違いがあります。
Model.losses
を使用する代わりにModel.get_losses_for
を使用して損失を抽出します。Model.get_updates_for
を使用してモデルの更新を抽出します。
注意 : 「更新」は各バッチの後にモデルに適用される必要がある変更です。例えば、layers.BatchNormalization
レイヤーの平均と分散の移動平均などです。
次のコードはカスタムmodel_fn
から Estimator を作成し、これらの懸念事項をすべて示しています。
TensorFlow 2.x シンボルでmodel_fn
をカスタマイズする
TensorFlow 1.x シンボルをすべて削除し、カスタムmodel_fn
をネイティブの TensorFlow 2.x にアップグレードする場合は、オプティマイザとメトリクスをtf.keras.optimizers
とtf.keras.metrics
にアップグレードする必要があります。
カスタムmodel_fn
では、上記の変更に加えて、さらにアップグレードを行う必要があります。
v1.train.Optimizer
の代わりにtf.keras.optimizers
を使用します。損失が呼び出し可能(関数など)な場合は、
Optimizer.minimize()
を使用してtrain_op/minimize_op
を取得します。train_op/minimize_op
を計算するには、損失がスカラー損失
Tensor
(呼び出し不可)の場合は、Optimizer.get_updates()
を使用します。返されるリストの最初の要素は目的とするtrain_op/minimize_op
です。損失が呼び出し可能(関数など)な場合は、
Optimizer.minimize()
を使用してtrain_op/minimize_op
を取得します。
評価には
tf.compat.v1.metrics
の代わりにtf.keras.metrics
を使用します。
上記のmy_model_fn
の例では、2.0 シンボルの移行されたコードは次のように表示されます。
事前作成された Estimator
tf.estimator.DNN*
、tf.estimator.Linear*
、 tf.estimator.DNNLinearCombined*
のファミリーに含まれる事前作成された Estimator は、依然として TensorFlow 2.0 API でもサポートされていますが、一部の引数が変更されています。
input_layer_partitioner
: v2 で削除されました。loss_reduction
:tf.compat.v1.losses.Reduction
の代わりにtf.keras.losses.Reduction
に更新されました。デフォルト値もtf.compat.v1.losses.Reduction.SUM
からtf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE
に変更されています。optimizer
、dnn_optimizer
、linear_optimizer
: これらの引数はtf.compat.v1.train.Optimizer
の代わりにtf.keras.optimizers
に更新されています。
上記の変更を移行するには :
TensorFlow 2.x では
配布戦略
が自動的に処理するため、input_layer_partitioner
の移行は必要ありません。loss_reduction
についてはtf.keras.losses.Reduction
でサポートされるオプションを確認してください。optimizer
引数の場合:optimizer
、dnn_optimizer
、またはlinear_optimizer
引数を渡さない場合、または 2)optimizer
引数をstring
としてコードに指定しない場合、デフォルトでtf.keras.optimizers
が使用されるため、何も変更する必要はありません。
optimizer
引数については、optimizer
、dnn_optimizer
、linear_optimizer
引数を渡さない場合、またはoptimizer
引数をコード内の内のstring
として指定する場合は、何も変更する必要はありません。デフォルトでtf.keras.optimizers
を使用します。それ以外の場合は、tf.compat.v1.train.Optimizer
から対応するtf.keras.optimizers
に更新する必要があります。
チェックポイントコンバータ
tf.keras.optimizers
は異なる変数セットを生成してチェックポイントに保存するするため、keras.optimizers
への移行は TensorFlow 1.x を使用して保存されたチェックポイントを壊してしまいます。TensorFlow 2.x への移行後に古いチェックポイントを再利用できるようにするには、チェックポイントコンバータツールをお試しください。
ツールにはヘルプが組み込まれています。
以下に TensorFlow 1.x と TensorFlow 2.x 間の違いを示します。
TensorFlow 1.x で次を使っていた場合:
Then do this in TensorFlow 2.x:
TensorFlow 1.x で次を使っていた場合:
TensorFlow 2.0 では次のようにします:
TensorFlow 1.x で次を使っていた場合(またはその他の次元のメソッドを使用していた場合):
TensorFlow 2.0 では次のようにします:
tf.TensorShape
のブール型の値は、階数がわかっている場合は True
で、そうでない場合はFalse
です。
その他の変更点
tf.colocate_with
を削除する : TensorFlow のデバイス配置アルゴリズムが大幅に改善されたため、これはもう必要ありません。削除したことによってパフォーマンスが低下する場合には、バグを報告してください。v1.ConfigProto
の使用をtf.config
の同等の関数に置き換える。
まとめ
全体のプロセスは次のとおりです。
アップグレードスクリプトを実行する。
contrib シンボルを除去する。
モデルをオブジェクト指向スタイル (Keras) に切り替える。
可能なところでは
tf.keras
またはtf.estimator
トレーニングと評価ループを使用する。そうでない場合はカスタムループを使用してよいが、セッションとコレクションを回避すること。
コードを慣用的な TensorFlow 2.0 に変換するには少し作業を要しますが、変更するごとに次のような結果が得られます。
コード行が減少する。
明瞭さと簡略性が向上する。
デバッグが容易になる。