Path: blob/master/site/ja/guide/effective_tf2.ipynb
38719 views
Copyright 2020 The TensorFlow Authors.
効果的な TensorFlow 2
概要
このガイドでは、TensorFlow 2(TF2)を使ってコードを記述する際のベストプラクティスを紹介しています。最近 TensorFlow 1(TF1)から切り替えたユーザーを対象としています。TF1 コードから TF2 への移行についての詳細は、このガイドの移行セクションをご覧ください。
セットアップ
このガイドの例に使用する TensorFlow とその他の依存関係をインポートします。
慣用的な TensorFlow 2 の推奨事項
コードを小さなモジュールにリファクタリングする
コードを、必要に応じて呼び出せるより小さな関数にリファクタリングすることをお勧めします。最高のパフォーマンスを得るには、tf.function で行える最も大きな計算ブロックをデコレートするとよいでしょう(tf.function が呼び出すネストされた Python 関数には、tf.function に異なる jit_compile 設定を使用しない限り、別途独自のデコレーションは不要であることに注意してください)。ユースケースに応じて、複数のトレーニングステップであったり、トレーニングループ全体である場合があります。推論のユースケースについては、単一モデルのフォワードパスである場合があります。
一部の tf.keras.optimizer のデフォルトの学習速度を調整する
TF2 では、一部の Keras オプティマイザの学習速度が異なります。モデルの収束の動作に変化がある場合は、デフォルトの学習速度を確認してください。
optimizers.SGD、optimizers.Adam、または optimizers.RMSprop に変更はありません。
デフォルトの学習率は次のように変更されました。
optimizers.Adagrad0.01から0.001へoptimizers.Adadelta1.0から0.001へoptimizers.Adamax0.002から0.001へoptimizers.Nadam0.002から0.001へ
tf.Module と Keras レイヤーを使用して変数を管理する
tf.Module と tf.keras.layers.Layer には、すべての従属変数を帰属的に収集する便利な variables と trainable_variables プロパティがあります。このため、変数が使用されている場所での変数の管理を簡単に行うことができます。
Keras レイヤー/モデルは tf.train.Checkpointable から継承し、@tf.function と統合されています。このため、Keras オブジェクトに直接チェックポイントを設定したり、SavedModels をエクスポートしたりすることができます。この統合を利用するために、Keras の Model.fit API を必ずしも使用する必要はありません。
Keras を使用して関連する変数のサブセットを収集する方法については、Keras ガイドの転移学習とファインチューニングに関するセクションをご覧ください。
tf.data.Dataset と tf.function を組み合わせる
TensorFlow Datasets パッケージ(tfds)には、事前定義済みのデータセットを tf.data.Dataset オブジェクトとして読み込むためのユーティリティが含まれます。この例では、tfds を使用して MNIST データセットを読み込めます。
次に、トレーニングのためのデータを準備します。
各画像をリスケールする。
例の順序をシャッフルする。
画像とラベルのバッチを集める。
例を短く保つために、データセットを 5 バッチだけ返すようにトリミングします。
メモリに収まるトレーニングデータは、通常の Python イテレーションでイテレートしますが、そうでない場合は tf.data.Dataset を使ってディスクからトレーニングをストリーミングするのが最適です。データセットはイテラブル(イテレータではない)であり、Eager モードの Python インテラブルとまったく同様に機能します。コードを tf.function でラップすることで、データセットの非同期プリフェッチ/ストリーム機能をそのまま利用することができます。この方法は、Python イテレーションを、同等の、AutoGraph を使用したグラフ演算に置き換えます。
Keras の Model.fit API を使用する場合、データセットのイテレーションを気にする必要はありません。
Keras トレーニングループを使用する
トレーニングプロセスの低レベル制御が不要な場合は、Keras 組み込みの fit、evaluate、および predict メソッドの使用が推奨されます。これらのメソッドは(シーケンシャル、関数型、またはサブクラス化)実装を問わず、モデルをトレーニングするための統一インターフェースを提供します。
これらのメソッドには次のような優位点があります。
Numpy 配列、Python ジェネレータ、
tf.data.Datasetsを受け取ります。これらは正則化と活性化損失を自動的に適用します。
ハードウェア構成に関係なくトレーニングコードが変化しない
tf.distributeをサポートします。任意の callable は損失とメトリクスとしてサポートします。
tf.data.Datasetsのようなコールバックとカスタムコールバックをサポートします。自動的に TensorFlow グラフを使用し、高性能です。
ここに Dataset を使用したモデルのトレーニング例を示します。この仕組みについての詳細は、チュートリアルをご覧ください。
トレーニングをカスタマイズして独自のループを記述する
Keras モデルは機能しても、トレーニングステップまたは外側のトレーニングループに柔軟性と制御がさらに必要な場合は、独自のトレーニングステップやトレーニングループ全体を実装することができます。詳細については、Keras ガイドのfit のカスタマイズをご覧ください。
様々な機能を tf.keras.callbacks.Callback として実装することもできます。
この方法には、前述した多数のメリットがありますが、トレーニングステップだけでなく、外側のループを制御することができます。
標準のトレーニングループには、以下の 3 つのステップがあります。
Python ジェネレータか
tf.data.Datasetsをイテレーションして例のバッチを作成します。tf.GradientTapeを使用して勾配を集めます。tf.keras.optimizersの 1 つを使用して、モデルの変数に重み更新を適用します。
覚えておきましょう:
サブクラス化されたレイヤーとモデルの
callメソッドには、常にtraining引数を含めます。training引数を確実に正しくセットしてモデルを呼び出します。使用方法によっては、モデルがデータのバッチ上で実行されるまでモデル変数は存在しないかもしれません。
モデルの正則化損失などを手動で処理する必要があります。
変数イニシャライザを実行したり、手動制御の依存関係を追加したりする必要はありません。自動制御依存関係と変数の初期化は、作成時に tf.function によって処理されます。
Python 制御フローで tf.function を利用する
tf.function は、データに依存する制御フローを tf.cond や tf.while_loop といったグラフモード相当のフローに変換する方法を提供しています。
データ依存の制御フローがよく見られる場所に、シーケンスモデルが挙げられます。tf.keras.layers.RNN は RNN セルをラップするため、静的または動的にリカレンスを展開することができます。例として、動的な展開を次のように実装しなおすことができます。
詳細は、tf.function ガイドをご覧ください。
新しいスタイルのメトリクスと損失
メトリクスと損失は、Eager と tf.function で動作するオブジェクトです。
損失オブジェクトは呼び出し可能で、(y_true, y_pred) を引数として期待します。
メトリクスを使用してデータの収集と表示を行う
tf.metrics を使ってデータを集計し、tf.summary を使ってサマリーをログに記録してから、コンテキストマネージャーを使ってライターにリダイレクトすることができます。サマリーはライターに直接送信されるため、コールサイトにstep 値を提供する必要があります。
サマリーとしてデータをログに記録する前にデータを集計するには、tf.metrics を使用します。メトリクスはステートフルです。つまり、値を蓄積し、result メソッド(Mean.result など)が呼び出されたときに累積結果を返します。累積された値は、Model.reset_states を使用すると消去されます。
TensorBoard をサマリーログのディレクトリにポイントし、生成されたサマリーを可視化します。
tf.summary API を使用して、TensorBoard での可視化に使用するサマリーデータを記述します。詳細については、tf.summary ガイドをご覧ください。
デバッグ
Eager execution を使用してコードをステップごとに実行すると、形状、データ型、および値を検査することができます。tf.function や tf.keras などの特定の API は、パフォーマンスや移植性の目的で、Graph execution を使用するように設計されていますが、デバッグの際は、tf.config.run_functions_eagerly(True) を使って、このコード内で Eager execution を使用することができます。
以下に例を示します。
これは Keras モデルや、Eager execution をサポートするほかの API 内でも機能します。
注意:
fit、evaluate、predictなどのtf.keras.Modelは、内部ではtf.functionを使ってグラフとして実行します。tf.keras.Model.compileを使用する場合は、run_eagerly = Trueに設定して、Modelロジックがtf.functionにラップされないようにします。tf.data.experimental.enable_debug_modeを使用して、tf.dataのデバッグモードを有効化します。詳細は、API ドキュメントをご覧ください。
オブジェクトに tf.Tensors を保持しないこと
これらのテンソルオブジェクトは、tf.function または Eager のコンテキストで作成される可能性があり、これらのテンソルは異なった振る舞いをします。tf.Tensor は必ず中間値のみに使用してください。
状態を追跡するには、tf.Variable を使用してください。これらはいずれのコンテキストからも常に使用可能です。詳細については、tf.Variable ガイドをご覧ください。
TensorFlow.org で表示
Google Colab で実行
GitHub で表示
ノートブックをダウンロード