tensorflow可视化工具库tensorboard使用方法详解

Posted wendy_ya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tensorflow可视化工具库tensorboard使用方法详解相关的知识,希望对你有一定的参考价值。

目录

本文将对tensorboard进行基本介绍,介绍其相应语法并进行示例展示。最后进行相关注意事项的说明。本文基于tensorflow1.(tensorflow1.15)
为方便起见,本文只介绍迭代轮数的变化情况(scalar),而不对计算图的网络结构(graph)和仪表盘进行介绍。

一、Tensorboard介绍

对大部分人而言,深度神经网络就像一个黑盒子,其内部的组织、结构、以及其训练过程很难理清楚,这给深度神经网络原理的理解和工程化带来了很大的挑战。为了解决这个问题,tensorboard应运而生。Tensorboard是tensorflow内置的一个可视化工具,它通过将tensorflow程序输出的日志文件的信息可视化使得tensorflow程序的理解、调试和优化更加简单高效。Tensorboard的可视化依赖于tensorflow程序运行输出的日志文件,因而tensorboard和tensorflow程序在不同的进程中运行。

二、重要语法功能

2.1 tf.summary.FileWriter

该语句用于指定一个文件用来保存图。
语法格式:

tf.summary.FileWriter(logdir, graph=None, flush_secs=120, max_queue=10)

2.2 tf.summary.merge_all

该语句可以将定义的所有summary都保存在日志中,以便tensorboard进行显示。如果没有特殊需要,一般都采用这种方法收集所有要显示的信息。

语法格式:

tf.summaries.merge_all(key='summaries')

应用大多数情况下括号中啥也不写。

2.3 tf.global_variablesinitializer

该语句用于初始化全局变量,并返回一个初始化所有全局变量的操作。一般在模型构建完毕并在会话中加载后,执行此初始化操作。当然也可通过feed_dict初始化,不过这样只初始化feed_dict列表中的变量。

语法格式:

init = tf.global_variables_initializer()

2.4 tf.summary.scalar

该语句用于显示标量信息。记录一个标量,之后产出这个标量和迭代次数i之间关系的曲线图

语法格式:

tf.summary.scalar('name/sub_name',scalar_val)

三、代码详解

完整代码示例如下:

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


# 准备训练数据,假设其分布大致符合 y = 1.2x + 0.0
n_train_samples = 200
X_train = np.linspace(-5, 5, n_train_samples)   # (200,)
Y_train = 1.2*X_train + np.random.uniform(-1.0, 1.0, n_train_samples)  # 加一点随机扰动(200,)


# 准备验证数据,用于验证模型的好坏
n_test_samples = 50
X_test = np.linspace(-5, 5, n_test_samples)     # (50,)
Y_test = 1.2*X_test                             # (50,)


# 参数学习算法相关变量设置
learning_rate = 0.01
batch_size = 20
summary_dir = 'logs'

print('~~~~~~~~~~开始设计计算图~~~~~~~~')

# 使用 placeholder 将训练数据/验证数据送入网络进行训练/验证
# shape=None 表示形状由送入的张量的形状来确定
with tf.name_scope('Input'):
    X = tf.placeholder(dtype=tf.float32, shape=None, name='X')
    Y = tf.placeholder(dtype=tf.float32, shape=None, name='Y')
# 决策函数(参数初始化)
with tf.name_scope('Inference'):
    W = tf.Variable(initial_value=tf.truncated_normal(shape=[1]), name='weight')
    b = tf.Variable(initial_value=tf.truncated_normal(shape=[1]), name='bias')
    Y_pred = tf.multiply(X, W) + b
# 损失函数(MSE)
with tf.name_scope('Loss'):
    loss = tf.reduce_mean(tf.square(Y_pred - Y), name='loss')
    tf.summary.scalar('loss', loss) # 注意事项!!!!!!!!!!!!!
# 参数学习算法(Mini-batch SGD)
with tf.name_scope('Optimization'):
    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)


# 初始化所有变量
init = tf.global_variables_initializer()
# 汇总记录节点
merge = tf.summary.merge_all()  # 将定义的所有summary都保存在日志中,以便tensorboard进行显示
# 开启会话,进行训练
with tf.Session() as sess:
    sess.run(init)
    summary_writer = tf.summary.FileWriter(logdir=summary_dir, graph=sess.graph)    # 指定文件以保存图

    for i in range(201):
        j = np.random.randint(0, 10)  # 总共200训练数据,分十份[0, 9]
        X_batch = X_train[batch_size*j: batch_size*(j+1)]   # batch
        Y_batch = Y_train[batch_size*j: batch_size*(j+1)]

        _, summary, train_loss, W_pred, b_pred = sess.run([optimizer, merge, loss, W, b], feed_dict=X: X_batch, Y: Y_batch)
        test_loss = sess.run(loss, feed_dict=X: X_test, Y: Y_test)

        # 将所有日志写入文件
        summary_writer.add_summary(summary, global_step=i)  # 将训练过程数据保存在summary中[train_loss]
        print('step:, losses:, test_loss:, w_pred:, b_pred:'.format(i, train_loss, test_loss, W_pred[0], b_pred[0]))

        if i == 200:
            # plot the results
            plt.plot(X_train, Y_train, 'bo', label='Train data')    # blue o
            plt.plot(X_test, Y_test, 'gx', label='Test data')       # green x
            plt.plot(X_train, X_train * W_pred + b_pred, 'r', label='Predicted data')   # red line
            plt.legend()
            plt.show()

    summary_writer.close()

运行结果如下:

利用tensorboard查看logs目录下可视化图像:train_loss

四、注意事项

4.1 TypeError: Fetch argument None has invalid type <class ‘NoneType’>

tf.summary.merge_all()要写在tf.summary.scalar()等方法之后,不然会报**TypeError: Fetch argument None has invalid type<class ‘NoneType’>**的错。

4.2 Windows无法正常显示Tensorboard

windows无法正常显示tensorboard的解决方案可以参考文章:https://www.lmlphp.com/user/117206/article/item/2560095/

4.3 显示杂乱

如果发现有一些层链接的关系比较恶心,可以考虑用name_scope简化显示,如上方代码所示。

参考文章:

  1. https://zhuanlan.zhihu.com/p/115802478
  2. https://zhuanlan.zhihu.com/p/37022051

以上是关于tensorflow可视化工具库tensorboard使用方法详解的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow可视化工具库tensorboard使用方法详解

ch2-基本工具介绍

处理人工智能任务必须知道的11个Python库

tensorflow的可视化工具tensorboard的启动教程

tensorflow Tensorboard可视化-老鱼学tensorflow

深度神经网络可视化工具集锦