我们假设我有这样的情景:
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
?
答案 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