TensorFlow开发了一个特别有用的可视化工具包:TensorBoard,既可以显示网络结构,又可以显示训练和测试过程中各层参数的变化情况,也是现实神经网络流程图,分为四个部分,第一部分介绍步骤,第二部分是完整代码,第三部分是运行结果。

第一部分:基本步骤

A、神经网络流程图

所有流程图需要添加如下小部件:,网络层层(layer),输入(input-x,input-y),权重(weights),偏置(biases),网络层的输出(outputs),损失函数(loss),训练(train),实例如下:只需添加tf.name_scope()函数就行,tf.name_scope(名字),

with tf.name_scope('weight'):
    Weights=tf.Variable(tf.random_normal([in_size,out_size]),name='W')
with tf.name_scope('biases'):
    biases=tf.Variable(tf.zeros([1,out_size])+0.1,name='b')
with tf.name_scope('inputs'):
    xs=tf.placeholder(tf.float32,[None,1],name='x_in')
    ys=tf.placeholder(tf.float32,[None,1],name='y_in')

 完成所有添加小部件以后,最后添加tf.summary.FileWriter("logs/", sess.graph)。#把图保存到一个路径,FileWriter从tensorflow获取summary data,然后保存到指定路径的日志文件中。logs/是保存在默认路径logs文件夹下。如不理解可以看后面的完整代码,具体代码如下:

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

B、权重偏置等参数变化情况图

各层网络权重,偏置的分布,用summary.histogram函数

做权重偏置等参数变化图,只需在权重和偏置下面添加tf.summary.histogram(节点名称,获取的数据)函数。 具体d代码如下:

with tf.name_scope('weight'):
        Weights=tf.Variable(tf.random_normal([in_size,out_size]),name='W')
        tf.summary.histogram(layer_name+'/Weights',Weights)  #各层网络权重,偏置的分布,用histogram_summary函数
 with tf.name_scope('biases'):
        biases=tf.Variable(tf.zeros([1,out_size])+0.1,name='b')
        tf.summary.histogram(layer_name+'/biases',biases)
注释:layer_name是自定义参数,为网络层的数量。具体可以看后面的完整代码。

其他几种summary data也是同样的方式获取,只是对应的获取函数名称换一下。完成添加summary.histogram函数后,就需要合并所有的summary data的函数。

这些获取summary data函数节点和graph是独立的,调用的时候也需要运行session。当需要获取的数据较多的时候,我们一个一个去保存获取到的数据,以及一个一个去运行会显得比较麻烦。tensorflow提供了一个简单的方法,就是合并所有的summary data的获取函数。采用tf.summary.merge_all()lai来合并所有summary data获取函数。具体代码如下:

merged=tf.summary.merge_all()#合并所有的summary data的获取函数,merge_all 可以将所有summary全部保存到磁盘,以便tensorboard显示。
writer=tf.summary.FileWriter("logs/",sess.graph)#把图保存到一个路径,FileWriter从tensorflow获取summary data,

summary的操作对于整个图来说相当于是外设,因为tensorflow是由结果驱动的,而图的结果并不依赖于summary操作,所以summary操作需要被run,所以添加如下代码

rs=sess.run(merged,feed_dict={xs:x_data,ys:y_data})#运行所有合并所有的图

最后把每一次run的信息和得到的数据加到writer里面。代码如下:i代表迭代次数,具体可以看完成代码。

writer.add_summary(rs,i)#把数据添加到文件中,每一次run的信息和得到的数据加到writer里面

C:loss损失变化图

数值如学习率,损失函数用scalar_summary函数。tf.scalar_summary(节点名称,获取的数据)

具体的和权重偏置变化图类似,只是将tf.summary.histogram函数改成tf.summary.scalar().。若只需要单独要画loss损失变化图,需要添加一个histogram类的图,不然会报错。

loss=tf.reduce_mean(tf.square(ys-prediction))
    tf.summary.scalar('loss',loss)  #数值如学习率,损失函数用scalar_summary函数

不懂可以看完整代码。

2、完整代码

import tensorflow as tf 
import numpy as np 
import matplotlib.pyplot as plt
def add_layer(inputs,in_size,out_size,n_layer,activation_funtion=None):
    layer_name='layer%s'%n_layer
    with tf.name_scope('layer'):
        with tf.name_scope('weight'):
            Weights=tf.Variable(tf.random_normal([in_size,out_size]),name='W')
            tf.summary.histogram(layer_name+'/Weights',Weights)  #各层网络权重,偏置的分布,用histogram_summary函数
        with tf.name_scope('biases'):
            biases=tf.Variable(tf.zeros([1,out_size])+0.1,name='b')
            tf.summary.histogram(layer_name+'/biases',biases)
        with tf.name_scope('Wx_plus_b'):
            Wx_plus_b=tf.matmul(inputs,Weights)+biases  #inputs与weight 顺序不能换
        if activation_funtion is None:
            output=Wx_plus_b
        else:
            output=activation_funtion(Wx_plus_b)
        tf.summary.histogram(layer_name+'/output',output)
    return output

x_data = np.linspace(-1,1,300, dtype=np.float32)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape).astype(np.float32)
y_data = np.square(x_data) - 0.5 + noise
with tf.name_scope('inputs'):
    xs=tf.placeholder(tf.float32,[None,1],name='x_in')
    ys=tf.placeholder(tf.float32,[None,1],name='y_in')

l1=add_layer(xs,1,10,n_layer=1,activation_funtion=tf.nn.relu)
prediction=add_layer(l1,10,1,n_layer=2,activation_funtion=None)

# loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),
#                     reduction_indices=[1]))
with tf.name_scope('loss'):
    loss=tf.reduce_mean(tf.square(ys-prediction))
    tf.summary.scalar('loss',loss)  #数值如学习率,损失函数用scalar_summary函数,tf.scalar_summary(节点名称,获取的数据)
optimizer=tf.train.GradientDescentOptimizer(0.1)
with tf.name_scope('train'):
    train=optimizer.minimize(loss)

init = tf.global_variables_initializer()  # 替换成这样就好
sess=tf.Session()
sess.run(init)
#整个图经常需要检测许许多多的值,也就是许多值需要summary operation,一个个去run来启动太麻烦了,所以就合并所有获得的值
merged=tf.summary.merge_all()#合并所有的summary data的获取函数,merge_all 可以将所有summary全部保存到磁盘,以便tensorboard显示。如果没有特殊要求,一般用这一句就可一显示训练时的各种信息了。
writer=tf.summary.FileWriter("logs/",sess.graph)#把图保存到一个路径,FileWriter从tensorflow获取summary data,然后保存到指定路径的日志文件中
for i in range(1000):
    sess.run(train,feed_dict={xs:x_data,ys:y_data})
    if i%50==0:
        #summary的操作对于整个图来说相当于是外设,因为tensorflow是由结果驱动的,而图的结果并不依赖于summary操作,所以summary操作需要被run
        rs=sess.run(merged,feed_dict={xs:x_data,ys:y_data})#运行所有合并所有的图,获取summary data函数节点和graph是独立的,调用的时候也需要运行session
        writer.add_summary(rs,i)#把数据添加到文件中,每一次run的信息和得到的数据加到writer里面,主要是描述数据变化,所以要这样,若是只有流图,就不需要这样

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

 

3.运行结果

最后在你的terminal(终端)中 ,跳到你的logs文件夹在的路径下,然后输入如下命令,

tensorboard --logdir logs

具体情况如下:

神经网络的各种loss 神经网络loss图_tensorf

同时将终端中输出的网址复制到Google Chrome浏览器中,便可以看到之前定义的视图框架了。

流程图:

神经网络的各种loss 神经网络loss图_loss变化图_02

偏置权重变化图:

神经网络的各种loss 神经网络loss图_loss变化图_03

loss变化图

神经网络的各种loss 神经网络loss图_神经网络的各种loss_04

可能会遇到的问题 

(1) 而且与 tensorboard 兼容的浏览器是 “Google Chrome”. 使用其他的浏览器不保证所有内容都能正常显示.

(2) 请确保你的 tensorboard 指令是在你的 logs 文件根目录执行的. 如果在其他目录下, 比如 Desktop 等, 可能不会成功看到图. 比如在下面这个目录, 你要 cd 到 project 这个地方执行 /project > tensorboard --logdir logs

(3)若是打不开网页,请把360卫士退出来