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/
这里生成一个链接地址,复制到游览器中查看各个模块的内容。
总的来说步骤如下:
- 创建writer,写日志文件:tf.summary.FileWriter(log_dir + ‘/train’, sess.graph)
- 保存日志文件:writer.close()
- 运行可视化命令,启动服务:tensorboard –logdir /path/
- 打开可视化界面,通过浏览器打开服务器访问端口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 面板展示的是词嵌入投影仪。(后续做词嵌入的时候更新上…….)
智能推荐
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的迭代,这些情况...
