本文为tensorboard的进一步使用,tensorboard的安装及最初使用方法见【tensorflow入门】10、可视化--Tensorboard的安装、使用、排雷
代码见文章最后。
一、踩雷!
本人跟着莫烦教程学习,莫烦教程视频中的tensorflow代码现在已不适用,我改了好久!
1、几个函数更新:
否则会报错!
2、tensorboard的图好像每次只能使用一个,不然会报奇怪的错误:
错误特别长,报错的具体内容:
InvalidArgumentError: You must feed a value for placeholder tensor 'inputs/x_input' with dtype float and shape [?,1]
[[{{node inputs/x_input}} = Placeholder[dtype=DT_FLOAT, shape=[?,1], _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
萌新暂时看不懂,但是百度到了解决方案:
这两种方案中,方法一只需要在自己程序的开头加上tf.reset_default_graph()即可,本人使用后便不报错了。
tf.reset_default_graph函数:用于清除默认图形堆栈并重置全局默认图形。
还有博主说这个报错是因为tf.summary.merge_all()导致的,本人尝试换用其他函数但并没有成功。
3、tensorboard不能正常显示:
命令行在给出http://127.0.0.1:6006/的同时还显示了些其它内容,本人get不到这是怎么了。输入网址也没法正常显示:
研究了半天,应该是进程之间冲突了?上一个程序没关又新打开一个就会这样报错。
解决方案:正经重启一下软件。重启电脑也行~
此时命令行不再出现奇怪的文字,会给出http://127.0.0.1:6006/,复制到浏览器便可正常显示:
实在是太不容易了,连环踩雷。
二、代码实现
关键代码:
具体代码:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt #Python中画图的工具包
tf.reset_default_graph()
#添加神经层的函数
def add_layer(inputs,in_size,out_size,n_layer,activation_function=None): #传入n_layer
layer_name = 'layer%s'%n_layer
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) #histogram
with tf.name_scope('biases'):
biases = tf.Variable(tf.zeros([1,out_size])+0.1,name='b') #1维
tf.summary.histogram(layer_name+'/biases',biases)
with tf.name_scope('Wx_plus_b'):
Wx_plus_b = 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
x_data = np.linspace(-1,1,300)[:,np.newaxis] #300行1列
noise = np.random.normal(0,0.05,x_data.shape)
y_data = np.square(x_data) -0.5 + noise
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')
l1 = add_layer(xs,1,10,n_layer=1,activation_function=tf.nn.relu)
prediction = add_layer(l1,10,1,n_layer=2,activation_function=None)
with tf.name_scope('loss'):
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]))
tf.summary.scalar('loss',loss) #不用histogram观看,它在event中显示 非常重要!
with tf.name_scope('train'):
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
init = tf.global_variables_initializer()
sess = tf.Session()
merged = tf.summary.merge_all() #把所有的summary合并在一起,打包放到summaryWritter上面
writer = tf.summary.FileWriter("logs/",sess.graph) #把框架loading到一个文件中去,之后才能从文件中loading出来放在浏览器中才能观看
#graph将前边的框架信息全部收集起来,一起放到logs文件夹中去
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返回的是summary
writer.add_summary(result,i) #i:记录步数 #把result放入writer里面
# for i in range(1000):
# sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
# if i %50 == 0:
# print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))