codecamp

TensorBoard可视化结构管理工具在Windows下的使用

遵循:BY-SA署名-相同方式共享 4.0协议

作者:谭东

时间:2017年6月10日

环境:Windows 7

TensorBoard是TensorFlow自带的可视化结构管理和调试优化网络的工具。在我们学习深度学习网络框架时,我们需要更直观的看到各层网络结构和参数,也可以更好的进行调试优化网络。TensorBoard可以实现网络结构的显示,也可以进行显示训练及测试过程中各层参数的变化情况。

我们先看下TensorBoard的大致界面。

我们可以看到顶部有几个功能分类:SCALARS、IMAGES、AUDIO、GRAPHS等。

SCALARS是训练参数统计显示,可以看到整个训练过程中,各个参数的变换情况。

官方英文翻译:

TensorBoard的标量仪表板可视化随时间变化的标量统计; 例如,您可能需要跟踪模型的损失或学习率。 如关键概念所述,您可以比较多个运行,数据按标签组织。 折线图具有以下交互作用:

  • 点击每个图表左下角的小蓝色图标将展开图表
  • 在图表上拖动矩形区域将放大
  • 双击图表将缩小
  • 鼠标在图表上会产生十字准线,数据值记录在左侧的运行选择器中。

此外,您可以通过在仪表板左上角的框中编写正则表达式来创建新的文件夹来组织标签。


IMAGES输入和输出标签。

官方翻译:

图像仪表板可以显示通过tf.image_summary保存的png。 设置仪表板,使每行对应一个不同的标签,每列对应一个运行。 由于图像显示板支持任意的png,您可以使用它将自定义可视化(例如,matplotlib散点图)嵌入到TensorBoard中。 此仪表板总是显示每个标签的最新图像。

AUDIO官方英文翻译:

音频仪表板可以嵌入通过tf.audio_summary保存的音频的可播放音频小部件。 设置仪表板,使每行对应一个不同的标签,每列对应一个运行。 此仪表板将为每个标签嵌入最新的音频。

GRAPH是网络结构显示。

官方英文翻译:

图形浏览器可以显示TensorBoard图形,从而可以检查TensorFlow模型。 为了最好地利用图形可视化程序,您应该使用名称范围来对图形中的op进行分层分组,否则图形可能难以破译。 有关更多信息,包括示例,请参阅图形可视化程序教程。

HISTOGRAM是训练过程参数分布情况显示。

官方英文翻译:

直方图仪表板用于可视化Tensor的统计分布随时间变化。它可视化通过tf.histogram_summary记录的数据。现在,它的名字有点不正确,因为它不显示直方图;相反,它显示了一些关于分配的高级统计数据。图表上的每一行表示数据分布中的百分位数:例如,底线显示了最小值随时间变化的方式,中间的行显示了中位数的变化。从上到下,行具有以下含义:[最大,93%,84%,69%,50%,31%,16%,7%,最低]。这些百分位数也可以视为正态分布的标准偏差边界:[最大值,μ+1.5σ,μ+σ,μ+0.5σ,μ,μ-0.5σ,μ-σ,μ-1.5σ,最小值]使得从内到外读取的着色区域分别具有宽度[σ,2σ,3σ]。这种直方图可视化有点奇怪,不能有意义地表示多模态分布。我们正在研究一个真正的直方图替换。

官方英文介绍地址:https://github.com/tensorflow/tensorflow/tree/r0.9/tensorflow/tensorboard

注意,本文是在Windows下运行的。

首先我们先写一个Python代码,用来运行显示图形层级结构。

"""
Please note, this code is only for python 3+. If you are using python 2+, please modify the code accordingly.
"""
from __future__ import print_function
import tensorflow as tf


def add_layer(inputs, in_size, out_size, activation_function=None):
    # add one more layer and return the output of this layer
    with tf.name_scope('layer'):
        with tf.name_scope('weights'):
            Weights = tf.Variable(tf.random_normal([in_size, out_size]), name='W')
        with tf.name_scope('biases'):
            biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, name='b')
        with tf.name_scope('Wx_plus_b'):
            Wx_plus_b = tf.add(tf.matmul(inputs, Weights), biases)
        if activation_function is None:
            outputs = Wx_plus_b
        else:
            outputs = activation_function(Wx_plus_b, )
        return outputs


# define placeholder for inputs to network
with tf.name_scope('inputs'):
    xs = tf.placeholder(tf.float32, [None, 1], name='x_input')
    ys = tf.placeholder(tf.float32, [None, 1], name='y_input')

# add hidden layer
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
# add output layer
prediction = add_layer(l1, 10, 1, activation_function=None)

# the error between prediciton and real data
with tf.name_scope('loss'):
    loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
                                        reduction_indices=[1]))

with tf.name_scope('train'):
    train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

sess = tf.Session()

# tf.train.SummaryWriter soon be deprecated, use following
if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1:  # tensorflow version < 0.12
    writer = tf.train.SummaryWriter('C:/logs/', sess.graph)
else: # tensorflow version >= 0.12
    writer = tf.summary.FileWriter("C:/logs/", sess.graph)

# tf.initialize_all_variables() no long valid from
# 2017-03-02 if using tensorflow >= 0.12
if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1:
    init = tf.initialize_all_variables()
else:
    init = tf.global_variables_initializer()
sess.run(init)

# direct to the local dir and run this in terminal:
# $ tensorboard --logdir=logs

然后点击Run运行Python代码。

然后CMD打开命令行终端输入:

tensorboard --logdir=C:/logs


一切正常的话,我们用chrome浏览器打开这个地址:

http://localhost:6006/

因为我们代码只是展示了网络层结构,并没有数据。所以我们点击GRAPHS进行查看网络层结构就可以了。

我们的C盘logs下也有相应的日志文件。



TensorFlow的训练模型在Android和Java的应用及调用
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }