TensorBoard是一种基于Web的TensorFlow可视化工具,可以有效的展示TensorFlow在运行过程中的计算图,各种指标随着时间变化的变化趋势以及训练过程中使用的图像信息。通过可视化tensorflow计算图以及可视化程序运行过程中的信息,便于调优。
1. 生成日志文件
在Session下,变量初始化前添加如下语句,则会生成日志文件
writer = tf.summary.FileWriter(path/to/log)
2. 日志文件写入
2.1 往日志文件中添加TensorFlow计算图
with tf.Session() as sess:
writer = tf.summary.FileWriter(path/to/log)
writer.add_graph(sess.graph)
...
计算节点:小椭圆
命名空间:矩形
实边:刻画数据传输的方向,箭头方向表达了数据传输的方向
虚线:计算之间的依赖关系
这些都可以在tensorboard左边的信息栏可见。
命名空间与TensorBoard图上节点
通过使用命名空间,tensorflow计算图中同一个命名空间下的所有节点都会被缩略成一个节点,可以整理可视化效果图上的计算结点。因此在构建模型时,使用命名空间整理计算节点,可以简化计算图。
tensorflow设置命名空间的函数:
tf.variable_scope()
tf.name_scope()
两者唯一的区别在于使用tf.get_variable()
函数不受tf.name_scope
函数的影响,tf.Variable()
函数仍然受tf.name_scope
函数的影响。
with tf.name_scope('foo'):
a = tf.Variable([1], 'a')
b = tf.get_variable([1], 'b')
print(a.name) # 显示结果为:'foo/a:0'
print(b.name) # 显示结果为:'b:0'
2.2. 往日志文件中添加计算节点信息
将tensorflow计算图上的每个节点的基本信息以及运行时消耗的时间和空间写入日志文件。通过查看这些信息,可以更加有针对性的优化tensorflow程序,加快运行速度。
with tf.Session() as sess:
writer = tf.summary.FileWriter(path/to/log)
writer.add_graph(sess.graph)
...
for i in range(training_step):
run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) # 定义TensorFlow运行选项
run_metadata = tf.RunMetadata()
summary, _ = sess.run([op1,op2], feed_dict={}, options=run_options, run_metadata=run_metadata)
writer.add_run_metadata(run_metadata, 'step%03d'%i)
2.3. 往日志文件中添加标量信息
在tensorflow程序运行过程中产生的一些标量信息,例如loss,learning_rate, accuacy,可视化这些信息可以更加有针对性的调优。使用tf.summary_scalar
函数进行汇总统计。
# 损失函数 tensorboard:将损失函数相关的计算都放在名字为"loss_function"的命名空间下
with tf.name_scope('loss_function'):
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))
cross_entropy_mean = tf.reduce_mean(cross_entropy)
loss = cross_entropy_mean + tf.add_n(tf.get_collection('losses'))
# tensorboard:将定义学习率,优化方法以及每一轮训练需要执行的操作都放在名字为"train_step"的命名空间下
with tf.name_scope('train_step'):
# 学习率衰减
learning_rate = tf.train.exponential_decay(learning_rate_base,
global_step,
mnist.train.num_examples/batch_size,
learning_rate_decay)
# 优化训练
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)
with tf.control_dependencies([train_step, variables_averages_op]): # 计算之间的依赖关系
train_op = tf.no_op(name='train')
# tf summary
tf.summary.scalar('loss', loss)
tf.summary.scalar('learning_rate', learning_rate)
之后在TensorBoard中的SCALARS那一栏显示标量信息。
2.4. 往日志文件中添加图片信息/音频信息
- 添加图片信息
with tf.name_scope('input_reshape'):
image_shape_input = tf.reshape(x, [b, h, w, c])
tf.summary.image('input', image_shape_input, 10)
之后在TensorBoard中的IMAGES那一栏显示图片信息。
- 添加音频信息:
tf.summary.audio
2.5. 往日志文件中添加直方图数据
# 定义直方图summary,之后哪个变量若要显示其直方图,调用该函数即可
def variable_summaries(var):
with tf.name_scope('summaries'):
mean = tf.reduce_mean(var)
stddev = tf.sqrt(tf.reduce_mean(tf.square(var-mean)))
tf.summary.scalar('mean', mean)
tf.summary.scalar('stddev', stddev)
tf.summary.scalar('max', tf.reduce_max(var))
tf.summary.scalar('min', tf.reduce_min(var))
tf.summary.histogram('histogram', var)
之后在TensorBoard中的HISTOGRAMS那一栏显示图片信息。
3. 执行日志记录生成操作
在我们之前定义的大多只是操作,但是没有执行,一个个操作执行过于麻烦,使用tf.summary.merge_all
整理所有日志生成操作,在Session下执行操作。
# session 会话前,以下tf.summary根据自己的使用情况调整要添加哪些信息到日志文件
tf.summary.image()
tf.summary.rudio()
tf.summary.histogram()
tf.summary.scalar()
merge_summary = tf.summary.merge_all()
with tf.Session() as sess:
# 生成日志文件
writer = tf.summary.FileWriter(path/to/log)
writer.add_graph(sess.graph)
...
for i in range(epochs):
...
# 执行日志文件生成操作
_, _, summary = sess.run([op1, op2, merge_summary])
writer.add_summary(summary, i)
# 关闭日志文件
writer.close()
4. 打开日志文件
在终端执行以下代码
tensorboard --logdir=path/to/log
注意:
--logdir=
不能有空格path/to/log
注意事项- 不需要用引号括起来
- 不能有空格
- 路径为日志文件的上一级目录路径(即不用包括日志文件的文件名,直接到存储日志文件的上级目录即可)
- 路径中最好不要有中文字符
# example 路径已经切换到当前项目路径下
tensorboard --logdir=./NN/tensorboard/
随后会出现一个url,复制该url到chrome浏览器上查看即可。