tensorflow学习笔记(二)

tensorboard可视化网络结构

这个例子使用tensorboard可视化网络层和训练过程的loss以及权重和bias,可视化结果如附图所示。可视化了神经网络,这个高深莫测的网络不再那么黑了。增加了对神经网络运算过程的理解。

'''这个代码还是在上一篇的基础上改进的,主要对上一篇构建的神经网络进行了可视化,对于大部分上一篇有的注释,在此代码中不再重复注释,如有不清楚的地方,可以参见上一篇最后的代码'''
import tensorflow as tf
import numpy as np
#比上一篇增加了一个参数n_layer,记录是第几层,并用layer_name为可视化的图片进行命名
def add_layer(inputs,in_size,out_size,n_layer,activation_function=None):
    layer_name='layer%s'%n_layer
    with tf.name_scope(layer_name):
        with tf.name_scope('Weights'):
            Weight=tf.Variable(tf.random_normal([in_size,out_size]),name='Weight')
            #用tf.summary.histogram对所有的权重的变化画直方图
            #后面跟的两个参数,第一个参数是直方图的名称,第二个是传入的数据。后面的类似
            tf.summary.histogram(layer_name+'/weights',Weight)
        with tf.name_scope('biases'):
            biases=tf.Variable(tf.zeros([1,out_size])+0.1,name='biases')
            tf.summary.histogram(layer_name + '/biases', biases)
        with tf.name_scope('Wx_plus_b'):
            Wx_plus_b=tf.matmul(inputs,Weight)+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,500)[:,np.newaxis]
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)
L2=add_layer(L1,10,8,n_layer=2,activation_function=tf.nn.sigmoid)
predict=add_layer(L2,8,1,n_layer=3,activation_function=None)

with tf.name_scope('loss'):
    loss=tf.reduce_mean(tf.reduce_sum(tf.square(y_data-predict),reduction_indices=[1]))
    #对loss函数用曲线表示之前的变量是用的直方图表示
    tf.summary.scalar('loss',loss)
with tf.name_scope('train'):
    train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)

merged=tf.summary.merge_all()  #将之前定义的所有summary整合在一起,详细解释看文字部分。
init=tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    #把summary所有的内容写入文件中,writer只是定义了一个操作。后面要去执行。
    writer = tf.summary.FileWriter("E:/Desktop/", sess.graph)
    for _ in range(10000):
        sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
        if _%50==0:
            #sess.run(merged...)将上述所有的merged包含的内容,比如权重、loss等,每训练50次记                    
            #录一次
            result=sess.run(merged,feed_dict={xs:x_data,ys:y_data})
            #将结果写入writer指向的文件中
            writer.add_summary(result,_)

函数:merged=tf.summary.merge_all()
和TensorFlow中的其他操作类似,tf.summary.scalar、tf.summary.histogram、tf.summary.image函数也是一个op,它们在定义的时候,也不会立即执行,需要通过sess.run来明确调用这些函数。因为,在一个程序中定义的写日志操作比较多,如果一一调用,将会十分麻烦,所以Tensorflow提供了tf.summary.merge_all()函数将所有的summary整理在一起。在TensorFlow程序执行的时候,只需要运行这一个操作就可以将代码中定义的所有【写日志操作】执行一次,从而将所有的日志写入日志文件。个人感觉跟init=tf.initialize_all_variables()的效果类似。

之后在桌面上会生成一个文件events.out.tfevents.1542369515.computer类似的文件,然后将终端打开,输入

tensorboard --logdir='/home/computer_1712/Desktop/'    (并不需要输入后面的文件名)也就是存放这个文件的路径,会得到一个网址,将网址复制粘贴到浏览器上打开即可。如图所示:(我在windows上跑的这个程序,生成的文件后在cmd命令提示符下输入此语句,输出的网址打不开,不知道是什么原因,然后我把这个文件拷贝到ubuntu上进行了可视化)

tensorflow学习笔记(二)_第1张图片

可视化的神经网络层的总体结构:

tensorflow学习笔记(二)_第2张图片

第二层详情点开后的结构:

tensorflow学习笔记(二)_第3张图片

loss训练的过程可视化:

tensorflow学习笔记(二)_第4张图片

权重和偏置的可视化:

tensorflow学习笔记(二)_第5张图片

本文参考了tensorflow讲解视频:https://www.bilibili.com/video/av16001891/?p=21

刚开始学tensorflow,如有错误还会后续改正。

你可能感兴趣的:(tensorflow学习)