Tensorboard基础应用

一、生成流程图

1. 给参数命名
with tf.name_scope('Weights'): 
#指定命名空间,对于单个参数,也有命名的作用
    Weights = tf.Variable(tf.random_normal([in_size, out_size]), name='weight')
    #传入name='name'来命名,这里的名字是唯一的,如果重复了,tf会自动在名字末尾加数字后缀
2. 生成日志
sess = tf.Session()
#在定义完session之后,规定路径,输出日志,这里输入的路径是脚本所在目录的相对路径
writer = tf.summary.FileWriter("logs/", sess.graph)
3. 指定日志路径

在控制台执行命令:

user$ tensorboard --logdir="Log Path"
#这里的"Log Path"要替换为日志目录的绝对路径

TensorBoard 1.11.0 at http://127.0.0.1:6006 (Press CTRL+C to quit)
#浏览器打开该链接即可看到Tensorboard生成的流程图


二、训练过程可视化

利用Tensorboard,可以通过图表来观察统计训练过程中参数的变化情况。下面的例子适用于观察Weights和Biases的变化

1. 为参数设置历史变化图表
with tf.name_scope('Layer'):
#1 参数的初始化
    with tf.name_scope('Weights'):
        Weights = tf.Variable(tf.random_normal([in_size, out_size]), name='weight')
        #生成初始参数时,最好用一个随机变量,这里的权值为一个in_size行,out_size列的随机变量矩阵
        tf.summary.histogram(Weights.name, Weights)
        #生成Weights的历史变化图表
        # tf.histogram_summary(layer_name+'/weights',Weights)   # tensorflow 0.12 以下版的

    with tf.name_scope('Biases'):
        Biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, name='bias')
        #机器学习中,偏置的推荐值不为0,因此这里是在0向量的基础上增加了0.1
        tf.summary.histogram(tf.name_scope.name+'/Biases', Biases)
with tf.name_scope('Loss'):
    loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction), axis=1))
    tf.summary.scalar('loss', loss) # tensorflow >= 0.12
2. 将图表合并打包
init = tf.global_variables_initializer()
#使用变量时,需要对它们进行初始化,这一函数可以一次性初始化所有变量

sess = tf.Session()

writer = tf.summary.FileWriter("logs/", sess.graph)

# 进行图表合并
# merged= tf.merge_all_summaries()    # tensorflow < 0.12
merged = tf.summary.merge_all() # tensorflow >= 0.12

sess.run(init)
#定义Session,并进行变量的初始化工作
3. 在图表中写入数据

merged也是需要run才能生效的,这里我们规定训练50次记录一次数据

for i in range(1000):
   sess.run(train_step, feed_dict={xs:x_data, ys:y_data})
   if i%50 == 0:
      rs = sess.run(merged,feed_dict={xs:x_data,ys:y_data})
      writer.add_summary(rs, i)

打开Tensorboard就能看到记录下数据的图表啦


学习笔记(一)~(三)部分源码

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# 一、定义一个添加神经层的函数,有四个参数:输入值、输入值的size、输出的size和激励函数,此处设定默认激励函数为None

def add_layer(inputs, in_size, out_size, activation_function=None):

    with tf.name_scope('Layer'):
    #1 参数的初始化
        with tf.name_scope('Weights'):
            Weights = tf.Variable(tf.random_normal([in_size, out_size]), name='weight')
            #生成初始参数时,最好用一个随机变量,这里的权值为一个in_size行,out_size列的随机变量矩阵
            tf.summary.histogram(Weights.name, Weights)

        with tf.name_scope('Biases'):
            Biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, name='bias')
            #机器学习中,偏置的推荐值不为0,因此这里是在0向量的基础上增加了0.1
            tf.summary.histogram(Biases.name, Biases)

        #2 神经层的输出
        with tf.name_scope('Wx_plus_b'):
            Wx_plus_b = tf.add(tf.matmul(inputs, Weights), Biases)
        #定义神经网络的默认值,matmul为矩阵乘法函数

        if activation_function is None:
            outputs = Wx_plus_b
        else:
            outputs = activation_function(Wx_plus_b)
        #如果激活函数为None,那么outputs = Wx_plus_b,否则outputs为激活函数对Wx_plus_b的响应值

        tf.summary.histogram(outputs.name + '/Outputs', outputs)

    return outputs

# 二、导入数据

#1 构造所需的数据
x_data = np.linspace(-1,1,300,dtype=np.float32)[:, np.newaxis]
#np.newaxis的功能是插入新的维度
#https://blog.csdn.net/mameng1/article/details/54599306
noise = np.random.normal(0,0.05,x_data.shape)
#x_data.shape返回数组的大小,如(2,3)就是2行3列的数组
y_data = np.square(x_data) - 0.5 + noise
#为y值添加一点噪声,更接近真实情况

#2 定义神经网络的输入
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")
    #利用占位符placeholder定义所需的输入,None表示不限定输入的数量,1为输入的行数(或特征的数量,一般的,一行是同一种特征的数据)
    #name是标示这个placeholder的唯一名称,也可以不做定义

# 三、搭建网络
#本例中,我们将搭建:输入层1个,隐藏层10个、输出层1个的神经网络

l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
#l1层有1个输入,10个输出,激励函数为tf自带的tf.nn.relu

prediction = add_layer(l1, 10, 1, activation_function=None)
#输出层predicion的输入为l1的输出,即10个输入,1个输出,激励函数为None

with tf.name_scope('Loss'):
    loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction), axis=1))
    #tf.reduce_mean是通过求平均值对input_tensor降维的函数,axis规定的是降维的方向
#https://blog.csdn.net/yjk13703623757/article/details/77284692
#定义损失函数,这里采用了对(ys-prediction输出值)的平方求和后,再取平均值的办法
    tf.summary.scalar('loss', loss) # tensorflow >= 0.12

with tf.name_scope('Train'):
    train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
    #定义tf要如何学习,这里采用了梯度下降法,选取学习效率为0.1,目标为最小化误差loss

init = tf.global_variables_initializer()
#使用变量时,需要对它们进行初始化,这一函数可以一次性初始化所有变量

sess = tf.Session()

writer = tf.summary.FileWriter("logs/", sess.graph)

# merged= tf.merge_all_summaries()    # tensorflow < 0.12
merged = tf.summary.merge_all() # tensorflow >= 0.12

sess.run(init)
#定义Session,并进行变量的初始化工作

# 三.1、绘图
#plot the real data
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x_data, y_data)
plt.ion() #用于连续绘图
#plt.show() #调用show时会暂停函数的运行,或者传入参数block=False

# 四、学习
#本例的学习边界为进行1000次学习,学习的内容为train_step
#利用feed_dict传入放在placehodler中的数据
for i in range(1000):
    #training,这一步要传入数据集
    sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
    #每50步输出一次loss的值
    if i % 50 == 0:
        #print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))
        try:
            ax.lines.remove(lines[0]) #try去除上一步绘制出来的曲线
        except Exception:
            pass
        prediction_value = sess.run(prediction, feed_dict={xs: x_data})
        #获取prediciton的值,即神经网络的输出
        lines = ax.plot(x_data, prediction_value, 'r-', lw=5)
        #绘制曲线,参数为横坐标,纵坐标,线的颜色和类型,宽度
        #plt.pause(0.1)
        rs = sess.run(merged, feed_dict={xs: x_data, ys: y_data})
        writer.add_summary(rs, i)

sess.close()
#释放资源