2016-03-01 69 views
3

在培訓過程中,我想將過去N個小批量的平均損失寫入SummaryWriter,作爲平滑非常嘈雜的批量損失的一種方法。在python中計算並打印它很容易,但我想將它添加到摘要中,以便我可以在張量板中看到它。這裏是我現在正在做的過於簡單的例子。計算張量流中多個批次的精確移動平均值

losses = [] 
for i in range(10000): 
    _, loss = session.run([train_op, loss_op]) 
    losses.append(loss) 
    if i % 100 == 0: 
    # How to produce a scalar_summary here? 
    print sum(losses)/len(losses) 
    losses = [] 

我知道,我可以用ExponentialMovingAverage與1.0的衰減,但我仍然需要一些方法來把它重每N批次。真的,如果我關心的是可視化張量板中的損失,重置可能不是必須的,但我仍然很好奇如何針對其他原因跨批次進行聚合(例如,計算測試數據集的總準確率也是如此大批量運行)。

回答

2

將數據從python傳遞到像tf.scalar_summary這樣的圖函數可以使用佔位符和feed_dict來完成。

average_pl = tf.placeholder(tf.float32) 
average_summary = tf.summary.scalar("average_loss", average_pl) 
writer = tf.summary.FileWriter("/tmp/mnist_logs", sess.graph_def) 

losses = [] 
for i in range(10000): 
    _, loss = session.run([train_op, loss_op]) 
    losses.append(loss) 
    if i % 100 == 0: 
    # How to produce a scalar_summary here? 
    feed = {average_pl: sum(losses)/len(losses)} 
    summary_str = sess.run(average_summary, feed_dict=feed) 
    writer.add_summary(summary_str, i) 
    losses = [] 

我沒有嘗試過它,這是從可視化數據匆忙複製如何,但我希望這樣的事情會工作。

+0

由於版本1.0,人們必須使用'tf.summary.scalar'代替'tf.scalar_summary'和'tf.summary。 FileWriter'而不是'tf.train.SummaryWriter'。其他一切都應該正常工作。 –

7

可以手動構造概要對象,像這樣:

from tensorflow.core.framework import summary_pb2 

def make_summary(name, val): 
    return summary_pb2.Summary(value=[summary_pb2.Summary.Value(tag=name, 
                   simple_value=val)]) 

summary_writer.add_summary(make_summary('myvalue', myvalue), step)