zoukankan      html  css  js  c++  java
  • 深度学习原理与框架-Tensorboard可视化展示(代码) 1.tf.reuse_default_graph(进行结构图的重置) 2.tf.summary.FileWriter(writer实例化) 3. write.add_graph(graph的写入) 4. tf.summary.merge_all(将summary进行合并) 5.write.add_summary(将所有summary)

    1. tf.reuse_default_graph() # 对graph结构图进行清除和重置操作

    2.tf.summary.FileWriter(path)构造writer实例化,以便进行后续的graph写入

    参数说明:path表示路径

    3.writer.add_graph(sess.graph) 将当前参数的graph写入到tensorboard中

    参数说明:sess.graph当前的网络结构图

    4. summ = tf.summary.merge_all() # 将所有的summary都添加 

    5. writer.add_summary(s) 将所有的summary写入到tensorboard中

    参数说明:s为sess.run(summ)

    6.tf.summary.image(‘input’, x_image,3) # 在summary中添加图片

    参数说明:‘input’表示名称,x_image表示输入图片,3表示取3张图片

    7.tf.summary.scalar('loss', loss)  # 在summary中添加迭代的曲线图

    参数说明:‘loss’为图的名称,loss为实际损失值

    8.tf.summary.histgram('weights', w)  # 在summary中添加权重参数w的分布图

    参数说明:‘weights’为图的名称,w为参数值

    代码说明:这里主要是分为两部分进行探讨,第一部分是对各个参数指标的画图,第二部分是对比不同的参数组合所能达到的效果

    数据说明:使用的是mnist数据集,即mnist.train.next_batch 

    参数说明:传入的参数包括学习率,是否使用两层卷积,是否使用两层全连接,以及保存的名字

    第一部分代码说明:

                   使用tf.variable_scope(name): 指定范围,然后再定义参数w和b,这样的话画出来的图像更加的清楚

                   使用tf.summary.histogram(‘weight’, w) # 画出参数的柱状图

                   使用tf.summary.image('input', x_image, 3)  # 画出前三个图像的样子

                   使用tf.summary.scalar('loss', loss)  # 画出变化趋势的折线图

                   使用tf.summary.merge_all() 在tensorboard中显示所有的信息

    第一步:使用input_data.read_data_sets('/data', one_hot=True) 读取mnist数据集

    第二步:构造main函数,对学习率,use_two_conv, use_two_fc进行循环

    第三步:构造make_hparam_string用于构造learning,use_two_conv,use_two_fc的字符串,以便作为tensorbord文件的basename

                 第一步:conv_param = 'conv=2' if use_two_conv else 'conv=1' 将True或者False转换为字符串格式

                 第二步:fc_param = 'fc=2' if use_two_fc else 'fc=1' 将True或者False转换为字符串格式

                 第三步:‘lr_%.0E,%s,%s’%(learning, conv_param, fc_param), 将串接的结果返回

    第四步:构建网络mnist_model,将学习率,use_two_conv, use_two_fc, hparam传入

                 第一步:使用tf. reuse_default_graph() 清除和重置默认图形

                 第二步:使用tf.Session() 构造sess

                 第三步:使用tf.placeholder(tf.float32, [None, 784], name='x') 初始化输入x,同时使用tf.reshape(x, [-1, 28, 28, 1]) 重构输入x的维度, 这里使用tf.summary.image('input', x_image, 3) #展示前3个图片,再使用tf.placeholder(tf.float32, [None, 10], name='labels') 构造y

                 第四步:if use_two_conv: 判断是进行二层卷积还是一层卷积

                               调用conv_layer(x, 1, 32, name='conv_1')构造第一层卷积层

                               调用conv_layer(conv_1, 32, 64, name='conv_2') 构造第二层卷积层

                                else:

                               调用conv_layer(x, 1, 64, name='conv') 构造第一层卷积层

                               使用tf.nn.max_pool(conv, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME' ) # 进行降维操作,

                             为了保证不管是哪种情况,操作完以后的维度是相同的,都是-1, 7,7,64 

                第五步:将卷积后的特征图片进行维度的变化,变化为[-1, 7*7*64] 

                第六步:if use_two_fc: 判断是进行二层全连接还是一层全连接

                                 调用fc_layer(x, 7*7*64, 1024, name='fc_1') # 构造第一层全连接

                                 调用logits = fc_layer(fc_1, 1024, 10, name='fc_2') # 构造第二层全连接

                               else:

                                  调用fc_layer(x, 7*7*64, 10, name='fc') # 构造一层全连接层

                第七步:使用with tf.variable_scope('loss') 来定义loss的范围,使用tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits)) 来定义损失值, 使用tf.summary.scalar('loss', loss) # 画出曲线loss的折线图

                第八步:使用tf.train. Adaoptimzer(learning_rate).minimize(loss) 梯度下降来降低损失值

                第九步:with tf.variable_scope('accuracy') 定义准确率,使用tf.equal和tf.reduce_mean计算准确率,使用tf.summary.scalar() 画出准确率的折线图

                第十步:使用summ = tf.summary.merge_all() 将上述的summary全部都加到tensorboard中

                第十一步:使用sess.run(tf.global_variables_initializer()) 进行参数初始化操作

                第十二步:定义tensorboard_dir, 使用tf.summary.FileWriter(tensorboard_dir + hparam) # 将sumary图像写入到当前文件夹下,writer.add_graph(sess.graph) #将graph添加到writer中

               第十三步:进行迭代训练

                              第一步:使用mnist.train.next_batch获得数据集batch

                              第二步:  每迭代5次,就执行[accr, s] = sess.run([accuracy, summ]), 并使用writer.add_summary(s, i)

                              第三步:执行sess.run(train_op)

    第五步:执行main()函数

    import tensorflow as tf
    import numpy as np
    from tensorflow.examples.tutorials.mnist import input_data
    
    # 第一步数据导入
    mnist = input_data.read_data_sets('/data', one_hot=True)
    
    #卷积层的构造
    def conv_layer(input, inputS, outputS, name):
        # 在name的范围内进行操作
        with tf.variable_scope(name):
            # 构造w的初始化矩阵,tf.Variable()维度为[5, 5, inputS, outputS]
            w = tf.Variable(tf.truncated_normal([5, 5, inputS, outputS], stddev=0.05), name='w')
            # 构造b的初始化矩阵,维度为[outputS]
            b = tf.Variable(tf.constant(0.1, shape=[outputS]), name='b')
            # 使用tf.nn.conv2d进行卷积操作
            conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding='SAME')
            # 使用tf.nn.relu进行激活操作
            act = tf.nn.relu(conv)
            # 使用tf.summary.histogram() 做参数分布直方图
            tf.summary.histogram('weights', w)
            tf.summary.histogram('biases', b)
            tf.summary.histogram('activations', act)
            # 进行池化操作,返回结果
            return tf.nn.max_pool(act, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    
    def fc_layer(input, inputS, outputS, name):
        with tf.variable_scope(name):
            w = tf.Variable(tf.truncated_normal([inputS, outputS], stddev=0.05), name='w')
            b = tf.Variable(tf.constant(0.1, shape=[outputS]), name='b')
    
            fc = tf.matmul(input, w) + b
            act = tf.nn.relu(fc)
            tf.summary.histogram('weights', w)
            tf.summary.histogram('biases', b)
            tf.summary.histogram('activations', act)
    
            return act
    # 将输入use_two_conv和use_two_fc转换为字符串, 并将转换后的字符串和learning_rate进行组合
    def make_hparam_string(learning_rate, use_two_conv, use_two_fc):
        conv_param = 'conv=2' if use_two_conv else 'conv=1'
        fc_param = 'fc=2' if use_two_fc else 'fc=1'
        return 'lr_%.0E,%s,%s'%(learning_rate, conv_param, fc_param)
    
    # 构造mnist_model层
    def mnist_model(learning_rate, use_two_conv, use_two_fc, hparam):
        # 使用tf.reset_default_graph() 进行graph的清除和重置操作
        tf.reset_default_graph()
        # 使用tf.Session() 构造执行函数sess
        sess = tf.Session()
        # 使用tf.placeholder() 构造初始化输入
        x = tf.placeholder(tf.float32, [None, 784], name='x')
        # 将x进行维度的变化以便进行后续的卷积操作
        x_images = tf.reshape(x, [-1, 28, 28, 1])
        # 在tf.summary.image在tensorboard画出前3副图
        tf.summary.image('input', x_images, 3)
        # 使用tf.placeholder()构造y的初始化输入
        y = tf.placeholder(tf.float32, [None, 10], name='labels')
        # 如果使用两个卷积层
        if use_two_conv:
            # 构造第一层卷积,输入为x,1为channel,32为输出的num_filter, name表示名字
            conv_1 = conv_layer(x_images, 1, 32, name='conv_1')
            # 构造第二层卷积,输入为conv_1, 32为channel, 64为输出的num_filter, name表示名字
            conv_out = conv_layer(conv_1, 32, 64, name='conv_2')
        else:
            # 构造第一层卷积层,输入为x_images, 1为channel, 64为输出w的num_filter通道数,name表示名字
            conv_1 = conv_layer(x_images, 1, 64, name='conv')
            # 直接进行池化操作,降低矩阵的维度,为了与二次卷积的维度相同
            conv_out = tf.nn.max_pool(conv_1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
        # 对池化的矩阵进行维度的变化,维度转换为[-1, 7*7*64]
        fcIn = tf.reshape(conv_out, [-1, 7*7*64])
        # 使用二层全连接层
        if use_two_fc:
            # 进行第一层全连接层,w的维度是7*7*64, 1024, name表示名字
            fc_1 = fc_layer(fcIn, 7*7*64, 1024, name='fc_1')
            # 进行第二层全连接层,w的维度是1024, 10, name表示名字
            logits = fc_layer(fc_1, 1024, 10, name='fc_2')
        else:
            # 只进行第一层全连接层,w的维度是7*7*64, 10, name表示名字
            logits = fc_layer(fcIn, 7*7*64, 10, name='fc')
        # 将获得的得分计算损失值,tf.reduce_mean(tf.nn.softmax_cross_entrop)进行交叉熵损失值计算
        with tf.variable_scope('loss'):
            loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits))
            # 构造损失值的折线图
            tf.summary.scalar('loss', loss)
        # 使用tf.train.AdamOptimizer进行损失值的降低
        train_op = tf.train.AdamOptimizer(learning_rate).minimize(loss)
        # 计算准确率
        with tf.variable_scope('accuracy'):
            # 使用tf.equal() 计算correct_pred
            correct_pred = tf.equal(tf.argmax(logits, axis=1), tf.argmax(y, 1))
            # 使用tf.reduce_mean() 计算准确率
            accuracy = tf.reduce_mean(tf.cast(correct_pred, 'float'))
            # 在tensorboard画出准确率的折线图
            tf.summary.scalar('accuracy', accuracy)
        # 对参数进行初始化操作
        sess.run(tf.global_variables_initializer())
        # 将所有的summary在tensorboard进行画图
        ssum = tf.summary.merge_all()
        # 构造tensorboard的路径
        tensorboard_dir = './tensorboard/test3/'
        # 构造summary的写入
        writer = tf.summary.FileWriter(tensorboard_dir + hparam)
        # 将graph进行添加
        writer.add_graph(sess.graph)
        # 进行循环迭代
        for i in range(2001):
            # 获得数据
            batch = mnist.train.next_batch(100)
            # 每迭代5次,执行ssum, 将summary进行添加
            if i % 5 == 0:
                [s, accur] = sess.run([ssum, accuracy], feed_dict={x:batch[0], y:batch[1]})
                # 将summary进行添加
                writer.add_summary(s, i)
            # 进行模型的优化操作
            sess.run(train_op, feed_dict={x:batch[0], y:batch[1]})
    

    # 第二步:构建main()函数, 循环学习率,循环use_two_conv以及use_two_fc def main(): for learning_rate in [1E-4]: for use_two_conv in [True]: for use_two_fc in [True]: # 第三步:构建basename,将学习率和use_two_conv和use_two_fc组合成字符串 hparam = make_hparam_string(learning_rate, use_two_conv, use_two_fc) # 第四步:构建网络模型,将学习率,是否使用两个卷积层,是否使用两个全连接层,以及文件的basename传入 mnist_model(learning_rate, use_two_conv, use_two_fc, hparam) # 第五步:执行函数 if __name__ == '__main__': main()

     进入到tensorboard路径下,输入tensorboard --logdir=./test3 

                                

    writer.add_graph(sess.graph)结构图     tf.summary.scalar趋势折线图                  tf.summary.image 前几个图像

        

                tf.summary.distribution参数分布图                                 tf.summary.histgraph参数直方图

     第二部分:对不同的参数做一个对比,上述的代码只要循环处发生了改变

        for learning_rate in [1E-4,1E-3,1E-2]:
    
        # Include "False" as a value to try different model architectures
            for use_two_fc in [True,False]:
                for use_two_conv in [True,False]:
                    for iter_num in [1000,2000,5000]:

    我们可以根据获得的结果,可以使用tersorboard进行参数的筛选

  • 相关阅读:
    $BZOJ4318$
    国庆集训——10.5
    [学习笔记]线段树分治
    数学基础——组合数学
    实验吧:首页>决斗场>训练题库>CTF题库>传统知识+古典密码
    实验吧:首页>决斗场>训练题库>CTF题库>变异凯撒
    实验吧:首页>决斗场>训练题库>CTF题库>杯酒人生
    南京邮电大学网络攻防训练平台:密码学:KeyBoard
    南京邮电大学网络攻防训练平台:密码学:easy!
    实验吧:首页>决斗场>训练题库>CTF题库>困在栅栏里的凯撒
  • 原文地址:https://www.cnblogs.com/my-love-is-python/p/10574933.html
Copyright © 2011-2022 走看看