Path: blob/master/site/ja/guide/effective_tf2.ipynb
25115 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.Adagrad
0.01
から0.001
へoptimizers.Adadelta
1.0
から0.001
へoptimizers.Adamax
0.002
から0.001
へoptimizers.Nadam
0.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
ガイドをご覧ください。