web-dev-qa-db-ja.com

すべての関数に@ tf.functionを使用する必要がありますか?

_@tf.function_の 公式チュートリアル はこう言っています:

最高のパフォーマンスを得て、モデルをどこにでもデプロイできるようにするには、tf.functionを使用してプログラムからグラフを作成します。 AutoGraphのおかげで、意外な量のPythonコードがtf.functionで機能するだけですが、まだ注意すべき落とし穴があります。

主な要点と推奨事項は次のとおりです。

  • Pythonオブジェクトの変更やリストの追加などの副作用に依存しないでください。
  • tf.functionは、NumPy演算やPythonプリミティブではなく、TensorFlow演算で最もよく機能します。
  • 疑問がある場合は、for x in yイディオムを使用してください。

_@tf.function_注釈付き関数を実装する方法についてのみ言及し、それを使用するwhenについては言及していません。

少なくとも_tf.function_を使用して関数に注釈を付ける必要があるかどうかを判断する方法にヒューリスティックはありますか?副作用を取り除いたり、range()-> tf.range()のようなものを変更したりしないのでない限り、それをしない理由はないようです。しかし、私がこれをするつもりなら...

すべての関数で_@tf.function_を使用しない理由はありますか?

9
problemofficer

tf.functionは計算グラフの作成と使用に役立ちます。それらはトレーニングとデプロイメントで使用する必要がありますが、ほとんどの関数では必要ありません。

より大きなモデルの一部となる特別なレイヤーを構築しているとしましょう。 tf.functionデコレーターをそのレイヤーを構成する関数の上に配置したくないのは、レイヤーがどのように見えるかの定義にすぎないからです。

一方、予測を行うか、関数を使用してトレーニングを継続するとします。実際に計算グラフを使用して値を取得しているため、デコレータtf.functionが必要になります。

素晴らしい例は、エンコーダー/デコーダーモデルの構築です。エンコーダー、デコーダー、または任意のレイヤーを作成する関数の周りにデコレーターを配置しないでください。これは、それが何をするかの定義にすぎません。 「train」または「predict」メソッドの周りにデコレータを配置してください。これらは実際に計算グラフを使用して計算を行うためです。

2
Drew