如何在TensorFlow 2中写入TensorBoard

Jav*_*ier 6 python machine-learning deep-learning keras tensorflow

我对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)
Run Code Online (Sandbox Code Playgroud)

问题是会话在tf2中不再存在,我宁愿不要禁用急切的执行来完成这项工作。在官方文件是为TF1书面和所有引用我可以找到使用Tensorboard keras回调建议。但是,据我所知,这仅在您通过model.fit(...)而不是通过自定义训练循环训练模型的情况下有效。

我尝试过的

  • tf.summary会话外部的函数的tf1版本。显然,这些功能的任何组合都会失败,因为tf2中甚至不存在FileWriters,merge_ops等。
  • 中篇文章指出,某些tensorflow API中存在“清除”事件tf.summary()。他们建议使用from tensorflow.python.ops.summary_ops_v2,这似乎无效。这意味着使用record_summaries_every_n_global_steps;; 稍后再讨论。
  • 一系列其他职位123,建议使用的tf.contrib.summarytf.contrib.FileWriter。但是,tf.contrib 已从核心TensorFlow存储库和构建过程中删除
  • 官方仓库中的TensorFlow v2展示柜,再次使用tf.contrib摘要和record_summaries_every_n_global_steps前面提到的内容。我也不能使它工作(即使不使用contrib库)。

tl; dr

我的问题是:

  • 有没有办法tf.summary在TensroFlow 2中正确使用?
  • 如果不是,使用自定义训练循环(不是model.fit())时,还有另一种方法可以在TensorFlow 2中编写TensorBoard日志吗?

Dji*_*011 6

是的,在TensorFlow v2中有一种更简单,更优雅的方式来使用摘要。

首先,创建一个存储日志的文件编写器(例如,在名为的目录中log_dir):

writer = tf.summary.create_file_writer(log_dir)
Run Code Online (Sandbox Code Playgroud)

您想在日志文件中写入任何内容的任何地方(例如标量)都可以tf.summary.scalar在编写者创建的上下文中使用好旧的东西。假设您要存储scalar_1for 的值i

with writer.as_default():
    tf.summary.scalar('scalar_1', scalar_1, step=i)
Run Code Online (Sandbox Code Playgroud)

您可以在训练循环的内部或外部随意打开这些上下文。

例:

# 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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这有效!我不敢相信他们没有任何相关文件! (2认同)
  • @mathtick一种可能的解决方案是制作两个不同的子文件夹(例如“ training”和“ validation”)。如果将父文件夹传递到张量板,则将在同一图上运行每个子文件夹。 (2认同)