tensorboard --logdir=./ --port=54321
# 然后在浏览器
http://127.0.0.1:54321
使用tf.summary.scalar记录标量数据,使用tf.summary.histogram直接记录变量var的直方图。
with tf.name_scope('summaries'):
mean = tf.reduce_mean(var)
tf.summary.scalar('mean', mean)
tf.summary.scalar('histogram', var)
对tf.summary进行汇总
- 使用
tf.summary.merger_all()直接获取所有汇总操作Op,方便以后执行。 - 然后,定义两个
tf.summary.FileWriter(文件记录器)在不同的子目录,分别用来存放训练和测试日志数据,提网速差,将Session的计算图sess.graph加入训练过程的记录,这样在TensorBoard的GRAPHS窗口就能展示整个计算如的可视化效果。
with tf.name_scope('summaries'):
mean = tf.reduce_mean(var)
tf.summary.scalar('mean', mean)
tf.summary.scalar('histogram', var)
merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter(log_dir + '/train', sess.graph)
test_writer = tf.summary.FileWriter(log_dir + '/test')
-
writer.add_summary(data,step):添加数据。 -
tf.RunOptions:定义TensorFlow的运行选项,设置trace_level为FULL_TRACE,并使用tf.RunMetadata定义TensorFlow运行的元信息,这样可以记录训练时运算时间和内存占用等信息。再执行merged操作和train_step训练错做,将汇总的结果summary和训练元信息run_metadata添加到train_writer。平时则只执行merged操作和train_step操作,并添加到summary到train_writer中,所有训练完成以后,关闭train_writer和test_writer。
for i in range(max_steps):
if i % 10 == 0:
accuracy = sess.run(model.accuracy, feed_dict=feed_dict)
test_writer.add_summary(accuracy, i)
else :
if i % 100 == 99:
run_options = tf.RunOptions(trace_level = tf.RunOptions.FULL_TRACE)
run_metadata = tf.RunMetadata()
summary,_ = sess.run([merged, train_step],feed_dict = feed_dict(True),
options = run_options, run_metadata = run_metadata)
train_writer.add_run_metadata(run_metadata, 'step%03d' % i )
train_writer.add_summary(summary, i )
saver.save(sess, log_dir + '/model.ckpt', i)
else:
summary,_ = sess.run([merged, train_step], feed_dict = feed_dict(True))
train_writer.add_summary(summary, i)
train_writer.close()
test_writer.close()
使用tf.summary.image记录图片数据
- 为了在TensorBoard中展示节点的名称,我们设计网络的时候使用
with tf.name_scope限制命名空间,在这个with下的所有结点都会被自动命名为input/xxx的形式,下面例子中将一维数据变形成28*28的图片存储到一个tensor中,这样就可以使用tf.summary.image将图片数据汇总给TensorBoard展示。
log_dir = './log/'
with tf.name_scope('input'):
x = tf.placeholder(tf.float32,[None,784], name = 'x-input')
y = tf.placeholder(tf.float32, [None, 10], name = 'y-input')
with tf.name_scope('input_reshape'):
image_shaped_input = tf.reshape(x,[-1, 28, 28, 1])
tf.summary.image('input', image_shaped_input, 10)
EMBEDDINGS 窗口可以看到降维以后的嵌入向量可视化效果
这是TensorBoard中的Embedding Projector功能,只要我们使用tf.train.Saver保存了整个模型,那么就可以使用TensorBoard自动对模型中所有的二维Variable进行可视化,(TensorFlow中只有Variable可以被保存,而Tenor是不可的),因此如果我们想要可视化Tensor我们可以选择T-SNE或者PCA等算法对数据的列特征进行降维,并且在3D或者2D的坐标中展示可视化展示。如果我们的模型是Word2Vec计算或Language Model,那么TensorBoard的EMBEDDINGS可视化功能会变得非常有用。
添加自己的数据到TensorBoard显示
通常情况下,我们在训练网络的时候添加summary都是通过如下方式。
- 为什么要写
summary_op = tf.summary.merge_all():为了值运行着一个op就将所有的summary写入文件。operations并不会去真的执行计算,除非你告诉他们需要去run,或者它被其他的需要run的operation所依赖。sess.run(op)或者sess.run(op->依赖之)而我们上一步创建的这些summaryoperations其实并不被其他节点依赖,因此,我们需要特地去运行所有的summary节点。但是呢,一份程序下来可能有超多这样的summary节点,要手动一个一个去启动自然是及其繁琐的,因此我们可以使用tf.summary.merge_all去将所有summary节点合并成一个节点,只要运行这个节点,就能产生所有我们之前设置的summary data。
tf.scalar_summary(tags, values)
# ...
summary_op = tf.summary.merge_all()
summary_writer = tf.summary.FileWriter(logdir, graph=sess.graph)
summary_str = sess.run(summary_op)
summary_writer.add_summary(summary_str, global_step)
- 当我们自己想添加其他数据到
TensorBoard的时候(例如验证时的loss等),这种方式显得太过繁琐,其实我们可以通过如下方式添加自定义数据到TensorBoard内显示。 - 注意,这里的step只能是整数,如果是小数的话会自动转为整数类型。
summary_writer = tf.summary.FileWriter(LOGDIR)
summary = tf.Summary()
summary.value.add(tag="summary_tag", simple_value=0)
summary.value.add(tag="summary_tag2", simple_value=1)
# step代表横轴坐标
summary_writer.add_summary(summary, step)












网友评论