このページは Cloud Translation API によって翻訳されました。
Switch to English

TF 2.0にtf.summary使用の移行

TensorFlow.org上に表示します Googleのコラボで実行します GitHubの上のソースを表示
 import tensorflow as tf
 

TensorFlow 2.0に大幅な変更が含まtf.summary TensorBoardで可視化するためのライト要約データに使用するAPIを。

何が変わったの

それは考えると便利ですtf.summary二つのサブのAPIとしてAPI:

  • 個々の要約を記録するためのOPSのセット- summary.scalar() summary.histogram() summary.image() summary.audio()及びsummary.text() -モデルコードからインラインと呼ばれています。
  • これらの個々の要約を収集し、(TensorBoardが、その後視覚化を生成するために、読み込み)特別な形式のログファイルに書き込みロジックを記述する。

TF 1.xで

二つの半体は手動で一緒に配線されなければならなかった-を介して要約OP出力を取り出すことによってSession.run()と呼び出しFileWriter.add_summary(output, step)v1.summary.merge_all() opは、すべての要約オペアンプの出力を集約するグラフコレクションを使用して、この容易になりますが、このアプローチはまだそれが特にTF 2.0のため不適当作り、熱心に実行し、制御フローのために悪い働きました。

TF 2.xで

二つの半分は、緊密に統合され、現在は個々のtf.summary実行時にOPSはすぐにデータを書き込みます。お使いのモデルコードからAPIを使用すると、まだ馴染みのように見えますが、グラフモードの互換性を維持しながら、それは今熱心実行に優しいです必要があります。 APIの両方の半分を統合することを意味しsummary.FileWriter今TensorFlowの実行コンテキストの一部であり、直接アクセスを取得しますtf.summary作家を設定することは違って見える主要部分であるので、OPS。

熱心な実行、TF 2.0のデフォルトでの使用例:

 writer = tf.summary.create_file_writer("/tmp/mylogs/eager")

with writer.as_default():
  for step in range(100):
    # other model code would go here
    tf.summary.scalar("my_metric", 0.5, step=step)
    writer.flush()
 
 ls /tmp/mylogs/eager
 
events.out.tfevents.1591960770.kokoro-gcp-ubuntu-prod-57818388.17251.5.v2

tf.functionグラフ実行と使用例:

 writer = tf.summary.create_file_writer("/tmp/mylogs/tf_function")

@tf.function
def my_func(step):
  with writer.as_default():
    # other model code would go here
    tf.summary.scalar("my_metric", 0.5, step=step)

for step in tf.range(100, dtype=tf.int64):
  my_func(step)
  writer.flush()
 
 ls /tmp/mylogs/tf_function
 
events.out.tfevents.1591960771.kokoro-gcp-ubuntu-prod-57818388.17251.1013.v2

レガシーTF 1.xのグラフ実行と使用例:

 g = tf.compat.v1.Graph()
with g.as_default():
  step = tf.Variable(0, dtype=tf.int64)
  step_update = step.assign_add(1)
  writer = tf.summary.create_file_writer("/tmp/mylogs/session")
  with writer.as_default():
    tf.summary.scalar("my_metric", 0.5, step=step)
  all_summary_ops = tf.compat.v1.summary.all_v2_summary_ops()
  writer_flush = writer.flush()


with tf.compat.v1.Session(graph=g) as sess:
  sess.run([writer.init(), step.initializer])

  for i in range(100):
    sess.run(all_summary_ops)
    sess.run(step_update)
    sess.run(writer_flush)  
 
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:1666: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.

 ls /tmp/mylogs/session
 
events.out.tfevents.1591960771.kokoro-gcp-ubuntu-prod-57818388.17251.1446.v2

あなたのコードを変換します

既存の変換tf.summary TF 2.0 APIに、使用することは確実に自動化され、そうすることはできませんtf_upgrade_v2スクリプトは、ちょうどすべてにそれを書き換えてtf.compat.v1.summary 。 TF 2.0に移行するには、次のようにコードを適応させる必要があります:

  1. 経由して、既定のライターのセット.as_default()要約OPSを使用するために存在している必要があります

    • グラフ構造でOPSを熱心にOPSを実行または使用して、この手段
    • デフォルトの作家がなければ、要約OPSは、サイレント空命令となり
    • デフォルトの作家は、全体で(まだ)伝播しない@tf.function彼らは機能だけがトレースされたときに検出されている- -実行境界ので、ベストプラクティスは、呼び出すことですwriter.as_default()関数の本体内に、そして確実にするためにそのライターオブジェクト限り存在し続ける@tf.function使用されています
  2. 「ステップ」の値は、を介してオペアンプに渡さなければならないstep引数

    • TensorBoardは、時系列としてデータをレンダリングするステップ値が必要です
    • TF 1.xからグローバル段差が除去されているので、各オペアンプを読み取るために、所望のステップ変数を知らなければならないので、明示的な通過が必要です
    • 定型を低減するために、デフォルトのステップ値を登録するための実験的なサポートは、として入手可能であるtf.summary.experimental.set_step()が、これは予告なく変更することができる暫定的な機能であります
  3. 個々の概要OPSの関数のシグネチャが変更されました

    • 戻り値は現在(要約が実際に書き込まれたかどうかを示す)ブール値です
    • 第2のパラメータ名は、(使用する場合)から変更されたtensordata
    • collectionsパラメータは削除されました。コレクションはTF 1.xののみです
    • familyパラメータは削除されました。ちょうど使用tf.name_scope()
  4. [のみレガシーグラフモード/セッションの実行ユーザーのために]

    • まずでライターを初期化v1.Session.run(writer.init())

    • 使用v1.summary.all_v2_summary_ops()などを経由してそれらを実行するために、現在のグラフのすべてのTF 2.0概要OPSを取得するSession.run()

    • ライターをフラッシュしv1.Session.run(writer.flush())のためにも同様とclose()

あなたのTF 1.xのコードの代わりに使用していた場合はtf.contrib.summary APIをので、それは、TF 2.0 APIにはるかに似ていますtf_upgrade_v2スクリプトを完全にすることはできません任意の使用のための移行手順のほとんど(とEMIT警告やエラーを自動化します移行)。ほとんどの部分については、それだけにAPI呼び出しに書き換えるtf.compat.v2.summary 。あなたが唯一のTFとの互換性が必要な場合2.0+あなたがドロップすることができcompat.v2し、同じようにそれを参照tf.summary

その他のヒント

上記の重要な領域に加えて、いくつかの補助側面も変更されています:

  • (「すべての100個の手順をログ」のような)条件付き記録は、新しい外観を持っています

    • 制御OPSと関連するコード、(熱心モードとで動作し、通常のif文でそれらをラップする@tf.function直筆経由 )またはtf.cond
    • ただ要約を制御するには、新しい使用tf.summary.record_if()コンテキストマネージャを、そしてそれをあなたが選んだのブール条件を渡します
    • これらのTF 1.xのパターンを置き換えます。
 if condition:
  writer.add_summary()
 
  • のは直接書き込みませんtf.compat.v1.Graph -代わりにトレース機能を使用します

    • TF 2.0用途におけるグラフ実行@tf.function代わりに、明示的なグラフの
    • TF 2.0では、新たななぞりスタイルのAPIを使用tf.summary.trace_on()tf.summary.trace_export()実行される関数グラフを記録します
  • LOGDIRあたりのこれ以上の世界的な作家のキャッシングんtf.summary.FileWriterCache

    • (後者はあるためTensorBoardのサポートをユーザーがいずれかのライターオブジェクトの共有/自分のキャッシュを実装、またはちょうど別のライターを使用する必要があります進行中
  • イベントファイルのバイナリ表現が変更されました

    • TensorBoard 1.xのは、すでに新しいフォーマットをサポートしています。この違いは、手動でのみイベントファイルから要約データを解析しているユーザーに影響します
    • 要約データについてテンソルバイトとして記憶されます。あなたが使用することができますtf.make_ndarray(event.summary.value[0].tensor) numpyのに変換します