如何平均多个批次的汇总?
tensorflow
15
0

假设我有一堆定义如下:

loss = ...
tf.scalar_summary("loss", loss)
# ...
summaries = tf.merge_all_summaries()

我可以在训练数据上每隔几步评估summaries张量,并将结果传递给SummaryWriter 。结果将是嘈杂的摘要,因为它们仅按一批进行计算。

但是,我想对整个验证数据集进行汇总。当然,我不能将验证数据集作为一个批次传递,因为它太大了。因此,我将获得每个验证批次的摘要输出。

有没有一种方法可以对这些汇总求平均值,以使其看起来好像已经对整个验证集进行了计算?

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

我会避免在图表计算平均值。

您可以使用tf.train.ExponentialMovingAverage

ema = tf.train.ExponentialMovingAverage(decay=my_decay_value, zero_debias=True)
maintain_ema_op = ema.apply(your_losses_list)

# Create an op that will update the moving averages after each training step.
with tf.control_dependencies([your_original_train_op]):
    train_op = tf.group(maintain_ema_op)

然后,使用:

sess.run(train_op)

这将调用maintain_ema_op因为它被定义为控件依赖项。

为了获得指数移动平均值,请使用:

moving_average = ema.average(an_item_from_your_losses_list_above)

并使用以下方法检索其值:

value = sess.run(moving_average)

这将计算您的计算图中的移动平均线。

收藏
评论

在Python中对测量值进行平均,并为每个均值创建一个新的Summary对象。这是我的工作:

accuracies = []

# Calculate your measure over as many batches as you need
for batch in validation_set:
  accuracies.append(sess.run([training_op]))

# Take the mean of you measure
accuracy = np.mean(accuracies)

# Create a new Summary object with your measure
summary = tf.Summary()
summary.value.add(tag="%sAccuracy" % prefix, simple_value=accuracy)

# Add it to the Tensorboard summary writer
# Make sure to specify a step parameter to get nice graphs over time
summary_writer.add_summary(summary, global_step)
收藏
评论

我认为让tensorflow进行计算总是更好。

看一下流媒体指标。他们具有更新功能来提供当前批次的信息,并具有获取平均摘要的功能。它看起来会像这样:

accuracy = ... 
streaming_accuracy, streaming_accuracy_update = tf.contrib.metrics.streaming_mean(accuracy)
streaming_accuracy_scalar = tf.summary.scalar('streaming_accuracy', streaming_accuracy)

# set up your session etc. 

for i in iterations:
      for b in batches:
               sess.run([streaming_accuracy_update], feed_dict={...})

     streaming_summ = sess.run(streaming_accuracy_scalar)
     writer.add_summary(streaming_summary, i)

另请参阅tensorflow文档: https ://www.tensorflow.org/versions/master/api_guides/python/contrib.metrics

和这个问题: 如何在张量流中累积汇总统计信息

收藏
评论

您可以平均存储当前总和,然后在每一批之后重新计算平均值,例如:

loss_sum = tf.Variable(0.)
inc_op = tf.assign_add(loss_sum, loss)
clear_op = tf.assign(loss_sum, 0.)
average = loss_sum / batches
tf.scalar_summary("average_loss", average)

sess.run(clear_op)
for i in range(batches):
    sess.run([loss, inc_op])

sess.run(average)
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题