如何创建在TensorFlow中对多个图形调用进行平均的标量摘要?

时间:2016-09-09 00:02:31

标签: tensorflow

我们假设我有这样的情景:

import tensorflow as tf

sess = tf.Session()

x = tf.random_normal([])
tf.scalar_summary('x', x)

merged = tf.merge_all_summaries()
sw = tf.train.SummaryWriter('.', sess.graph)

summaries = []
for i in range(100):
  summary = sess.run(merged)
  sw.add_summary(summary, i/10)
  summaries.append(summary)

sw.close()

我想要平均10个具有相同global_step的值。有没有办法实现这一点,除了提供以前的值并将其添加到图表中?我是否可以使用生成的summaries二进制协议缓冲区消息数组,以某种方式动态创建标量摘要,可能直接使用google.protobuf

1 个答案:

答案 0 :(得分:1)

您可以在图表中添加一个跟踪x值的平均值的变量。

请参阅下面的修改示例。

代码添加了count和running_sum变量。然后将摘要op连接到running_sum/count操作。 评估相同会话中的图形将保持running_sum和count变量的状态。

g = tf.Graph()
with g.as_default():
    tf.set_random_seed(1234)

    x = tf.random_normal([])

    count = tf.get_variable("count", initializer=tf.zeros([]), dtype=tf.float32)
    count = count.assign_add(1)

    running_sum = tf.get_variable("running_sum", initializer=tf.zeros_like(x))
    running_sum = running_sum.assign_add(x)
    avg = tf.div(running_sum, count)
    tf.scalar_summary("average", avg)

    merged = tf.merge_all_summaries()   
    sw = tf.train.SummaryWriter('.', sess.graph)
    init_op = tf.initialize_all_variables()

with tf.Session(graph=g) as sess:
    sess.run(init_op)
    x_values = []
    for i in range(10):
        value, x_value, summaries_value = sess.run([avg, x, merged])
        # Accumulate the values
        x_values.append(x_value)
        # Test it
        np_mean = np.mean(x_values)
        np.testing.assert_almost_equal(np_mean, value)
        print value, x_value     

输出:

0.325545 0.325545
0.201057 -0.124489
-0.468691 -0.669747
-0.729087 -0.260396
-0.323435 0.405652
0.263484 0.586919
0.600163 0.336679
-0.763652 -1.36382
-0.369373 0.394279
-0.934823 -0.56545