1. 程式人生 > >如何在Win下使用Tensorboard 視覺化工具

如何在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結果