TensorFlow——視覺化工具TensorBoard的使用

TensorFlow——視覺化工具TensorBoard的使用
1、TensorBoard簡介
Tensorboard是Tensorflow官方推出了視覺化工具,它可以通過TensorFlow程式執行過程中輸出的日誌檔案視覺化TensorFlow程式的執行狀態。
TensorBoard 和 TensorFLow 程式跑在不同的程序中,TensorBoard 會自動讀取最新的TensorFlow日誌檔案,並呈現當前 TensorFLow 程式執行的最新狀態。
TensorBoard視覺化神經網路模型訓練過程中各種指標的變化趨勢,直觀的瞭解神經網路的訓練情況。
TensorBoard的使用對於程式的理解、分析和優化都很有幫助。
2、TensorBoard資料形式
Tensorboard可以記錄與展示以下資料形式: 
(1)標量Scalars 
(2)圖片Images 
(3)音訊Audio 
(4)計算圖Graph 
(5)資料分佈Distribution 
(6)直方圖Histograms 
(7)嵌入向量Embeddings
3、TensorBoard啟動(Windows下cmd啟動)並展示日誌圖表
確保計算圖寫入日誌 writer=tf.summary.FileWriter(‘logs/’,sess.graph)

(1)執行程式,在指定目錄下(logs)生成 event 檔案

(2)在 logs 所在目錄,按住 shift 鍵,點選右鍵選擇在此處開啟 cmd
(3)在 cmd 中,輸入以下命令啟動 tensorboard –logdir=logs(注意:logs的目錄並不需要加引號, logs 中有多個event 時,會生成scalar 的對比圖,但 graph 只會展示最新的結果)

(4)把生成的網址複製到Google瀏覽器或火狐瀏覽器中開啟即可 

4、使用名稱空間整理計算圖
  • 使用名稱空間使視覺化效果圖更有層次性,使得神經網路的整體結構不會被過多的細節所淹沒
  • 同一個名稱空間下的所有節點會被縮略成一個節點,只有頂層名稱空間中的節點才會被顯示在 TensorBoard 視覺化效果圖上
  • 可通過tf.name_scope()或者tf.variable_scope()來實現,具體見最後的程式
with tf.name_scope(‘input’)
5、TensorBoard使用流程
(1)新增記錄節點:tf.summary.scalar/image/histogram()等。
使用tf.summary.scalar記錄標量 
使用tf.summary.histogram記錄資料的直方圖 
使用tf.summary.distribution記錄資料的分佈圖 
使用tf.summary.image記錄影象資料 
(2)彙總記錄節點:merged = tf.summary.merge_all()
(3)執行彙總節點:summary = sess.run(merged),得到彙總結果
(4)日誌書寫器例項化:summary_writer = tf.summary.FileWriter(logdir, graph=sess.graph),例項化的同時傳入 graph 將當前計算圖寫入日誌
(5)呼叫日誌書寫器例項物件summary_writer的add_summary(summary, global_step=i)方法將所有彙總日誌寫入檔案
(6)呼叫日誌書寫器例項物件summary_writer的close()方法寫入記憶體,否則它每隔120s寫入一次
6、TensorFlow視覺化分類

(1)計算圖的視覺化
# Create a summary writer, add the ‘graph’ to the event file.writer = tf.summary.FileWriter(logdir, sess.graph)writer.close() # 關閉寫入記憶體,否則它每隔120s寫入一次
(2)監控指標的視覺化
I、SCALAR
tf.summary.scalar(name, tensor, collections=None, family=None)
視覺化訓練過程中隨著迭代次數準確率(val acc)、損失值(train/test loss)、學習率(learning rate)、每一層的權重和偏置的統計量(mean、std、max/min)等的變化曲線。
  • 輸入引數:
name:此操作節點的名字,TensorBoard 中繪製的圖形的縱軸也將使用此名字
tensor: 需要監控的變數.
II、IMAGE
tf.summary.image(name, tensor, max_outputs=3, collections=None, family=None)
視覺化當前使用的訓練/測試圖片
III、HISTOGRAM
tf.summary.histogram(name, values, collections=None, family=None)
視覺化張量的取值分佈
IV、MERGE_ALL
tf.summary.merge_all(key=tf.GraphKeys.SUMMARIES)
  • Merges all summaries collected in the default graph
  • 因為程式中定義的寫日誌操作比較多,一一呼叫非常麻煩,所以TensoorFlow 提供了此函式來整理所有的日誌生成操作:merged = tf.summary.merge_all ()
  • 此操作不會立即執行,所以,需要明確的執行這個操作(summary = sess.run(merged))來得到彙總結果
  • 最後呼叫日誌書寫器例項物件的add_summary(summary, global_step=i)方法將所有彙總日誌寫入檔案
7、TensorFlow實現MNIST手寫數字識別,並視覺化
模型:構建一個只有輸入層輸出層的簡單神經網路模型,使用交叉熵梯度下降演算法進行優化,並用TensorBoard視覺化
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# 載入資料集
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
# 每個批次的大小
batch_size=100
#計算一共有多少個批次
n_batch=mnist.train.num_examples//batch_size
#引數概要(新增記錄節點函式)
def variable_summaries(var):
with tf.name_scope('summaries'): #定義summary類的名稱空間
mean=tf.reduce_mean(var) #計算引數的平均值
tf.summary.scalar('mean',mean)  #記錄資料的平均值
with tf.name_scope('stddev'): #定義名稱空間
stddev=tf.sqrt(tf.reduce_mean(tf.square(var-mean))) #計算引數的標準差
tf.summary.scalar('stddev',stddev)  #記錄引數的標準差
tf.summary.scalar('max',tf.reduce_max(var)) #記錄引數的最大值
tf.summary.scalar('min',tf.reduce_min(var)) #記錄引數的最小值
tf.summary.histogram('histogram',var) #用直方圖記錄引數的分佈
#定義名稱空間
with tf.name_scope('input'):
# 定義兩個placeholder(這裡的None表示第一個維度可以是任意的長度)
x = tf.placeholder(tf.float32, [None, 784],name='x-input')
y = tf.placeholder(tf.float32, [None, 10],name='y-input')
#儲存影象資訊
with tf.name_scope('input_reshape'):
image_shaped_input=tf.reshape(x,[-1,28,28,1])
tf.summary.image('input',image_shaped_input,10)#記錄10張圖片資料
#定義名稱空間(名稱空間中仍可定義名稱空間)
with tf.name_scope('layer'):
# 建立一個簡單的神經網路(只有輸入層和輸出層)
with tf.name_scope('weights'):
Weights = tf.Variable(tf.zeros([784, 10]))
variable_summaries(Weights)  #呼叫引數資訊記錄權重的資訊
with tf.name_scope('biases'):
biases = tf.Variable(tf.zeros([10]))
variable_summaries(biases)   #呼叫引數資訊記錄偏置的資訊
with tf.name_scope('wx_plus_b'):
wx_plus_b = tf.matmul(x, Weights)   biases  #執行wx b的線性計算
with tf.name_scope('softmax'):
prediction = tf.nn.softmax(wx_plus_b)
with tf.name_scope('loss'):
# 交叉熵
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
tf.summary.scalar('loss',loss)  #新增記錄損失函式的標量
with tf.name_scope('train_step'):
# 使用梯度下降演算法
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
with tf.name_scope('accuracy'):
with tf.name_scope('correct_prediction'):
# 結果存放在一個布林型列表中(argmax函式返回一維張量中最大的值所在的位置)
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1))
with tf.name_scope('accuracy'):
# 求準確率(tf.cast將布林值轉換為float型)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
tf.summary.scalar('accuracy',accuracy) #新增記錄準確率的標量
#合併所有的summary(彙總記錄節點)
merged=tf.summary.merge_all()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) #初始化變數
# 負責將事件日誌(graph、scalar/image/histogram、event)寫入到指定的磁碟檔案中
writer=tf.summary.FileWriter('logs/',sess.graph)
for i in range(51):
for batch in range(n_batch):
batch_xs,batch_ys=mnist.train.next_batch(batch_size)
summary,_=sess.run([merged,train_step],feed_dict={x:batch_xs,y:batch_ys})
#將所有彙總日誌寫入檔案
writer.add_summary(summary,i)
acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels})
print("Iter"   str(i)   ",Testing Accuracy"   str(acc))

(1)SCALARS
展示的是標量的資訊,我程式中用tf.summary.scalars()定義的資訊都會在這個視窗

(2)IMAGES
展示的是圖片的資訊,我程式中用tf.summary.image()定義的資訊都會在這個視窗

(3)GRAPHS 
展示的是整個訓練過程的計算圖graph,從中我們可以清晰地看到整個程式的邏輯與過程。

(4)DISTRIBUTIONS 
展示的是整個訓練過程中權重和偏置的分佈

(5)HISTOGRAMS 
展示的是整個訓練過程中權重和偏置的直方圖

其它參看部落格:https://blog.csdn.net/sinat_33761963/article/details/62433234