训练GAN太难训练了,loss数值跳来跳去,跳的我眼花。就想有没有可视化的工具,看着loss曲线应该会直观很多。对TensorBoard早有耳闻,用了之后,果然名不虚传,太方便了。
因为我暂时对于TensorBoard的需求只限于看loss曲线,所以这篇文章起到的作用只是快速入门上手,要进一步探索TensorBoard的话,可能还需要看看介绍的其他比较全面的文章。
前言
TensorBoard 是 TensorFlow提供的一组可视化工具(a suite of visualization tools),可以帮助开发者方便的理解、调试、优化TensorFlow 程序。TensorBoard可以将模型训练过程中的各种汇总数据展示出来,包括标量(Scalars)、图片(Images)、音频(Audio)、计算图(Graphs)、数据分布(Distributions)、直方图(Histograms)和潜入向量(Embeddigngs)。
可视化流程
tensorflow代码执行的过程是先构建图Graph,然后在执行会话Session。
可视化的具体流程如下:
- 1.先建立一个graph
- 2.确定要在graph中的哪些节点放置summary operations以记录信息
使用tf.summary.scalar记录标量
使用tf.summary.histogram记录数据的直方图
使用tf.summary.distribution记录数据的分布图
使用tf.summary.image记录图像数据
… - 3.operations并不会去真的执行计算,除非你告诉他们需要去run,或者它被其他的需要run的operation所依赖。而我们上一步创建的这些summary operations其实并不被其他节点依赖,因此,我们需要特地去运行所有的summary节点。但是呢,一份程序下来可能有超多这样的summary 节点,要手动一个一个去启动自然是及其繁琐的,因此我们可以使用tf.summary.merge_all去将所有summary节点合并成一个节点,只要运行这个节点,就能产生所有我们之前设置的summary data。
- 4.使用tf.summary.FileWriter将运行后输出的数据都保存到本地磁盘中
- 5.运行整个程序,并在命令行输入运行tensorboard的指令,之后打开web端可查看可视化的结果
具体废话不说了,这边用两个例子说明吧,毕竟代码这东西要实操过后才能领悟到真谛。.
例子1
这个例子算是最简单的了,可以尝试是怎么打开TensorBoard的
先贴代码:
import tensorflow as tf
a = tf.constant(5, name="input_a")
b = tf.constant(3, name="input_b")
c = tf.multiply(a, b, name="mul_c")
d = tf.add(a, b, name="add_d")
e = tf.add(c, d, name="add_e")
sess = tf.Session()
sess.run(e)
writer = tf.summary.FileWriter("logs", tf.get_default_graph())
writer.close()
注意一下:保存FileWriter文件的目录必须是英文的,不然到时候web端可能报错说No dashboards are active for the current data set.
No dashboards are active for the current data set.
报错解决全集参考:(最全)No dashboards are active for the current data set. 解决tensorboard无法启动和显示问题
代码运行后可以看到logs
目录下多了个文件:
然后在logs
目录下运行终端,输入命令
tensorboard --logdir="E:\Image_processing_based_on_DL\Panoramic_Reconstruction\demo\logs"
:
运行之后就会出现一个web地址,打开这个web地址就可以看到TensorBoard的可视化界面了
如上图所示:我们能通过TensorBoard上看到代码的网络结构图
例子2
这个例子主要是为了展示TensorBoard可视化训练过程中loss曲线效果的,要在自己训练代码上增加训练过程可视化的话可以参考这个代码修改。
代码如下:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
def add_layer(inputs, in_size, out_size, n_layer, activation_funtion=None):
layer_name = 'layer%s' % n_layer
with tf.name_scope('layer'):
with tf.name_scope('weight'):
Weights = tf.Variable(tf.random_normal([in_size, out_size]), name='W')
tf.summary.histogram(layer_name + '/Weights', Weights) # 各层网络权重,偏置的分布,用histogram_summary函数
with tf.name_scope('biases'):
biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, name='b')
tf.summary.histogram(layer_name + '/biases', biases)
with tf.name_scope('Wx_plus_b'):
Wx_plus_b = tf.matmul(inputs, Weights) + biases # inputs与weight 顺序不能换
if activation_funtion is None:
output = Wx_plus_b
else:
output = activation_funtion(Wx_plus_b)
tf.summary.histogram(layer_name + '/output', output)
return output
x_data = np.linspace(-1, 1, 300, dtype=np.float32)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape).astype(np.float32)
y_data = np.square(x_data) - 0.5 + noise
with tf.name_scope('inputs'):
xs = tf.placeholder(tf.float32, [None, 1], name='x_in')
ys = tf.placeholder(tf.float32, [None, 1], name='y_in')
l1 = add_layer(xs, 1, 10, n_layer=1, activation_funtion=tf.nn.relu)
prediction = add_layer(l1, 10, 1, n_layer=2, activation_funtion=None)
# loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),
# reduction_indices=[1]))
with tf.name_scope('loss'):
loss = tf.reduce_mean(tf.square(ys - prediction))
tf.summary.scalar('loss', loss) # 数值如学习率,损失函数用scalar_summary函数,tf.scalar_summary(节点名称,获取的数据)
optimizer = tf.train.GradientDescentOptimizer(0.1)
with tf.name_scope('train'):
train = optimizer.minimize(loss)
init = tf.global_variables_initializer() # 替换成这样就好
sess = tf.Session()
sess.run(init)
# 整个图经常需要检测许许多多的值,也就是许多值需要summary operation,一个个去run来启动太麻烦了,所以就合并所有获得的值
merged = tf.summary.merge_all() # 合并所有的summary data的获取函数,merge_all 可以将所有summary全部保存到磁盘,以便tensorboard显示。如果没有特殊要求,一般用这一句就可一显示训练时的各种信息了。
writer = tf.summary.FileWriter("logs/", sess.graph) # 把图保存到一个路径,FileWriter从tensorflow获取summary data,然后保存到指定路径的日志文件中
for i in range(1000):
sess.run(train, feed_dict={xs: x_data, ys: y_data})
if i % 50 == 0:
# summary的操作对于整个图来说相当于是外设,因为tensorflow是由结果驱动的,而图的结果并不依赖于summary操作,所以summary操作需要被run
rs = sess.run(merged,
feed_dict={xs: x_data, ys: y_data}) # 运行所有合并所有的图,获取summary data函数节点和graph是独立的,调用的时候也需要运行session
writer.add_summary(rs, i) # 把数据添加到文件中,每一次run的信息和得到的数据加到writer里面,主要是描述数据变化,所以要这样,若是只有流图,就不需要这样
# print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
跟例子1类似,运行后用终端或者命令行打开TensorBoard
可以看到,实时的loss曲线
好了,这样就暂时是入门了,TensorBoard的功能强大,很多功能就等着大家进一步探索了。
参考
[1] TensorBoard
[2] Tensorboard踩坑记
[3] TensorFlow学习(一)——tensorboard ,可视化(如制作loss损失变化图【重要】)summary/scalar/histogram/FileWriter
[4] [干货|实践] TensorBoard可视化
[5] (最全)No dashboards are active for the current data set. 解决tensorboard无法启动和显示问题
码字不易,如果您觉得有帮助,麻烦帮我点个赞~~