如何向tensorboard添加验证?我已经为图层编写了一个包装器,例如:
def convolution(input_data, kernel_shape, strides, activation, name=None):
with tf.name_scope(name):
kernel = tf.Variable(tf.truncated_normal(kernel_shape, stddev=stddev), name="weights")
bias = tf.Variable(tf.zeros([kernel_shape[-1]]), name="biases")
conv = tf.nn.conv2d(input=input_data, filter=kernel, strides=strides, padding="SAME", name="convolutions")
result = activation(tf.nn.bias_add(conv, bias), name="activations")
tf.scalar_summary(name + "/mean", tf.reduce_mean(kernel))
return result
并在summary_op = tf.merge_all_summaries()
中使用main
。我还实现了train_op
和valid_op
,它们都调用inference
函数。但是,出现错误,我们有scalar_summary的重复标记,即inference
和train_op
中都使用valid_op
,这会导致重复conv1/mean
摘要。
我该如何使这项工作?我需要使用相同的函数inference
运行训练和验证。
答案 0 :(得分:2)
如错误所示,您不能有两个具有相同标记的摘要。在您的情况下会发生这种情况,因为您使用相同的标记调用了tf.scalar_summary
两次,一次是在构建train_op
时,一次是在构建valid_op
时。这是一个可能的解决方案:
您可以在inference
函数中添加一个标记,例如is_training
,以指示正在调用代码来构建训练图的一部分。您必须将该标志线程化为所有图层函数。例如,在convolution
中,您应该执行以下操作:
if is_training:
tf.scalar_summary(name + "/mean", tf.reduce_mean(kernel))
return result
构建train_op
时,您会传递is_training=True
,而在构建valid_op
时,您会传递is_training=False
。在Inception模型中有一个这样的编程模式here的例子。
答案 1 :(得分:0)
另一种方法是使用不同的名称范围进行摘要,然后通过merge_summary的范围参数过滤它们,而不是merge_all_summaries。