基于tensorflow-神经网络tensorboard

吃可爱长大的小学妹 提交于 2020-03-07 18:28:53

tensorboard是tensorflow自带的一个强大的可视化工具,使用tensorboard可以帮助我们构建模型,可视化”也叫做数据可视化。是关于数据之视觉表现形式的研究。这种数据的视觉表现形式被定义为一种以某种概要形式抽提出来的信息,包括相应信息单位的各种属性和变量。数据进行摘要(summary)与处理,其次运行代码,可以生成了一个或多个事件文件(event files),最后启动TensorBoard的Web服务器。

这次是用上一次卷积神经网络的代码,对卷积神经网络进行可视化:
导入相关库与数据集:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

参数设置与构建模型

mnist=input_data.read_data_sets("MNIST_data",one_hot=True)
#批次大小
batch_size=100
#计算一共有多少个批次
n_batch=mnist.train.num_examples // batch_size
#初始化权值
def weight_variable(shape,name):
    initial=tf.truncated_normal(shape,stddev=0.1)   #生成一个截断的正态分布
    return tf.Variable(initial,name)
#初始化偏置值
def bias_variable(shape,name):
    initial=tf.constant(0.1,shape=shape)
    return tf.Variable(initial,name)
#卷积层
def conv2d(x,W):
    #x:输入一个tensor,[batch(批次),in_height(高),in_width(宽),in_channels(通道数:黑白为1,彩色为3)]
    #W:滤波器(卷积核)也是一个tensor,[filter_height(滤波高),filter_width(滤波宽),in_channels(输入通道数),out_channels(输出通道数)]
    #strides是步长,strides[0]=strides[3]=1,strides[1]代表x方向的步长,strides[2]代表y方向的步长
    #padding有两种值:“SAME”或“VALD”
    return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')
#池化层
def max_pool_2x2(x):
    #ksize窗口大小,ksize[0]=ksize[3]=1,ksize[1]和ksize[2]可调整大小
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
#定义placeholder
#命名空间
with tf.name_scope('input'):
    x=tf.placeholder(tf.float32,[None,784],name='x-input')  #28*28的大小
    y=tf.placeholder(tf.float32,[None,10],name='y-input')
    with tf.name_scope('x_image'):
        #改变x的格式转为4D的向量[batch,in_heigth,in_width,in_channels]
        x_image=tf.reshape(x,[-1,28,28,1],name='x-image')
#初始化第一个卷积层的权值和偏置值
with tf.name_scope('Conv1'):
    with tf.name_scope('W_conv1'):
        W_conv1=weight_variable([5,5,1,32],name='W_conv1')#5*5的采样窗口,32个卷积核从1个平面抽取特征
    with tf.name_scope('b_conv1'):
        b_conv1=bias_variable([32],name='b_conv1')           #每一个卷积核一个偏置值
 #把x_image和权值向量进行卷积,再加上偏置值,应用于relu激活函数
    with tf.name_scope('conv1d_1'):
        conv1d_1=conv2d(x_image,W_conv1)+b_conv1
    with tf.name_scope('relu'):
        h_conv1=tf.nn.relu(conv1d_1)
    with tf.name_scope('h_pool1'):
        h_pool1=max_pool_2x2(h_conv1)
#初始化第二个卷积层的权值和偏置值
with tf.name_scope('Conv2'):
    with tf.name_scope('W_conv2'):
        W_conv2=weight_variable([5,5,32,64],name='W_conv2')    #5*5的采样窗口,64个卷积核从32个平面抽取特征
    with tf.name_scope('b_conv2'):    
        b_conv2=bias_variable([64],name='b_conv2')             #每一个卷积核一个偏置值
 #把h_pool1和权值向量进行卷积,再加上偏置值,应用于relu激活函数
    with tf.name_scope('conv2d_2'):
        conv2d_2=conv2d(h_pool1,W_conv2)+b_conv2
    with tf.name_scope('relu'):
        h_conv2=tf.nn.relu(conv2d_2)
    with tf.name_scope('h_pool2'):
        h_pool2=max_pool_2x2(h_conv2)
#初始化第一个全连接层的权值
with tf.name_scope('fc1'):
    with tf.name_scope('W_fc1'):
        W_fc1=weight_variable([7*7*64,1024],name='W_fc1')    #上一层7*7*64个神经元,全连接层1024个神经元
    with tf.name_scope('b_fc1'):
        b_fc1=bias_variable([1024],name='b_fc1')    #1024个结点
#把池化层2的输出扁平化为1维
    with tf.name_scope('h_pool2_flat'):
        h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64],name='h_pool2_flat')
#求第一个全连接层的输出
    with tf.name_scope('wx_plus_b1'):
        wx_plus_b1=tf.matmul(h_pool2_flat,W_fc1)+b_fc1
    with tf.name_scope('relu'):
        h_fc1=tf.nn.relu( wx_plus_b1)
#Keep_prob用来表示神经元的输出概率
    with tf.name_scope('keep_prob'):
        keep_prob=tf.placeholder(tf.float32,name='keep_prob')
    with tf.name_scope('h_fc1_drop'):
        h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob,name='h_fc1_drop')
 #初始化第二个全连接层的权值
with tf.name_scope('fc2'):
    with tf.name_scope('W_fc2'):
        W_fc2=weight_variable([1024,10],name='W_fc2')   #1024个神经元,10个分类
    with tf.name_scope('b_fc2'):
        b_fc2=bias_variable([10],name='b_fc2')
 #输出
    with tf.name_scope('wx_plus_b2'):
        wx_plus_b2=tf.matmul(h_fc1_drop,W_fc2)+b_fc2
    with tf.name_scope('softmax'):
        prediction=tf.nn.softmax(wx_plus_b2)
  #交叉熵函数
with tf.name_scope('cross_entorpy'):
    cross_entropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction),name='cross_entropy')
    scalar_cross_entropy=tf.summary.scalar('cross_entropy',cross_entropy)
#优化器
with tf.name_scope('train'):
    train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)    #学习率是10的负4次方
#结果保存在布尔列表中
with tf.name_scope('accuracy'):
    with tf.name_scope('correct_prediction'):
        correct_prediction=tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))
#准确率
    with tf.name_scope('accuracy'):
        accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
        scalar_accuracy=tf.summary.scalar('accuracy',accuracy)                                                                    

保存并训练模型

merged=tf.summary.merge_all()
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())   #初始化变量
    train_writer=tf.summary.FileWriter('logs/train',sess.graph)
    test_writer=tf.summary.FileWriter('logs/test',sess.graph)
    for i in range(1001):
        #训练模型
        batch_xs,batch_ys=mnist.train.next_batch(batch_size)
        sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.5})#Keep_prob表示Dropout
        #记录训练集计算的参数
        summary=sess.run(scalar_accuracy,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.0})
        train_writer.add_summary(summary,i)
        #记录测试集计算的参数
        batch_xs,batch_ys=mnist.test.next_batch(batch_size)
        summary=sess.run(scalar_accuracy,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.0})
        test_writer.add_summary(summary,i)

	if i%100==0:
            test_acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})
            train_acc=sess.run(accuracy,feed_dict={x:mnist.train.images[:1000],y:mnist.train.labels[:1000],keep_prob:1.0})
            print("Iter"+str(i)+",Testing Accuracy="+str(test_acc)+",Train Accuracy="+str(train_acc))

运行结果:
在这里插入图片描述
准确率的可视化
在这里插入图片描述计算图模型的可视化
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!