[tf]tensorboard的使用
2018-12-13 本文已影响2人
VanJordan
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->依赖之)
而我们上一步创建的这些summary
operations
其实并不被其他节点依赖,因此,我们需要特地去运行所有的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)