簡體   English   中英

如何在 TensorFlow 2 中寫入 TensorBoard

[英]How to write to TensorBoard in TensorFlow 2

我對 TensorFlow 1.x 非常熟悉,我正在考慮為即將到來的項目切換到 TensorFlow 2。 我在理解如何使用自定義訓練循環將標量寫入 TensorBoard 日志時遇到一些麻煩。

問題描述

在 tf1 中,您將創建一些摘要操作(您要存儲的每個操作一個操作),然后將其合並為一個操作,在會話中運行該合並操作,然后使用 FileWriter 對象將其寫入文件。 假設sess是我們的tf.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 版本,在會話之外。 顯然,這些函數的任何組合都會失敗,因為 FileWriters、merge_ops 等甚至在 tf2 中都不存在。
  • 這篇中篇文章指出,在包括tf.summary()在內的一些 tensorflow API 中已經進行了“清理”。 他們建議使用from tensorflow.python.ops.summary_ops_v2 ,這似乎不起作用。 意味着使用record_summaries_every_n_global_steps 稍后會詳細介紹。
  • 一系列其他帖子123建議使用tf.contrib.summarytf.contrib.FileWriter 但是, tf.contrib已從核心 TensorFlow 存儲庫和構建過程中刪除
  • 來自官方 repo 的 TensorFlow v2 展示,它再次使用tf.contrib摘要以及前面提到的record_summaries_every_n_global_steps 我也不能讓它工作(即使不使用 contrib 庫)。

tl;博士

我的問題是:

  • 有沒有辦法在 TensroFlow 2 中正確使用tf.summary
  • 如果沒有,當使用自定義訓練循環(不是model.fit() )時,是否有另一種方法可以在 TensorFlow 2 中編寫 TensorBoard 日志?

是的,在 TensorFlow v2 中有一種更簡單、更優雅的方法來使用摘要。

首先,創建一個存儲日志的文件log_dir (例如在名為log_dir的目錄中):

writer = tf.summary.create_file_writer(log_dir)

在您想向日志文件(例如標量)寫入內容的任何地方,請在作者創建的上下文中使用舊的tf.summary.scalar 假設您要為步驟i存儲scalar_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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM