如何在Win下使用Tensorboard 可视化工具

      Tensorboard可视化工具是训练过程中很重要的工具。可以实时的检测模型,主要有两个方面的应用,首先是可以检测每一层的偏向 b 和 权重 w的更新过程,另一个作用就是在训练过程中,使用验证集去检测模型的、准确率还有“loss”的实时变化。

1. Tensorboard介绍

1.1 Tensorboard的数据形式

Tensorboard可以记录与展示以下数据形式: 
(1)标量Scalars 
(2)图片Images 
(3)音频Audio 
(4)计算图Graph 
(5)数据分布Distribution 
(6)直方图Histograms 
(7)嵌入向量Embeddings

1.2 Tensorboard的可视化过程

(1)首先肯定是先建立一个graph,你想从这个graph中获取某些数据的信息

(2)确定要在graph中的哪些节点放置summary operations以记录信息 
使用tf.summary.scalar记录标量 
使用tf.summary.histogram记录数据的直方图 
使用tf.summary.distribution记录数据的分布图 
使用tf.summary.image记录图像数据 
….

(3)operations并不会去真的执行计算,除非你告诉他们需要去run,或者它被其他的需要run的operation所依赖。而我们上一步创建的这些summary operations其实并不被其他节点依赖,因此,我们需要特地去运行所有的summary节点。但是呢,一份程序下来可能有超多这样的summary 节点,要手动一个一个去启动自然是及其繁琐的,因此我们可以使用tf.summary.merge_all去将所有summary节点合并成一个节点,只要运行这个节点,就能产生所有我们之前设置的summary data。

(4)使用tf.summary.FileWriter将运行后输出的数据都保存到本地磁盘中

(5)运行整个程序,并在命令行输入运行tensorboard的指令,之后打开web端可查看可视化的结果  


2.具体实例 (使用经典的Mnist数据集为例)

2.1 程序实现

mnist_ff.py 

import tensorflow as tf

input_node=784 #输入节点
layer1_node=500 #隐藏神经元的个数
output_node=10 #输出节点


def get_weight (shape,regularizer): #采用get_variable 可以在其他函数内直接获取变量值,不用再传参数
    '''获取weights函数,可以通过名字获取值 变量名称必填 '''
    weights=tf.get_variable("weights",shape,initializer=tf.truncated_normal_initializer(stddev=0.1))
    if (regularizer!= None):
        tf.add_to_collection("losses",regularizer(weights)) #采用正则化方法 放入损失函数中
    return weights

def ff(input_tensor,regularizer):
    #生成一个上下文管理器,并指明需求的变量在这个上下文管理器中,就可以直接通过tf.get_variable获取已经生成的变量。
    with tf.variable_scope('layer1',reuse =tf.AUTO_REUSE): #layer1 命名空间  reuse 重复使用
        #声明第一层神经网络
        weights=get_weight([input_node, layer1_node],regularizer)#共享变量 可以直接使用
        biases=tf.get_variable("biases1",[layer1_node],initializer=tf.constant_initializer(0.0))
        layer1=tf.nn.relu(tf.matmul(input_tensor,weights)+biases)
        
    with tf.variable_scope('layer2',reuse =tf.AUTO_REUSE): #layer2 命名空间
        #声明第一层神经网络
        weights=get_weight([layer1_node,output_node],regularizer)
        biases=tf.get_variable("biases2",[output_node],initializer=tf.constant_initializer(0.0))
        layer2=tf.matmul(layer1,weights)+biases
    return layer2


mnist_train.py

import tensorflow as tf
import mnist_ff
import time
import os  #用来保存训练的模型
from tensorflow.examples.tutorials.mnist import input_data

batch_size=100  #一次训练的个数
learning_rate_base=0.8   #学习率
learning_rate_decay=0.99#学习的衰减率
move_average_rate=0.99  #滑动平均律的衰减率
regularaztion=0.0001  #regularizer 所占的比重
steps=30000  #设置训练轮数

model_save_path="E:\TensorFlow\Project_TF\mnist_network\log"#设置保存模型的路径
model_name="model_minist.ckpt"#设置模型的的名称
event_path="E:\TensorFlow\Project_TF\mnist_network\event" #tensorboard日志保存的路径

def train(mnist):
    start = time.clock() 
    x=tf.placeholder(tf.float32,shape=(None,mnist_ff.input_node),name="x_input")#定义初始数据想x,在具体运行时再代入具体数据
    y_=tf.placeholder(tf.float32,shape=(None,mnist_ff.output_node),name="y_input")#定义标签值
    regularizer=tf.contrib.layers.l2_regularizer(regularaztion) #使用L2正则化方法
    y=mnist_ff.ff(x,regularizer)#前向传播过程
    
    '''采用滑动平均模型 调整learning_rate'''
    global_step=tf.Variable(0,trainable=False)#定义存储训练轮数的变量,定义为不可训练的参数
    variable_averages=tf.train.ExponentialMovingAverage(move_average_rate,global_step)#定义滑动的对象 
    variables_averages_op=variable_averages.apply(tf.trainable_variables()) #定义执行滑动平均的操作
      #设置可变的learning rate           
    learning_rate=tf.train.exponential_decay(learning_rate_base,global_step,mnist.train.num_examples/batch_size, learning_rate_decay)# 完整的使用一遍数据后,学习率*衰减率
    
    '''定义误差函数'''
    with tf.variable_scope('loss'):
        cross_entropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
        loss= cross_entropy+tf.add_n(tf.get_collection('losses'))
        tf.summary.scalar('loss', loss)
               
    '''准确率'''
    validation_feed={x: mnist.validation.images,y_: mnist.validation.labels}
    y2=mnist_ff.ff(x,None)  #测试时不关注正则化损失的值 
    with tf.name_scope('accuracy'):
        correct_prediction = tf.equal(tf.argmax(y2, 1), tf.argmax(y_, 1)) 
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) #一组数据上的正确率
        tf.summary.scalar('accuracy', accuracy)
    
    
    '''既要bp更新,又要更新每个参数的滑动平均值'''
    train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)
    with tf.control_dependencies([train_step, variables_averages_op]):
        train_op=tf.no_op(name='train') #什么也不做
        
    #初始化 TensorFow持久化类
    saver=tf.train.Saver()
    with tf.Session() as sess:
        tf.initialize_all_variables().run() #启动所有的变量
        
        '''使用tensorboard可视化工具'''  
        summary_op = tf.summary.merge_all() #将所有的summary同时运行
        summary_writer = tf.summary.FileWriter(event_path, graph=sess.graph)
        
        #在训练过程中不在使用验证集
        for i in  range(steps):#开始训练
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)  #一次取batch_size个数据进行训练
            _,loss_value,step=sess.run([train_op,loss,global_step],feed_dict={x:batch_xs,y_:batch_ys})
            #每1000轮保存一次模型
            if (i%1000==0):
                print("After %d steps,the loss on model of mnist is %f"%(step,loss_value))
                saver.save(   
                         sess,os.path.join(model_save_path,model_name),
                           global_step=global_step)#放上global_step 可以将模型保存为第多少次的模型
                
            elif (i % 100 == 0):
                '''运行的时候要将placeholder的数据放进去'''
                summary_str = sess.run(summary_op,feed_dict= validation_feed) 
                summary_writer.add_summary(summary_str, i)  #横坐标为模型训练的次数,纵坐标为相应的summary
                
    end = time.clock() #计算程序结束时间
    print("running time is %g s" % (end-start))
                
def main (argv=None):#定义主函数 将数据加载进来
    mnist=input_data.read_data_sets("E:\TensorFlow\Project_TF\mnist_network\data",one_hot=True)
    train(mnist)

if (__name__=="__main__"): # 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。
    tf.app.run()
    

2.2  Tensorboard 实现下(这里以win系统为例)

打开win下的命令行

在程序所在的磁盘下,输入以下命令:

tensorboard --logdir=E:\TensorFlow\Project_TF\mnist_network\event(换成你的路径命)



2.3 Tensorboard结果




猜你喜欢

转载自blog.csdn.net/qq_24193303/article/details/80098061