【Tensorflow_DL_Note16】TensorFlow視覺化學習3_引數,準確率的視覺化

馬衛飛發表於2018-05-10

一 Tensorboard的簡介

      TensorBoard是Tensorflow的視覺化工具,它可以通過Tensorflow程式執行過程中輸出的【日誌檔案】視覺化Tensorflow程式的執行狀態。TensorBoard和Tensorflow程式跑在不同的程式中,TensorBoard會自動讀取最新的Tensorflow【日誌檔案】,並呈現當前Tensorflow程式執行的最新狀態。下面展示一個簡單的Tensorflow程式,在這個程式中,完成了Tensorflow的日誌輸出功能。

import tensorflow as tf

#1】定義一個簡單的計算圖,實現向量加法的操作
input1 = tf.constant([1.0,2.0,3.0],name='input1')
input2 = tf.Variable(tf.random_uniform([3]),name='input2')
output = tf.add_n([input1,input2],name='add')

#2】生成一個寫日誌的writer,並將當前的TensorFlow計算圖寫入日誌。Tensorflow提供了多種寫日誌檔案的API
writer = tf.summary.FileWriter('F:/cifar-10-batches-py',tf.get_default_graph())
writer.close()

        執行上面的程式碼,會輸出Tensorflow計算圖的資訊,具體輸出的資訊如下所示:


       然後,在PyCharm的Terminal視窗中輸入:tensorboard --logdir=F:/cifar-10-batches-py 命令,回車執行,會輸出下面的資訊,如下所示:


         將http://DESKTOP-DAQOBTJ:6006 輸入到瀏覽器中,便可以看見視覺化的結果,如下所示。


       執行上面的命令,會啟動一個服務,這個服務的埠預設為6006。最終,這個計算圖的視覺化,如上所示。

二 Tensorboard的資料形式和視覺化過程

2.1 TensorBoard的資料形式

       TensroBoard可以記錄與展示如下的資料形式,如上圖右邊的橙色下拉選單所示:

        [1]SCALARS:標量

        [2]IMAGES:圖片

        [3]AUDIO:音訊

        [4]DEBUGGER:偵錯程式

        [5]GRAPH:計算圖

        [6]DISTRIBUTION:資料分佈

        [7]HISTOGRAMS:直方圖

        [8]TEXT:文字等

2.2 TensorBoard的視覺化過程

        1 : 首先,建立一個計算圖tf.Graph

        2 :  確定要在計算圖Graph中的那些節點放置summary operations以記錄資訊


    使用tf.summary.scalar()記錄標量的執行狀態資訊;使用tf.summary.image()記錄圖片的執行狀態資訊;使用tf.summary.audio()記錄Tensorflow中的音訊資訊;使用tf.summary.graph()記錄計算圖資訊;使用tf.summary.distribution()記錄資料的分佈圖

       3 :  operations並不會真的去執行計算, 除非你已經建立了一個會話tf.Session(),然後,指定它們去run.而我們上一步建立的這些summary operations其實並不被其他節點依賴,因此,我們需要特地的去執行所有的summary節點。但是,如果逐個的指定並執行上面建立的這些summary的話, 一個程式下來太過於繁瑣,因此,我們使用tf.summary.merge_all去將上面建立的所有的summary節點合併成一個節點,最後,我們只需要對這個節點執行計算即可,sess.run()

      4 : 第四步使用tf.summary.FileWrite將執行後的資料儲存到磁碟中

      5 : 最後,執行整個程式,並在命令列輸入tensorboard --logdir=F:/cifar-10-batches-py 命令,就可以在web中檢視視覺化的結果

三 Tensorboard的案例分析

    此塊,我們使用最基礎的MNIST手寫體數字識別案例。

#=======================================================================================================================
#檔案說明:
#       Tensorflow中,監控指標的視覺化
# 開發環境:
#       Win10+Tensorflow+OpenCv3.3+Python3.5+PyCharm5.0.3
# 時間地點:
#       陝西師範大學 文津樓 2018.5.13
# 作者:
#       九月
#=======================================================================================================================
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

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

BATCH_SIZE    = 10
TRAIN_STEPS   = 5000
SUMMARY_DIR   = 'F:/MnistSet'
#=======================================================================================================================
#函式說明:
#       生成變數監控資訊,並定義生成監控資訊日誌檔案的操作
#引數說明:
#       [1]var :需要監控和記錄執行狀態的張量
#       [2]name:給出了視覺化結果中顯示的圖表名稱
#=======================================================================================================================
def variable_summaries(var,name):
    with tf.name_scope('summaries'):
        tf.summary.histogram(name,var)

        mean   = tf.reduce_mean(var)
        tf.summary.scalar('mean/'+name,mean)

        stddev = tf.sqrt(tf.reduce_mean(tf.square(var-mean)))
        tf.summary.scalar('stddev/'+name,stddev)

#=======================================================================================================================
#函式說明:
#       生成一層全連線層神經網路
#=======================================================================================================================
def nn_layer(input_tensor,input_dim,output_dim,layer_name,act=tf.nn.relu):
    with tf.name_scope(layer_name):
        with tf.name_scope('weights'):
            weights = tf.Variable(tf.truncated_normal([input_dim,output_dim],stddev=0.1))
            variable_summaries(weights,layer_name+'/weights')

        with tf.name_scope('biases'):
            biases = tf.Variable(tf.constant(0.0,shape=[output_dim]))
            variable_summaries(biases,layer_name+'/biases')

        with tf.name_scope('Wx_plus_b'):
            preactivate = tf.matmul(input_tensor,weights)+biases
            tf.summary.histogram(layer_name+'/pre_activvations',preactivate)

        activations = act(preactivate,name='activation')
        tf.summary.histogram(layer_name+'/activations',activations)
        return activations
#=======================================================================================================================
#函式說明:
#       Main函式
#=======================================================================================================================
def main(argv=None):
    #【1】從磁碟載入資料
    mnist = input_data.read_data_sets('F:/MnistSet/',one_hot=True)
    #【2】定義兩個【佔位符】,作為【訓練樣本圖片/此塊樣本作為特徵向量存在】和【類別標籤】的輸入變數,並將這些佔位符存在名稱空間input中
    with tf.name_scope('input'):
        x  = tf.placeholder('float', [None, 784],name='x-input')
        y_ = tf.placeholder('float', [None, 10], name='y-input')
    #【2】將【輸入的特徵向量】還原成【圖片的畫素矩陣】,並通過tf.summary.image函式定義將當前圖片資訊作為寫入日誌的操作
    with tf.name_scope('input_reshape'):
        image_shaped_input = tf.reshape(x,[-1,28,28,1])
        tf.summary.image('input',image_shaped_input,10)
    #【3】建立【神經網路的結構】
    hidden1 = nn_layer(x,784,500,'layer1')
    y       = nn_layer(hidden1,500,10,'layer2',act=tf.identity)
    #【4】定義【損失函式】,【交叉熵損失函式】,並生成【交叉熵損失】的【監控日誌】
    with tf.name_scope('cross_entropy'):
        cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
        tf.summary.scalar('corss_entropy',cross_entropy)
    #【5】定義【神經網路損失函式的優化方法】,即神經網路的優化方法
    with tf.name_scope('train'):
        train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
    #【6】計算【模型】早當前給定資料集上的正確率
    with tf.name_scope('accuracy'):
        with tf.name_scope('correct_prediction'):
            correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))

        with tf.name_scope('accuracy'):
            accuracy= tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
        tf.summary.scalar('accuracy',accuracy)
    #【7】整理Tensorflow中所有的日誌操作
    merged = tf.summary.merge_all()
    #【8】建立回話Session
    with tf.Session() as sess:
        #【9】例項化一個FileWriter的類物件,並將當前TensoirFlow的計算圖寫入【日誌檔案】
        summary_writer = tf.summary.FileWriter(SUMMARY_DIR,sess.graph)
        #【10】Tensorflow中建立的變數,在使用前必須進行初始化,下面這個為初始化函式
        tf.global_variables_initializer().run()
        #【11】開始訓練
        for i in range(TRAIN_STEPS):
            xs,ys     = mnist.train.next_batch(BATCH_SIZE)
            #【12】執行訓練步驟以及所有的【日誌檔案生成操作】,得到這次執行的【日誌檔案】。
            summary,_,acc = sess.run([merged,train_step,accuracy],feed_dict={x:xs,y_:ys})
            print('Accuracy at step %s: %s' % (i, acc))
            #【13】將所有的日誌寫入檔案,TensorFlow程式就可以那這次執行日誌檔案,進行各種資訊的視覺化
            summary_writer.add_summary(summary,i)

    summary_writer.close()
#========================================================================================================
#模組說明:
#       Tensorflow提供的一個主程式入口,tf.app.run函式將會呼叫上面的main函式
#========================================================================================================
if __name__ == '__main__':
    tf.app.run()

     然後,輸入指令tensorboard --logdir=F:/MnistSet,在web中看見視覺化的資訊,視覺化結果如下所示:









相關文章