【Tensorflow_DL_Note17】TensorFlow視覺化學習4_tf.summary模組的詳解

馬衛飛發表於2018-05-13

一 tf.summary模組的簡介

      在TensorFlow中,最常用的視覺化方法有三種途徑,分別為TensorFlow與OpenCv的混合程式設計、利用Matpltlib進行視覺化、利用TensorFlow自帶的視覺化工具TensorBoard進行視覺化。這三種方法,在前面部落格中都有過比較詳細的介紹。但是,TensorFlow中最重要的視覺化方法是通過tensorBoard、tf.summary和tf.summary.FileWriter這三個模組相互合作來完成的。

       tf.summary模組的定義位於summary.py檔案中,該檔案中主要定義了在進行視覺化將要用到的各種函式,tf.summary包含的主要函式如下所示:

from __future__ import                            absolute_import
from __future__ import                            division
from __future__ import                            print_function
from google.protobuf import json_format as         _json_format
from tensorflow.core.framework.summary_pb2 import Summary
from tensorflow.core.framework.summary_pb2 import SummaryDescription
from tensorflow.core.util.event_pb2 import        Event
from tensorflow.core.util.event_pb2 import        SessionLog
from tensorflow.core.util.event_pb2 import        TaggedRunMetadata

from tensorflow.python.eager import context as    _context
from tensorflow.python.framework import dtypes as _dtypes
from tensorflow.python.framework import ops as    _ops
from tensorflow.python.ops import gen_logging_ops as _gen_logging_ops
from tensorflow.python.ops import summary_op_util as _summary_op_util
from tensorflow.python.ops.summary_ops import        tensor_summary
from tensorflow.python.summary.text_summary import   text_summary as text
from tensorflow.python.summary.writer.writer import       FileWriter
from tensorflow.python.summary.writer.writer_cache import FileWriterCache
from tensorflow.python.util import compat as              _compat
from tensorflow.python.util.all_util import               remove_undocumented
from tensorflow.python.util.tf_export import              tf_export
#========================================================================================================
#模組說明:
#       tf.summary中包含的主要函式
#========================================================================================================
def scalar(name, tensor, collections=None, family=None)                     
def image(name, tensor, max_outputs=3, collections=None, family=None)
def histogram(name, values, collections=None, family=None)
def audio(name, tensor, sample_rate, max_outputs=3, collections=None,family=None)
def merge(inputs, collections=None, name=None)
def merge_all(key=_ops.GraphKeys.SUMMARIES, scope=None)
def get_summary_description(node_def)

二 tf.summary模組中常用函式的說明:

1 tf.summary.scalar函式的說明

#========================================================================================================
#函式原型:
#       def scalar(name, tensor, collections=None, family=None)
#函式說明:
#       [1]輸出一個含有標量值的Summary protocol buffer,這是一種能夠被tensorboard模組解析的【結構化資料格式】
#       [2]用來顯示標量資訊
#       [3]用來視覺化標量資訊
#       [4]其實,tensorflow中的所有summmary操作都是對計算圖中的某個tensor產生的單個summary protocol buffer,而
#          summary protocol buffer又是一種能夠被tensorboard解析並進行視覺化的結構化資料格式
#       雖然,上面的四種解釋可能比較正規,但是我感覺理解起來不太好,所以,我將tf.summary.scalar()函式的功能理解為:
#       [1]將【計算圖】中的【標量資料】寫入TensorFlow中的【日誌檔案】,以便為將來tensorboard的視覺化做準備
#引數說明:
#       [1]name  :一個節點的名字,如下圖紅色矩形框所示
#       [2]tensor:要視覺化的資料、張量
#主要用途:
#       一般在畫loss曲線和accuary曲線時會用到這個函式。
#=======================================================================================================

        具體的使用方法如下所示:

#=======================================================================================================================
#函式說明:
#       生成【變數】的監控資訊,並將生成的監控資訊寫入【日誌檔案】
#引數說明:
#       [1]var :需要【監控】和【記錄】執行狀態的【張量】
#       [2]name:給出了視覺化結果中顯示的圖表名稱
#=======================================================================================================================
def variable_summaries(var,name):
    with tf.name_scope('summaries'):
        #【1】通過tf.summary.histogram()
        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)

2 tf.summary.image函式的說明


#========================================================================================================
#函式原型:
#       def image(name, tensor, max_outputs=3, collections=None, family=None)
#函式說明:
#       [1]輸出一個包含影象的summary,這個影象是通過一個4維張量構建的,這個張量的四個維度如下所示:
#              [batch_size,height, width, channels]
#       [2]其中引數channels有三種取值:
#              [1]1: `tensor` is interpreted as Grayscale,如果為1,那麼這個張量被解釋為灰度影象
#              [2]3: `tensor` is interpreted as RGB,如果為3,那麼這個張量被解釋為RGB彩色影象
#              [3]4: `tensor` is interpreted as Grayscale,如果為4,那麼這個張量被解釋為RGBA四通道影象
#       [3]輸入給這個函式的所有影象必須規格一致(長,寬,通道,資料型別),並且資料型別必須為uint8,即所有的畫素值在
#              [0,255]這個範圍
#       雖然,上面的三種解釋可能比較正規,但是我感覺理解起來不太好,所以,我將tf.summary.image()函式的功能理解為:
#       [1]將【計算圖】中的【影象資料】寫入TensorFlow中的【日誌檔案】,以便為將來tensorboard的視覺化做準備
#
#引數說明:
#       [1]name  :一個節點的名字,如下圖紅色矩形框所示
#       [2]tensor:要視覺化的影象資料,一個四維的張量,元素型別為uint8或者float32,維度為[batch_size, height,
#                 width, channels]
#       [3]max_outputs:輸出的通道數量,可以結合下面的示例程式碼進行理解
#主要用途:
#       一般用在神經網路中影象的視覺化
#========================================================================================================

       示例程式碼如下所示:

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 tf.summary.histogram函式的說明

#========================================================================================================
#函式原型:
#       def histogram(name, values, collections=None, family=None)
#函式說明:
#       [1]用來顯示直方圖資訊
#       [2]新增一個直方圖的summary,它可以用於視覺化您的資料的分佈情況,關於TensorBoard中直方圖更加具體的資訊可以在
#          下面的連結https://www.tensorflow.org/programmers_guide/tensorboard_histograms中獲取
#
#       雖然,上面的兩種解釋可能比較正規,但是我感覺理解起來不太好,所以,我將tf.summary.histogram()函式的功能理解為:  
#       [1]將【計算圖】中的【資料的分佈/資料直方圖】寫入TensorFlow中的【日誌檔案】,以便為將來tensorboard的視覺化做準備
#引數說明:
#       [1]name  :一個節點的名字,如下圖紅色矩形框所示
#       [2]values:要視覺化的資料,可以是任意形狀和大小的資料  
#主要用途:
#       一般用來顯示訓練過程中變數的分佈情況
#========================================================================================================
         示例程式碼如下所示:
#=======================================================================================================================
#函式說明:
#       生成一層全連線層神經網路
#=======================================================================================================================
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

4 tf.summary.函式的說明

#========================================================================================================
#函式原型:
#       def merge_all(key=_ops.GraphKeys.SUMMARIES, scope=None)
#函式說明:
#       [1]將之前定義的所有summary整合在一起
#       [2]和TensorFlow中的其他操作類似,tf.summary.scalar、tf.summary.histogram、tf.summary.image函式也是一個
#          op,它們在定義的時候,也不會立即執行,需要通過sess.run來明確呼叫這些函式。因為,在一個程式中定義的寫日誌操作
#          比較多,如果一一呼叫,將會十分麻煩,所以Tensorflow提供了tf.summary.merge_all()函式將所有的summary整理在一
#          起。在TensorFlow程式執行的時候,只需要執行這一個操作就可以將程式碼中定義的所有【寫日誌操作】執行一次,從而將
#          所有的日誌寫入【日誌檔案】。
#
#引數說明:
#       [1]key  : 用於收集summaries的GraphKey,預設的為GraphKeys.SUMMARIES
#       [2]scope:可選引數
#========================================================================================================

5 tf.summary.FileWriter類的說明

#========================================================================================================
#類定義原型:
#       class FileWriter(SummaryToEventTransformer)
#類說明:
#      [1]將Summary protocol buffers寫入磁碟檔案
#      [2]FileWriter類提供了一種用於在給定目錄下建立事件檔案的機制,並且將summary資料寫入硬碟
#建構函式:
#        def __init__(self,logdir,graph=None,max_queue=10,flush_secs=120,graph_def=None,filename_suffix=None):

#引數說明:
#       [1]self  : 類物件自身
#       [2]logdir:用於儲存【日誌檔案】的目錄
#       [3]graph : 將要儲存的計算圖
#應用示例:
#       summary_writer = tf.summary.FileWriter(SUMMARY_DIR,sess.graph):建立一個FileWrite的類物件,並將計算圖
#           寫入檔案
#========================================================================================================
           示例程式碼如下所示:
    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()

6 add_summary函式的說明

#========================================================================================================
#函式原型:
#        def add_summary(self, summary, global_step=None)
#函式說明:
#        [1]該函式是tf.summary.FileWriter父類中的成員函式
#        [2]將一個`Summary` protocol buffer新增到事件檔案,寫入事件檔案
#引數說明:
#       [1]self   : 類物件自身
#       [2]summary:將要寫入的summary
#       [3]graph  : global_step,當前迭代的輪數,需要注意的是,如果沒有這個引數,那麼scalar的summary將會成為一條直線
#應用示例:
#       summary_writer.add_summary(summary,i)
#========================================================================================================



相關文章