TensorBoard 通过读取TensorFlow 的事件文件来运行。TensorFlow的事件文件包括了你会在TensorFlow 运行中涉及到的主要数据。下面是TensorBoard 中汇总数据(Summary data)的大体生命周期。
首先,创建你想汇总数据的TensorFlow 图,然后再选择你想在哪个节点进行汇总(summary)操作。
比如,假设你正在训练一个卷积神经网络,用于识别MNIST标签。你可能希望记录学习速度(learning rate)的如何变化,以及目标函数如何变化。通过向节点附加scalar_summary操作来分别输出学习速度和期望误差。然后你可以给每个scalar_summary分配一个有意义的标签,比如‘learning rate’ 和 'loss function'。或者你还希望显示一个特殊层中激活的分布,或者梯度权重的分布。可以通过分别添加histogram_summary 运算来收集权重变量和梯度输出。
def training(loss, learning_rate):
tf.scalar_summary(loss.op.name, loss)
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
global_step = tf.Variable(0, name='global_step', trainable=False)
train_op = optimizer.minimize(loss, global_step=global_step)
return train_op
在TensorFlow 中,所有测操作只有当你执行,或者另一个操作依赖于它的输出时才会运行。我们刚才创建的这些节点(summary nodes)都围绕着你的图像:没有任何操作依赖于它们的结果。因此,为了生成汇总信息,我们需要运行所有这些节点。这样的手动工作是很乏味的,因此可以使用tf.merge_all_summaries 来将他们合并为一个操作。
然后你可以执行合并命令,它会依据特点步骤将所有数据生成一个序列化的Summary protobuf 对象。最后,为了将汇总数据写入磁盘,需要将汇总的protobuf 对象传递给
tf.scalar_summary(tags, values, collections=None, name=None)
输出标量值的总和
输入的tags 和 values 必须具有相同的shape。产生的总和有每一个tag-value 对的值。
参数:
class tf.train.SummaryWriter
把 Summary protocol buffer 写入到事件文件中。
SummaryWriter 类提供了一种机制在给定的目录创建一个事件文件,并且添加 summaries 和 事件到事件文件中。这个类异步地更新文件内容。允许你在训练过程中调用方法直接添加数据到文件中,而不减缓训练速度。
tf.train.SummaryWriter.__init__(logdir, graph=None, max_queue=10, flush_secs=120, graph_def=None)
创建一个SummaryWriter 和 一个事件文件。
当构造summary writer 过程中在logdir 创建了一个新的事件文件。这个事件文件把包含当调用下面其中之一的函数:add_summary(), add_session_log(), add_event(), add_graph() 时构造的事件 protocol buffers。
如果你传递一个Graph 到构造器中,它被添加到事件文件中。(等效于在后边调用 add_graph() )
TensorBoard 将从文件中挑选图并以图形的形式展示,因此你可以交互地探索你构建的图。一般上传递你启动session的那个图:
...create a graph...
# Launch the graph in a session.
sess=tf.Session()
#Create a summary writer, add the 'graph' to the event file.
writer=tf.train.SummaryWriter(, sess.graph)
merged_summary_op=tf.merge_all_summaries()
summary_writer=tf.train.SummaryWriter('/tmp/mnist_logs',sess.graph)
total_step=0
while training:
total_step+=1
sess.run(training_op)
if total_step % 100 ==0:
summary_str=sess.run(merged_summary_op)
summary_writer.add_summary(summary_str,total_step)
构造器的其他参数控制异步地写入事件文件中: