本期导航 | 标题 |
一 | 介绍 |
二 | 在anaconda中TensorBoard安装启动 |
三 | 具体使用:添加可视化目标 |
四 | 训练 |
五 | 输出可视化结果 |
01
介绍
在20号那天数据皮皮侠介绍了机器学习框架TensorFlow,在实际操作中怎样加强对机器学习的监督呢,今天我们来介绍机器学习可视化工具TensorBoard。
TensorBoard是一个可视化工具,能够有效地展示Tensorflow在运行过程中的图、参数、各种指标随着时间的变化趋势以及训练中使用到的数据信息。
TensorBoard目的是为了可视化TensorFlow训练神经网络等复杂操作的整个过程,可以更好的理解神经网络的整个过程,调试并优化程序。
可视化类型包括:
训练指标监视,如loss,精确度
图可视化,如训练过程中卷积核和特征图
模型可视化,显示网络结构
参数分布可视化,如卷积核和偏置参数
02
在anaconda中TensorBoard安装启动
1.安装
在20号的文章里介绍了如何在anaconda中安装TensorFlow,激活它之后使用TensorBoard即可。
2.激活tensorflow
输入
activate tensorflow
记得安装CPU版本tensorflow
输入
pip install --upgrade --ignore-installed tensorflow
3.使用tensorboard可视化
这步骤之前,必须确定你运行了代码生成了tf.event(不懂tf.event可以学习一下20号的tensorflow教程),类似如下文件
4.输入如下命令
tensorboard --logdir=(此处放置你的event所在路径)
5.最后把显示的链接(笔者的链接是http://DELL-PC:6006)输入到谷歌浏览器中然后出现橙色tensorboard界面,就可视化成功了
03
具体使用:添加可视化目标
TensorFlow日志生成函数与Tensorboard界面栏对应关系:
在定义网络模型时,需要可视化的目标变量可以通过tf.summary添加。
(1)tf.summary.scalar
显示标量信息,主要用于记录诸如:准确率、损失和学习率等单个值的变化趋势。
代码示例:
tf.summary.scalar(‘loss’ , loss)tf.summary.scalar('accuracy', accuracy)
(2)tf.summary.histogramr:
显示参数分布直方图,如卷积核参数。
代码示例:
tf.summary.histogram(‘conv1’ , w_conv1)
(3)tf.summary.image:
接收一个tensor,显示图像信息,如特征图和卷积核,默认显示最新的图像信息。
代码示例:
tf.summary.image(‘feature’ , feature_map)tf.summary.image('w_conv1', w_conv1_visual_0)tf.summary.image('x_input' , x_input, 6)
(4)tf.summary.FileWriter:
生成日志, 指定一个目录来告诉程序把文件放到哪里。然后运行的时候使用add_summary()来将某一步的summary数据记录到文件中。
代码示例:
tf.summary.FileWriter('logs/', sess.graph, flush_secs = 10)
(5)tf.summary.merge_all:
整理日志的操作,sess.run一次就不用对上述分别run。代码示例:
sess.run(tf.global_variables_initializer())merged = tf.summary.merge_all()
def inf(self, x): x_input = tf.reshape(x, [-1, 28, 28, 1]) #可视化输入图像 tf.summary.image('x_input', x_input, 6) with tf.name_scope('1st_layer'): w_conv1 = tf.get_variable('w_conv1', [3, 3, 1, 20]) #可视化卷积核 w_conv1_visual_0 = tf.reshape(w_conv1[:,:,:,0], [1, 3, 3, 1]) w_conv1_visual_1 = tf.reshape(w_conv1[:,:,:,1], [1, 3, 3, 1]) w_conv1_visual_2 = tf.reshape(w_conv1[:,:,:,2], [1, 3, 3, 1]) tf.summary.image('w_conv1', w_conv1_visual_0) tf.summary.image('w_conv1', w_conv1_visual_1) tf.summary.image('w_conv1', w_conv1_visual_2) #可视化参数分布 tf.summary.histogram('w_conv1', w_conv1) b_conv1 = tf.get_variable('b_conv1', [20]) tf.summary.histogram('b_conv1', b_conv1) h_conv1 = tf.nn.relu(self.conv2d(x_input, w_conv1) + b_conv1) h_pool1 = self.max_pool_2x2(h_conv1) #可视化特征图 tf.summary.image('h_pool1', h_pool1[:,:,:,:1], 6)
定义网络过程中可以通过tf.name_scope()来划分网络模块,使得可视化结果可以分块展示,效果较为清晰。
代码示例:
with tf.name_scope('2nd_layer'): w_conv2 = tf.get_variable('w_conv2', [3, 3, 20, 40]) b_conv2 = tf.get_variable('b_conv2', [40]) h_conv2 = tf.nn.relu(self.conv2d(h_pool1, w_conv2) + b_conv2) h_pool2 = self.max_pool_2x2 (h_conv2) #####tensorboard##### #可视化特征图 tf.summary.image('h_pool2', h_pool2[:,:,:,:1], 6) with tf.name_scope('fc_layers'): w_fc1 = tf.get_variable('w_fc1', [7 * 7 * 40, 1024]) b_fc1 = tf.get_variable('b_fc1', [1024]) h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 40]) h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1)
04
训练
将所有需要可视化的参数确定之后,需要在sess.run(tf.global_variables_initializer())之后添加:
merged = tf.summary.merge_all()writer = tf.summary.FileWriter(‘logs’, sess.graph)
这部分将所有需要记录的参数整合,并确定记录输出路径logs/,随后在训练部分,在sess.run()中添加:
result = sess.run(merged)writer.add_summary(result, i)
即可将训练过程实时记录到输出路径。
05
输出可视化结果
训练完成以后,在log文件夹下会输出一个日志文件,在控制台输入:
tensorboard --logdir logs/
其中logs/为上面输出的日志文件所在的路径,运行完成以后会返回一个地址,此时复制并在浏览器中打开该地址即可查看tensorboard的可视化结果。
训练过程中的精度变化:
输入层:
第一层的特征图和卷积核:
第二层的特征图:
网络模型:
参数分布:
数据皮皮侠
本期作者:姚力渤
本期编辑校对:李嘉楠
欢迎关注 “ 数据皮皮侠”
更多知识等你发掘