如何将张量板与 tf.estimator.Estimator 一起使用

新手上路,请多包涵

我正在考虑将我的代码库移至 tf.estimator.Estimator ,但我找不到关于如何将它与 tensorboard 摘要结合使用的示例。

MWE:

 import numpy as np
import tensorflow as tf

tf.logging.set_verbosity(tf.logging.INFO)

# Declare list of features, we only have one real-valued feature
def model(features, labels, mode):
    # Build a linear model and predict values
    W = tf.get_variable("W", [1], dtype=tf.float64)
    b = tf.get_variable("b", [1], dtype=tf.float64)
    y = W*features['x'] + b
    loss = tf.reduce_sum(tf.square(y - labels))

    # Summaries to display for TRAINING and TESTING
    tf.summary.scalar("loss", loss)
    tf.summary.image("X", tf.reshape(tf.random_normal([10, 10]), [-1, 10, 10, 1])) # dummy, my inputs are images

    # Training sub-graph
    global_step = tf.train.get_global_step()
    optimizer = tf.train.GradientDescentOptimizer(0.01)
    train = tf.group(optimizer.minimize(loss), tf.assign_add(global_step, 1))

    return tf.estimator.EstimatorSpec(mode=mode, predictions=y,loss= loss,train_op=train)

estimator = tf.estimator.Estimator(model_fn=model, model_dir='/tmp/tf')
# define our data set
x=np.array([1., 2., 3., 4.])
y=np.array([0., -1., -2., -3.])
input_fn = tf.contrib.learn.io.numpy_input_fn({"x": x}, y, 4, num_epochs=1000)

for epoch in range(10):
    # train
    estimator.train(input_fn=input_fn, steps=100)
    # evaluate our model
    estimator.evaluate(input_fn=input_fn, steps=10)

如何在张量板上显示我的两个摘要?我是否必须注册一个使用 tf.summary.FileWriter 或其他东西的挂钩?

原文由 Manuel Schmidt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 810
2 个回答

编辑:经过测试(在 v1.1.0 中,也可能在更高版本中),很明显 tf.estimator.Estimator 会自动为您编写摘要。我使用 OP 的代码和张量板确认了这一点。

(一些关于 r1.4 的探索让我得出结论,这种自动摘要写作的发生是由于 tf.train.MonitoredTrainingSession 。)

最终,自动汇总是通过使用挂钩来完成的,因此如果您想自定义 Estimator 的默认汇总,您可以使用挂钩来实现。以下是原始答案中的(编辑过的)详细信息。


您需要使用以前称为 监视器 的钩子。 (链接是一个概念/快速入门指南;简而言之,Estimator API 中内置了挂钩/监控训练的概念。不过,有点令人困惑的是,弃用监视器的挂钩似乎并不是真的记录在实际源代码中的弃用注释中除外……)

根据您的使用情况,r1.2 的 SummarySaverHook 看起来符合您的要求。

 summary_hook = tf.train.SummarySaverHook(
    SAVE_EVERY_N_STEPS,
    output_dir='/tmp/tf',
    summary_op=tf.summary.merge_all())

您可能希望自定义挂钩的初始化参数,例如通过提供明确的 SummaryWriter 或每 N 秒而不是 N 步写入一次。

如果将其传递给 EstimatorSpec ,您将获得自定义的摘要行为:

 return tf.estimator.EstimatorSpec(mode=mode, predictions=y,loss=loss,
                                  train_op=train,
                                  training_hooks=[summary_hook])

编辑注意:此答案的先前版本建议将 summary_hook 传递到 estimator.train(input_fn=input_fn, steps=5, hooks=[summary_hook]) 。这不起作用,因为 tf.summary.merge_all() 必须在与模型图相同的上下文中调用。

原文由 jagthebeetle 发布,翻译遵循 CC BY-SA 3.0 许可协议

对我来说,这 无需 添加任何挂钩或 merge_all 调用即可工作。我刚刚在我的 --- 中添加了一些 tf.summary.image(...) model_fn 并且当我训练模型时,它们神奇地出现在 tensorboard 中。但是,不确定确切的机制是什么。我正在使用 TensorFlow 1.4。

原文由 simlmx 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进