TensorFlow学习笔记(二)之可视化(Tensorboard)

标签: TensorFlow  tensorBoard  可视化

一、Tensorboard简介

Tensorboard是TensorFlow自带的一个强大的可视化工具,也是一个web应用程序套件。通过将tensorflow程序输出的日志文件的信息可视化使得tensorflow程序的理解、调试和优化更加简单高效。支持其七种可视化:

  • SCALARS:展示训练过程中的准确率、损失值、权重/偏置的变化情况
  • IMAGES:展示训练过程中及记录的图像
  • AUDIO:展示训练过程中记录的音频
  • GRAPHS:展示模型的数据流图,以及各个设备上消耗的内存和时间
  • DISTRIBUTIONS:展示训练过程中记录的数据的分布图
  • HISTOGRAMS:展示训练过程中记录的数据的柱状图
  • EMBEDDINGS:展示词向量后的投影分布

界面展示:
这里写图片描述

那如何启动tensorboard呢?使用是手写体识别的例子,源码如下:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import os

os.environ["CUDA_VISIBLE_DEVICES"] = "0"
config = tf.ConfigProto(allow_soft_placement=True)
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.33)
config.gpu_options.allow_growth = True

max_steps = 1000  # 最大迭代次数
learning_rate = 0.001  # 学习率
dropout = 0.9  # dropout时随机保留神经元的比例
data_dir = './MNIST_DATA'  # 样本数据存储的路径
log_dir = './MNIST_LOG'  # 输出日志保存的路径

# 获取数据集,并采用采用one_hot热编码
mnist = input_data.read_data_sets(data_dir, one_hot=True)
sess = tf.InteractiveSession(config=config)

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)

# 初始化权重参数
def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)

# 初始化偏执参数
def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

# 绘制参数变化
def variable_summaries(var):
    with tf.name_scope('summaries'):
        # 计算参数的均值,并使用tf.summary.scaler记录
        mean = tf.reduce_mean(var)
        tf.summary.scalar('mean', mean)

        # 计算参数的标准差
        with tf.name_scope('stddev'):
            stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
        # 使用tf.summary.scaler记录记录下标准差,最大值,最小值
        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)

# 构建神经网络
def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):
    # 设置命名空间
    with tf.name_scope(layer_name):
        # 调用之前的方法初始化权重w,并且调用参数信息的记录方法,记录w的信息
        with tf.name_scope('weights'):
            weights = weight_variable([input_dim, output_dim])
            variable_summaries(weights)
        # 调用之前的方法初始化权重b,并且调用参数信息的记录方法,记录b的信息
        with tf.name_scope('biases'):
            biases = bias_variable([output_dim])
            variable_summaries(biases)
        # 执行wx+b的线性计算,并且用直方图记录下来
        with tf.name_scope('linear_compute'):
            preactivate = tf.matmul(input_tensor, weights) + biases
            tf.summary.histogram('linear', preactivate)
        # 将线性输出经过激励函数,并将输出也用直方图记录下来
        activations = act(preactivate, name='activation')
        tf.summary.histogram('activations', activations)
    # 返回激励层的最终输出
    return activations

hidden1 = nn_layer(x, 784, 500, 'layer1')

# 创建dropout层
with tf.name_scope('dropout'):
    keep_prob = tf.placeholder(tf.float32)
    tf.summary.scalar('dropout_keep_probability', keep_prob)
    dropped = tf.nn.dropout(hidden1, keep_prob)

y = nn_layer(dropped, 500, 10, 'layer2', act=tf.identity)

# 创建损失函数
with tf.name_scope('loss'):
    # 计算交叉熵损失(每个样本都会有一个损失)
    diff = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)
    with tf.name_scope('total'):
        # 计算所有样本交叉熵损失的均值
        cross_entropy = tf.reduce_mean(diff)
    tf.summary.scalar('loss', cross_entropy)

# 使用AdamOptimizer优化器训练模型,最小化交叉熵损失
with tf.name_scope('train'):
    train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)

# 计算准确率
with tf.name_scope('accuracy'):
    with tf.name_scope('correct_prediction'):
        # 分别将预测和真实的标签中取出最大值的索引,弱相同则返回1(true),不同则返回0(false)
        correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
    with tf.name_scope('accuracy'):
        # 求均值即为准确率
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

tf.summary.scalar('accuracy', accuracy)

# summaries合并
merged = tf.summary.merge_all()
# 写到指定的磁盘路径中
train_writer = tf.summary.FileWriter(log_dir + '/train', sess.graph)
test_writer = tf.summary.FileWriter(log_dir + '/test')

# 运行初始化所有变量
tf.global_variables_initializer().run()

def feed_dict(train):
    """Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""
    if train:
        xs, ys = mnist.train.next_batch(100)
        k = dropout
    else:
        xs, ys = mnist.test.images, mnist.test.labels
        k = 1.0
    return {x: xs, y_: ys, keep_prob: k}

for i in range(max_steps):
    if i % 10 == 0:  # 记录测试集的summary与accuracy
        summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
        test_writer.add_summary(summary, i)
        print('Accuracy at step %s: %s' % (i, acc))
    else:  # 记录训练集的summary
        summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
        train_writer.add_summary(summary, i)

train_writer.close()
test_writer.close()

在pycharm中执行这段代码,效果如下:
这里写图片描述
同时,在训练的时候打开命令行,输入下面命令,启动TesnorBoard:

tensorboard --logdir=./MNIST_LOG/

这里写图片描述
这里生成一个链接地址,复制到游览器中查看各个模块的内容。

总的来说步骤如下:

  1. 创建writer,写日志文件:tf.summary.FileWriter(log_dir + ‘/train’, sess.graph)
  2. 保存日志文件:writer.close()
  3. 运行可视化命令,启动服务:tensorboard –logdir /path/
  4. 打开可视化界面,通过浏览器打开服务器访问端口http://xxx.xxx.xxx.xxx:6006

二、SCALARS面板

SCALARS 面板,统计tensorflow中的标量(如:学习率、模型的总损失)随着迭代轮数的变化情况。SCALARS 面板的左边是一些选项,包括Split on undercores(用下划线分开显示)、Data downloadlinks(数据下载链接)、Smoothing(图像的曲线平滑程度)以及Horizontal Axis(水平轴)的表示,其中水平轴的表示分3 种(STEP 代表迭代次数,RELATIVE 代表按照训练集和测试集的相对值,WALL 代表按照时间)。图中右边给出了准确率变化曲线。
如下图二所示,SCALARS栏目显示通过函数tf.summary.scalar()记录的数据的变化趋势。如下所示代码可添加到程序中,用于记录学习率的变化情况。

tf.summary.scalar('accuracy', accuracy)

这里写图片描述

SCALARS 面板中还绘制了每一层的偏置(biases)和权重(weights)的变化曲线,包括每
次迭代中的最大值、最小值、平均值和标准差,如下图,layer1层:
这里写图片描述
layer2层:
这里写图片描述

构建损失曲线:

tf.summary.scalar('loss', cross_entropy)

这里写图片描述

三、IMAGES面板

图像仪表盘,可以显示通过tf.summary.image()函数来保存的png图片文件。

1. # 指定图片的数据源为输入数据x,展示的相对位置为[-1,28,28,1] 
2. image_shaped_input = tf.reshape(x, [-1, 28, 28, 1])
3. # 将input命名空间下的图片放到summary中,一次展示10张 
4. tf.summary.image('input', image_shaped_input , 10) 

如上面代码,将输入数据中的png图片放到summary中,准备后面写入日志文件。运行程序,生成日志文件,然后在tensorboard的IMAGES栏目下就会出现如下图一所示的内容(实验用的是mnist数据集)。仪表盘设置为每行对应不同的标签,每列对应一个运行。图像仪表盘仅支持png图片格式,可以使用它将自定义生成的可视化图像(例如matplotlib散点图)嵌入到tensorboard中。该仪表盘始终显示每个标签的最新图像。
IMAGES面板展示训练过程中及记录的图像,下图展示了数据集合测试数据经过处理后图片的样子:
这里写图片描述

四、AUDIO

AUDIO 面板是展示训练过程中处理的音频数据。可嵌入音频的小部件,用于播放通过tf.summary.audio()函数保存的音频。一个音频summary要存成 的二维字符张量。其中,k为summary中记录的音频被剪辑的次数,每排张量是一对[encoded_audio, label],其中,encoded_audio 是在summary中指定其编码的二进制字符串,label是一个描述音频片段的UTF-8编码的字符串。
仪表盘设置为每行对应不同的标签,每列对应一个运行。该仪表盘始终嵌入每个标签的最新音频。

五、GRAPHS

GRAPHS 面板是对理解神经网络结构最有帮助的一个面板,它直观地展示了数据流图。下图所示界面中节点之间的连线即为数据流,连线越粗,说明在两个节点之间流动的张量(tensor)越多。
这里写图片描述

在GRAPHS 面板的左侧,可以选择迭代步骤。可以用不同Color(颜色)来表示不同的Structure(整个数据流图的结构),或者用不同Color 来表示不同Device(设备)。例如,当使用多个GPU 时,各个节点分别使用的GPU 不同。当我们选择特定的某次迭代时,可以显示出各个节点的Compute time(计算时间)以及Memory(内存消耗)。
这里写图片描述

六、DISTRIBUTIONS

DISTRIBUTIONS 面板和接下来要讲的HISTOGRAMS 面板类似,只不过是用平面来表示来自特定层的**前后、权重和偏置的分布,它显示了一些分发的高级统计信息。
这里写图片描述

七、HISTOGRAMS

HISTOGRAMS面板,统计tensorflow中的张量随着迭代轮数的变化情况。它用于展示通过tf.summary.histogram记录的数据的变化趋势。如下代码所示:

# 用直方图记录参数的分布
tf.summary.histogram('histogram', var)

# 执行wx+b的线性计算,并且用直方图记录下来
tf.summary.histogram('linear', preactivate)

# 将线性输出经过激励函数,并将输出也用直方图记录下来
tf.summary.histogram('activations', activations)

上述代码将神经网络中某一层的参数分布、线性计算结果、经过激励函数的计算结果信息加入到日志文件中,运行程序生成日志后,启动tensorboard就可以在HISTOGRAMS栏目下看到对应的展开图像。
HISTOGRAMS 主要是立体地展现来自特定层的**前后、权重和偏置的分布。
这里写图片描述

八、EMBEDDINGS

EMBEDDINGS 面板展示的是词嵌入投影仪。(后续做词嵌入的时候更新上…….)

版权声明:本文为john_bh原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/john_bh/article/details/80366596

智能推荐

TensorFlow——TensorBoard可视化

前言 TensoeFlow可用于训练大规模深度神经网络所需的计算,使用该工具涉及的计算往往复杂而深奥。为了方便TensorFlow程序的理解、调试与优化,TensorFlow提供了TensorBoard可视化工具。 实现程序可视化过程: 数据序列化—events文件 启动TensorBoard 1、数据序列化—events文件 TensorBoard通过读取TensorFl...

Tensorflow——Tensorboard可视化

1.前言 本节内容会用到浏览器, 而且与 tensorboard 兼容的浏览器是 “Google Chrome”. 使用其他的浏览器不保证所有内容都能正常显示. 学会用 Tensorflow 自带的 tensorboard 去可视化我们所建造出来的神经网络是一个很好的学习理解方式. 用最直观的流程图告诉你你的神经网络是长怎样,有助于你发现编程中间的问题和疑问. 2.搭建网络...

Tensorflow可视化 Tensorboard

如何在训练过程中直观地观察loss和acc的曲线? TensorBoard是Tensorflow可视化工具,可以用来展现标量、文本、音频、图像、网络结构、网络各层权值偏移量的统计直方图等。 Tensorboard虽然是个好工具,但对于计算机知识欠缺的小白,操作稍有些麻烦。 操作关键点:基于Web浏览器可视化,即Tensorflow将监控数据写入文件、需要利用浏览器Web后端查看对应的数据。 创建监...

tensorflow tensorboard可视化

参考链接: https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/4-1-tensorboard1/  莫烦tensorboard可视化教程 http://wiki.jikexueyuan.com/project/tensorflow-zh/how_tos/summaries_and_tensorboard....

tensorflow可视化--tensorboard

在训练过程中,可以通过tensorboard来查看运行的图以及误差等数据的变化过程,以下介绍tensorboard的几个模块。 (一)简单的结构说明 (1)整个大框架说明 如图1所示,tensorboard的结构包括:inputs,layer1,layer2,loss,train这几个大框架,这几个框架是在同一层次的。 图1 整个网络的大框架结构图 (2)每个layer的细则 如图2所示,tens...

猜你喜欢

Tensorboard 可视化 Tensorflow

1. tensorborad查看神经网络结构: 使用这样的代码为你的结构命名:缩进部分是你的相应的结构   当然,我们要在程序运行后,保存在日志文件: 在创建完你的 sess=tf.Session()后面加入以下代码: 这是表示,将日志存在你的代码位置下的logs文件夹。 然后进入命令行(windows下要先**你的tensorflow环境),进入logs所在位置 如上图,输入...

深度学习之TensorBoard可视化

深度学习之TensorBoard可视化 TensorBoard是TensorFlow下的一个可视化的工具,可以通过直观的图像显示出我们的训练过程,个人认为还是非常好用的。 Tensorflow安装时应该是自带的,我这里是用的yolov3的训练,保存了loss和val_loss; 使用方法很简单,在训练过程中保存过程日志,在日志目录下运行 进入终端给你的6006网址,即可打开可视化界面 当然可以显示...

Tensorflow中可视化好助手Tensorboard(二)

Tensorflow中可视化好助手Tensorboard(一)中,已经讲过如何可视化TensorBoard整个神经网络结构的过程。其实TensorBoard还可以可视化训练过程(weights、biase和outputs变化过程)。本篇文章,讲解一下可视化训练过程的图片如何产生。 首先,看效果图: 我们实现的神经网络还是《用Tensorflow构建一个神经网络》中的神经网络。 图1:神经网络中we...

TensorFlow 2.0 入门实战笔记(六)Tensorboard可视化

目录 六、 Tensorboard可视化 6.1 数据可视化 6.2 图片可视化 六、 Tensorboard可视化 6.1 数据可视化 Step1:创建日志写入地址,文件夹名为logs Step2:喂入监听数据,设置时间戳 Step3:打开监听 使用Terminal进入程序文件根目录,输入tensorboard --logdir logs其中logs对应第一步中文件夹名 Step4:打开WEB端...

冒泡排序,及改进方式,性能优化400%>>>附图解加源码

首先源码附上,源码中带有注释,看不懂没关系,源码后面附带图解,最后附上代码效率提升图 源码如下: 方案一:其实实现很简单,两层循环,每次内层迭代出最大的一个值,将其放入数组最后一个位置,外层循环的末端便往前移一位。其原理如下图 方案一代码块: 方案二:优化改进 仔细观察上面的图,我们不难发现当迭代到图下这样的情况时,其实已经全排序好了,但是我们还是需要对它进行1,2,3,4,5,6的迭代,这些情况...