16 tensorBorad 可视化练习

来源:互联网 发布:阿里云os5.1系统root 编辑:程序博客网 时间:2024/04/30 23:16

上一篇讲到了 如何可视化TesorBorad整个神经网络结构的过程。 其实tensorBorad还可以可视化训练过程( biase变化过程) , 这节重点讲一下可视化训练过程的图标是如何做的 。请看下图, 这是如何做到的呢?

这里写图片描述

在hisograms里面我们还可以看到更多的layers的变化:

这里写图片描述

(P.S. 灰猫使用的tensorflow v1.1 显示的效果可能和视频中的不太一样, 但是tensorBorad 的使用方法的是一样的。)

这里还有一个events , 在这次练习中我们会把 整个训练过程中的误差值(loss)在event里面显示出来, 甚至你可以显示更多你想要显示的东西.

这里写图片描述

好了, 开始练习吧

本次的代码会在上一节的基础上进行修改.

制做输入源

由于这节我们观察训练过程中神经网络的变化, 所以首先要添一些模拟数据.
Python 的numpy 工具包可以帮助我们制造一些模拟数据. 所以我们先导入这个工具包:

from future import print_function
import tensorflow as tf
import numpy as np
1
2
3
4
1
2
3
4
然后借助 np中的np.linespace() 产生随机的数字, 同时为了模拟更加真实我们会添加一些噪声,这些噪声是通过np.random,normal() 随机产生的.

## make up some data
x_data= np.linspace(-1, 1, 300)[:,np.newaxis]
noise= np.random.normal(0, 0.05, x_data.shape)
y_data= np.square(x_data) -0.5+ noise
1
2
3
4
5
1
2
3
4
5
输入源的问题解决之后, 我们开始制作对Weights和biase的变化图表吧. 我们期望可以做到如下的效果, 那么首先从layer1/weight做起吧

这里写图片描述

这个效果是如何做到的呢,请看下一个标题

在layer中为Weights,biases 设置变化图表

通过上图的观察我们发现每个layer后面有有一个数字: layer1 和layer2

于是我们在 add_layer()方法中添加一个参数n_layer ,用来标识层数, 并且用变量layer_name代表其每层的名名称 , 代码如下:

def add_layer(
inputs ,
in_size,
out_size,
n_layer,
activation_function=None):
## add one more layer and return the output of this layer
layer_name=’layer%s’%n_layer ## define a new var

and so on ……

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
接下来,我们层中的Weights设置变化图, tensorflow中提供了tf.histogram_summary()方法,用来绘制图片, 第一个参数是图表的名称, 第二个参数是图表要记录的变量

ef add_layer(inputs ,
in_size,
out_size,n_layer,
activation_function=None):
## add one more layer and return the output of this layer
layer_name=’layer%s’%n_layer
with tf.name_scope(‘layer’):
with tf.name_scope(‘weights’):
Weights= tf.Variable(tf.random_normal([in_size, out_size]),name=’W’)
tf.histogram_summary(layer_name+’/weights’,Weights)

and so no ……

1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
同样的方法我们对biases进行绘制图标:

with tf.name_scope(‘biases’):
biases = tf.Variable(tf.zeros([1,out_size])+0.1, name=’b’)
tf.histogram_summary(layer_name+’/biase’,biases)
1
2
3
4
1
2
3
4
至于activiation_function 可以不绘制. 我们对output 使用同样的方法:

tf.histogram_summary(layer_name+’/outputs’,outputs)
1
1
最终经过我们的修改 , addlayer()方法成为如下的样子:

def add_layer(inputs ,
in_size,
out_size,n_layer,
activation_function=None):
## add one more layer and return the output of this layer
layer_name=’layer%s’%n_layer
with tf.name_scope(‘layer’):
with tf.name_scope(‘weights’):
Weights= tf.Variable(tf.random_normal([in_size, out_size]),name=’W’)
tf.histogram_summary(layer_name+’/weights’,Weights)

     with tf.name_scope('biases'):          biases = tf.Variable(tf.zeros([1,out_size])+0.1, name='b')          tf.histogram_summary(layer_name+'/biase',biases)     with tf.name_scope('Wx_plus_b'):          Wx_plus_b = tf.add(tf.matmul(inputs,Weights), biases)     if activation_function is None:        outputs=Wx_plus_b     else:        outputs= activation_function(Wx_plus_b)     tf.histogram_summary(layer_name+'/outputs',outputs)return outputs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
修改之后的名称会显示在每个tensorBorad中每个图表的上方显示, 如下图所示:

这里写图片描述

由于我们对addlayer 添加了一个参数, 所以修改之前调用addlayer()函数的地方.
对此处进行修改:

add hidden layer

l1= add_layer(xs, 1, 10 , activation_function=tf.nn.relu)

add output layer

prediction= add_layer(l1, 10, 1, activation_function=None)
1
2
3
4
1
2
3
4
添加n_layer参数后, 修改成为 :

add hidden layer

l1= add_layer(xs, 1, 10,n_layer=1, activation_function=tf.nn.relu)

add output layer

prediction= add_layer(l1, 10, 1,n_layer=2, activation_function=None)
1
2
3
4
1
2
3
4
设置loss的变化图

Loss 的变化图和之前设置的方法略有不同. loss是在tesnorBorad 的event下面的, 这是由于我们使用的是tf.scalar_summary() 方法.

loss的变化图

观看loss的变化比较重要. 当你的loss呈下降的趋势,说明你的神经网络训练是有效果的.

修改后的代码片段如下:

with tf.name_scope(‘loss’):
loss= tf.reduce_mean(tf.reduce_sum(
tf.square(ys- prediction), reduction_indices=[1]))
tf.scalar_summary(‘loss’,loss)
1
2
3
4
1
2
3
4
给所有训练图‘合并‘

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

sess= tf.Session()
merged= tf.merge_all_summaries()
writer = tf.train.SummaryWriter(“logs/”, sess.graph)
sess.run(tf.initialize_all_variables())
1
2
3
4
5
1
2
3
4
5
训练数据

假定给出了 x_data,y_data并且训练1000次.

for i in range(1000):
sess.run(train_step, feed_dict={xs:x_data, ys:y_data})
1
2
3
1
2
3
以上这些仅仅可以记录很绘制出训练的图表, 但是不会记录训练的数据。
为了较为直观显示训练过程中每个参数的变化,我们每隔上50次就记录一次结果 , 同时我们也应注意, merged 也是需要run 才能发挥作用的,所以在for循环中写下:

0 0
原创粉丝点击