4.1 Tensorboard 可视化好帮手 1
Event / Scalar: 展示训练过程中的统计数据(最值,均值等)变化情况
Image: 展示训练过程中记录的图像
Audio: 展示训练过程中记录的音频
Histogram: 展示训练过程中记录的数据的分布图
Graphs: 展示神经网络结构图
可视化整个神经网络的结构
代码是前几节的截取
from __future__ import print_function
import tensorflow as tf
def add_layer(inputs, in_size, out_size, activation_function=None):
# add one more layer and return the output of this layer
with tf.name_scope('layer888'): #为隐藏层添加名字layer888(大框架)
with tf.name_scope('WWWWWWWWW'): #为weights层添加名字WWWWWWWW(小部件)
Weights = tf.Variable(tf.random_normal([in_size, out_size]), name='W') #为weights取名为W
with tf.name_scope('biasesss'):
biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, name='b')
with tf.name_scope('Wx_plus_bbbb'):
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, )
return outputs
# define placeholder for inputs to network
with tf.name_scope('inputsss'):
xs = tf.placeholder(tf.float32, [None, 1], name='x_input')
ys = tf.placeholder(tf.float32, [None, 1], name='y_input')
# 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)
# the error between prediciton and real data
with tf.name_scope('losssss'):
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
reduction_indices=[1]))
with tf.name_scope('trainnnnn'):
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
sess = tf.Session()
# tf.train.SummaryWriter soon be deprecated, use following
if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1: # tensorflow version < 0.12
writer = tf.train.SummaryWriter('logs/', sess.graph)
# tf.initialize_all_variables() no long valid from
# 2017-03-02 if using tensorflow >= 0.12
if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1:
init = tf.initialize_all_variables()
else:
init = tf.global_variables_initializer()
sess.run(init)
# direct to the local dir and run this in terminal:
# $ tensorboard --logdir=logs
代码注释
with tf.name_scope('layer888'): #为隐藏层添加名字layer888(大框架)
with tf.name_scope('WWWWWWWWW'): #为weights层添加名字WWWWWWWW(小部件)
Weights = tf.Variable(tf.random_normal([in_size, out_size]), name='W') #为weights取名为W
#------------------------------------------------------------------------
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu) #有系统自带的激励函数的不做命名,因为他自己有名字relu会自动显示
#------------------------------------------------------------------------
sess = tf.Session()
#将上面保存的图添加到一个目录中(这里建立一个logs目录),graph的作用是将前面定义的东西收集起来生成文件,保存在logs文件夹中,因为要使用sess.graph,所以这条语句要放在tf.Session()后面
writer = tf.summary.FileWriter('logs/',sess.graph) #tf.__version__ > 0.12
运行方法
所在路径下运行文件,运行所在目录下生成的临时文件,所在环境下打开获得的网页链接(若打不开生成的链接,则手动打开备用链接:http://0.0.0.0:6006 or http://localhost:6006)
python ***.py
#---------------------------------
tensorboard --logdir logs
结果:
#不加语句:
with tf.name_scope('WWWWWWWWW'):
结果:
注意事项
Tensorboard兼容google浏览器,推荐使用google浏览器,实测firefox也可以(基于谷歌内核的都可以?)
由于Tensorflow版本的更新,语句如下改变:
tf.train.SummaryWriter('logs/',sess.graph) #tf.__version__ <= 0.12
tf.summary.FileWriter('logs/',sess.graph) #tf.__version__ > 0.12
可能会遇到的问题
TensorBoard attempted to bind to port 6006, but it was already in use
解决方法:
#终端下
lsof -i:6006
#查看PID
kill -9 PID号码
再次运行,完美解决
4.2 Tensorboard 可视化好帮手 2
可视化训练过程
主要语法
#第一个参数表示图表的名字,第二个参数表示要记录的变量
tf.summary.histogram(layer_name + '/weights', Weights) #一般信息在histogram栏显示
tf.summary.scalar('loss', loss) #loss bleu等,在Tensorboard中的scalar栏显示
sess = tf.Session()
#merge也要放在Session()后面
merged = tf.summary.merge_all() #把所有的summary合并在一起/一张图显示
writer = tf.summary.FileWriter("logs/", sess.graph) #创建一个文件并写入summary
init = tf.global_variables_initializer()
sess.run(init)
for i in range(1000):
sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
if i % 50 == 0:
result = sess.run(merged, feed_dict={xs: x_data, ys: y_data}) #merged也需要run才能发挥作用
writer.add_summary(result, i) #把result放进writer里/把result写入到writer对应的文件中,i是记录的步数,记录一次
完整代码
"""
Please note, this code is only for python 3+. If you are using python 2+, please modify the code accordingly.
"""
from __future__ import print_function
import tensorflow as tf
import numpy as np
def add_layer(inputs, in_size, out_size, n_layer, activation_function=None): #传入一个新的值n_layer=1,2
# add one more layer and return the output of this layer
layer_name = 'layer%s' % n_layer #layer1,layer2
with tf.name_scope(layer_name):
with tf.name_scope('weights'):
Weights = tf.Variable(tf.random_normal([in_size, out_size]), name='W')
tf.summary.histogram(layer_name + '/weights', Weights) #第一个参数表示图表的名字,第二个参数表示要记录的变量
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.add(tf.matmul(inputs, Weights), biases)
if activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b, )
tf.summary.histogram(layer_name + '/outputs', outputs)
return outputs
# Make up some real 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
# define placeholder for inputs to network
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')
# 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)
# the error between prediciton and real data
with tf.name_scope('loss'):
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
reduction_indices=[1]))
tf.summary.scalar('loss', loss)
with tf.name_scope('train'):
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
sess = tf.Session()
merged = tf.summary.merge_all()
writer = tf.summary.FileWriter("logs/", sess.graph)
init = tf.global_variables_initializer()
sess.run(init)
for i in range(1000):
sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
if i % 50 == 0:
result = sess.run(merged, feed_dict={xs: x_data, ys: y_data})
writer.add_summary(result, i)
# direct to the local dir and run this in terminal:
# $ tensorboard --logdir logs
之前没有清理掉logs文件夹中的文件,显示的就是这个图,emmmmmmmm,又试了一下,运行完,再训练运行一次,logs文件夹内此时有三个生成的文件,用tensorboard –logdir logs查看,得到的就是这种好几条线的了。。。