在TensorFlow中,最經常使用的可視化方法有三種途徑,分別爲TensorFlow與OpenCv的混合編程、利用Matpltlib進行可視化、利用TensorFlow自帶的可視化工具TensorBoard進行可視化。這三種方法,在前面博客中都有過比較詳細的介紹。可是,TensorFlow中最重要的可視化方法是經過tensorBoard、tf.summary和tf.summary.FileWriter這三個模塊相互合做來完成的。node
tf.summary模塊的定義位於summary.py文件中,該文件中主要定義了在進行可視化將要用到的各類函數,tf.summary包含的主要函數以下所示:python
from __future__ import absolute_import
from __future__ import pision
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)
複製代碼
#========================================================================================================
#函數原型:
# 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曲線時會用到這個函數。
#=======================================================================================================
複製代碼
總結: 通常在畫loss曲線和accuary曲線時會用到這個函數
使用react
#=======================================================================================================================
#函數說明:
# 生成【變量】的監控信息,並將生成的監控信息寫入【日誌文件】
#參數說明:
# [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)
複製代碼
#========================================================================================================
#函數原型:
# 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)
複製代碼
#========================================================================================================
#函數原型:
# 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:要可視化的數據,能夠是任意形狀和大小的數據
#主要用途:
# 通常用來顯示訓練過程當中變量的分佈狀況
#========================================================================================================
複製代碼
總結:通常用來顯示訓練過程當中變量的分佈狀況 示例代碼以下所示:json
#函數說明:
# 生成一層全鏈接層神經網絡
#=======================================================================================================================
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
複製代碼
#========================================================================================================
#函數原型:
# 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:可選參數
複製代碼
#========================================================================================================
#類定義原型:
# 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的類對象,並將計算圖
# 寫入文件
複製代碼
總結:將summary數據寫入硬盤
示例代碼以下所示:bash
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()
複製代碼
#========================================================================================================
#函數原型:
# 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)
複製代碼