欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Tensorflow 可视化 Tensorboard2 训练过程

程序员文章站 2024-03-19 18:22:28
...

TesorBorad除了可以可视化整个神经网络结构的过程以外 tensorboard还可以可视化训练过程( b w 变化过程)。

下图展示不同标签显示的不同数据过程
Tensorflow 可视化 Tensorboard2 训练过程

Tensorflow 可视化 Tensorboard2 训练过程

Tensorflow 可视化 Tensorboard2 训练过程

Tensorflow 可视化 Tensorboard2 训练过程

显示训练过程的关键方法

层中的变化数据会在DISTRIBUTIONS 和 HISTOGRAMS 里面出现

tensorflow中提供了tf.summary.histogramy()方法,用来绘制图片, 第一个参数是图表的名称, 第二个参数是图表要记录的变量 

tf.summary.histogram(layer_name+”/Weights”,Weights)

loss 和其他参数不一样 loss是在tesnorBorad 的SCALARS下面的, 这是由于我们使用的是* tf.summary.scalar() *方法.

with tf.name_scope("loss"):
    loss =tf.reduce_mean(tf.reduce_sum(tf.square(y_input - layer_output),reduction_indices=[1]),name = "loss")#二者差的平方求和再取平均
    tf.summary.scalar("loss",loss)

接下来, 开始合并打包。* tf.summary.merge_all() *方法会对我们所有的 summaries 合并到一起. 因此在原有代码片段中添加:

with tf.Session() as sess:
    #合并打包 summary 到文件中
    merged = tf.summary.merge_all()
    #把整个框架加载到文件中去,在通过浏览器观看这个文件 sess.graph 收集信息,并放在该文件中
    writer = tf.summary.FileWriter("logs/",sess.graph)
    sess.run(init)
    #merged 也是需要run 才能发挥作用的,所以在for循环中写下
    for i in range(1000):
        sess.run(train_step, feed_dict={x_input:x_data,y_input:y_data})
        if i% 50:
            result = sess.run(merged,feed_dict={x_input:x_data,y_input:y_data}) #返回一个 summary 
            #将summary 放进 writer 里面
            writer.add_summary(result,i)

完整代码 :

#coding:utf-8
import tensorflow as tf 
import numpy as np
import matplotlib.pyplot as plt #pyhton中输出结果可视化模块

#定义添加神经层的函数def add_layer(),它有四个参数:
#输入值、输入的大小、输出的大小和激励函数,我们设定默认的激励函数是None
def add_layer(inputs,input_size,output_seiz,n_layer,activation_function = None):    
    layer_name = "layer%s" %n_layer
    with tf.name_scope("layer_name"):
        #开始定义weights和biases
        with tf.name_scope('Weights'):
            Weights = tf.Variable(tf.random_normal([input_size,output_seiz]),name = "W")#in_size行, out_size列的随机变量矩阵
            tf.summary.histogram(layer_name+"/Weights",Weights) #添加后可以观看变化的变量
        #机器学习中,biases的推荐值不为0,所以我们这里是在0向量的基础上又加了0.1
        with tf.name_scope('Biases'):
            biases = tf.Variable(tf.zeros([1,output_seiz])+0.1,name = "b")
            tf.summary.histogram(layer_name+"/Biases",biases)
        #定义神经网络未**的值。tf.matmul()是矩阵的乘法。
        with tf.name_scope('Wx_plus_b'):
            Wx_plus_b = tf.matmul(inputs,Weights)+biases
            tf.summary.histogram(layer_name+"/Wx_plus_b",Wx_plus_b)
        #当activation_function——激励函数为None时,输出就是当前的预测值——Wx_plus_b,
        #不为None时,就把Wx_plus_b传到activation_function()函数中得到输出
        if activation_function is None:
            # None 表示线性关系 无需激励函数
            output_seiz = Wx_plus_b
        else:
            output_seiz = activation_function(Wx_plus_b)

        # 返回输出 添加一个神经层的函数——def add_layer()就定义好了。
        tf.summary.histogram(layer_name+"/output_seiz",output_seiz) #添加后可以观看变化的变量
        return output_seiz


x_data = np.linspace(-1,1,300)[:,np.newaxis] #-1到1这个区间里有300个单位,维度 二维
noise = np.random.normal(0, 0.05, x_data.shape).astype(np.float32) #噪点
y_data = np.square(x_data)-0.5 #x_data的二次放 - 0.5

#输入
with tf.name_scope("inputs_layer"):
    x_input = tf.placeholder(tf.float32,[None,1],name = "x_input")

    y_input = tf.placeholder(tf.float32,[None,1],name = "y_input")


#简单的三层神经网络:
# 输入层1个神经元 | 隐藏层假设10个神经元 | 输出层1个神经元

#定义隐藏层
layer_hint = add_layer(x_input,1,10,n_layer = 1,activation_function = tf.nn.relu)

#定义输出层
layer_output = add_layer(layer_hint,10,1,n_layer =2,activation_function = None)
with tf.name_scope("loss"):
    loss =tf.reduce_mean(tf.reduce_sum(tf.square(y_input - layer_output),reduction_indices=[1]),name = "loss")#二者差的平方求和再取平均
    tf.summary.scalar("loss",loss)

#每一个练习的步骤 通过 优化器以0.1的学习效率对误差进行更正提升,下一次就会有更好的结果。
with tf.name_scope("train_step"):
    train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

#初始
init = tf.global_variables_initializer()

with tf.Session() as sess:
    #合并打包 summary 到文件中
    merged = tf.summary.merge_all()
    #把整个框架加载到文件中去,在通过浏览器观看这个文件 sess.graph 收集信息,并放在该文件中
    writer = tf.summary.FileWriter("logs/",sess.graph)
    sess.run(init)
    # #先生成图片框
    # fig = plt.figure()
    # ax = fig.add_subplot(1,1,1)#做连续性的画图
    # #plot上真实数据
    # ax.scatter(x_data,y_data)
    # plt.ion()
    # #打印输出
    # plt.show()
    for i in range(1000):
        sess.run(train_step, feed_dict={x_input:x_data,y_input:y_data})
        if i% 50:
            result = sess.run(merged,feed_dict={x_input:x_data,y_input:y_data}) #返回一个 summary 
            #将summary 放进 writer 里面
            writer.add_summary(result,i)
            # try:
            #   #抹去上面一条线
            #   ax.lines.remove(lines[0])
            # except Exception:
            #   pass
            # #显示出预测数据
            # prediction_value = sess.run(layer_output,feed_dict={x_input:x_data})
            # #通过曲线形式plot上去 宽度为5的红色的线
            # lines = ax.plot(x_data, prediction_value, 'r-', lw=5)
            # #暂停0.1秒
            # plt.pause(0.1)

            # print sess.run(loss,feed_dict={x_input:x_data,y_input:y_data})

程序运行完毕之后, 会产生logs目录 , 使用命令 tensorboard –logdir logs
就可以在浏览器中查看数据的训练过程了。