如何在tf.estimator.Estimator

时间:2017-05-04 12:20:37

标签: python-3.x tensorflow tensorboard

我正在考虑将我的代码库移到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)

如何在tensorboard中显示我的两个摘要?我是否必须注册我使用tf.summary.FileWriter或其他内容的钩子?

4 个答案:

答案 0 :(得分:13)

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

(有些人围着r1.4引导我得出结论,这个自动摘要写作是由于tf.train.MonitoredTrainingSession而发生的。)

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

你会想要使用钩子,以前称为monitors。 (链接是一个概念/快速入门指南;缺点是挂钩/监控培训的概念内置于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()

答案 1 :(得分:7)

对我而言,没有添加任何挂钩或merge_all来电。我刚刚在我的tf.summary.image(...)中添加了一些model_fn,当我训练模型时,它们神奇地出现在张量板中。但是,不确定具体机制是什么。我正在使用TensorFlow 1.4。

答案 2 :(得分:2)

estimator = tf.estimator.Estimator(model_fn=model, model_dir='/tmp/tf')

代码model_dir='/tmp/tf'表示估算工具将所有日志写入/tmp/tf,然后运行tensorboard --log.dir=/tmp/tf,用网址打开浏览器:http://localhost" 6006,您可以看到图形

答案 3 :(得分:1)

您可以在model_fn本身中创建SummarySaverHook tf.summary.merger_all()作为summary_op 。将此挂钩传递给model_fn中training_hooks构造函数的EstimatorSpec param。

我不认为@jagthebeetle所说的在这里完全适用。由于无法为您在model_fn中定义的摘要运行转移到estimator.train方法的挂钩,因为它们不会被添加到merge_all操作系统,因为它们仍然受限于范围model_fn