web-dev-qa-db-ja.com

TensorFlow 2でTensorBoardに書き込む方法

私はTensorFlow 1.xに精通しており、次のプロジェクトではTensorFlow 2に切り替えることを検討しています。 熱心な実行でTensorBoardログにスカラーを書き込む方法を理解するのに問題があります カスタムトレーニングループ を使用します。

問題の説明

Tf1では、いくつかのサマリーオペレーション(保存するものごとに1つのオペレーション)を作成し、それを単一のオペレーションにマージし、そのマージされたオペレーションをセッション内で実行し、FileWriterオブジェクトを使用してこれをファイルに書き込みます。 sesstf.Session()であると仮定すると、これがどのように機能するかの例を以下に示します。

_# While defining our computation graph, define summary ops:
# ... some ops ...
tf.summary.scalar('scalar_1', scalar_1)
# ... some more ops ...
tf.summary.scalar('scalar_2', scalar_2)
# ... etc.

# Merge all these summaries into a single op:
merged = tf.summary.merge_all()

# Define a FileWriter (i.e. an object that writes summaries to files):
writer = tf.summary.FileWriter(log_dir, sess.graph)

# Inside the training loop run the op and write the results to a file:
for i in range(num_iters):
    summary, ... = sess.run([merged, ...], ...)
    writer.add_summary(summary, i)
_

問題は、tf2にセッションがもう存在しないことです。この機能を実現するために、積極的な実行を無効にしたくないのです。 公式ドキュメント はtf1用に書かれており、Tensorboard kerasコールバックを使用することをお勧めします。ただし、私の知る限り、これはmodel.fit(...)を使用してモデルをトレーニングし、 カスタムトレーニングループ を使用しない場合にのみ機能します。

私が試したこと

  • セッション外の_tf.summary_関数のtf1バージョン。 FileWriter、merge_opsなどはtf2に存在しないため、これらの関数の組み合わせは明らかに失敗します。
  • この中程度の投稿 は、tf.summary()を含む一部のtensorflow APIに「クリーンアップ」があったことを示しています。彼らは_from tensorflow.python.ops.summary_ops_v2_の使用を提案していますが、これは機能していないようです。これは 暗黙 _record_summaries_every_n_global_steps_を使用します。これについては後で詳しく説明します。
  • 他の一連の投稿 12 、は、_tf.contrib.summary_および_tf.contrib.FileWriter_の使用を提案しています。ただし、_tf.contrib_ コアTensorFlowリポジトリおよびビルドプロセスから削除されました
  • 公式リポジトリからのTensorFlow v2ショーケース 。これは、前に述べた_tf.contrib_とともに_record_summaries_every_n_global_steps_要約を再び使用します。これを機能させることもできませんでした(contribライブラリを使用しなくても)。

tl; dr

私の質問は:

  • TensroFlow 2で_tf.summary_を適切に使用する方法はありますか?
  • そうでない場合、カスタムトレーニングループ(model.fit()ではない)を使用しているときに、TensorFlow 2でTensorBoardログを書き込む別の方法はありますか?
10
Javier

はい、TensorFlow v2で集計を使用するより簡単でエレガントな方法があります。

まず、ログを保存するファイルライターを作成します(たとえば、log_dirという名前のディレクトリに)。

writer = tf.summary.create_file_writer(log_dir)

ログファイルに何かを書き込みたい場所(スカラーなど)は、ライターが作成したコンテキスト内で古き良きtf.summary.scalarを使用します。ステップiscalar_1の値を保存するとします。

with writer.as_default():
    tf.summary.scalar('scalar_1', scalar_1, step=i)

これらのコンテキストは、トレーニングループの内外で好きなだけ開くことができます。

例:

# create the file writer object
writer = tf.summary.create_file_writer(log_dir)

for i, (x, y) in enumerate(train_set):

    with tf.GradientTape() as tape:
        y_ = model(x)
        loss = loss_func(y, y_)

    grads = tape.gradient(loss, model.trainable_variables)
    optimizer.apply_gradients(Zip(grads, model.trainable_variables))

    # write the loss value
    with writer.as_default():
        tf.summary.scalar('training loss', loss, step=i+1)
10
Djib2011