TensorFlow框架(2)之TensorBoard詳解


   為了更方便 TensorFlow 程序的理解、調試與優化,TensorFlow發布了一套叫做 TensorBoard 的可視化工具。你可以用 TensorBoard 來展現你的 TensorFlow 圖像,繪制圖像生成的定量指標圖以及附加數據。

  TensorBoard工具通過讀取TensorFlow產生的事件(events)文件來進行圖像繪制,其中這個事件文件是在運行TensorFlow時產生的summary數據。簡單地說,可以將TensorBoard的使用分為兩步:數據序列化和啟動TensorBoard。

1. Quick Start

1.1 序列化

  數據序列化就是將summary節點保存為TensorFlow的事件文件,即保存TensorFlow中產生的summary數據。保存TensorFlow事件文件通過調用tf.summary.FileWriter函數來實現。如下所示是一個程序的簡單序列化。

from __future__ import print_function

import tensorflow as tf

 

session = tf.Session()

 

w = tf.Variable([.3], tf.float32,name="w")

b = tf.Variable([-.3], tf.float32,name="b")

x = tf.placeholder(tf.float32,name="x")

 

linear = w * x + b

 

train_writer = tf.summary.FileWriter('/tmp/mnist_logs', session.graph)

init = tf.global_variables_initializer()

session.run(init)

print(session.run(linear, {x: [1, 2, 3, 4]}))

當執行上述程序后,在'/tmp/mnist_logs'目錄下會生成一個文件。

PS:

    tf.summary.FileWriter函數必須在global_variables_initializer().run()函數之前調用,在重命名tensor對象之后調用。

1.2 啟動

  當對TensorFlow的計算圖進行序列化為文件后,即可啟動TensorBoard工具繪制圖像。啟動TensorBoard的方式也非常簡單,只需在控制終端上執行"TensorBoard"命令,同時傳遞序列化文件的路徑。如繪制上述程序的序列化文件,則可執行如下命令:

tensorboard --logdir=/tmp/mnist_logs

 

  啟動TensorBoard后,用戶在瀏覽器中輸入:http://localhost:6006/,即可查看已繪制的TensorFlow圖像,在"GRAPHS"標簽能夠查看TensorFlow計算流圖,如圖 11所示。

圖 11

2. Summary Data

2.1 Operation

  如上所述,TensorBoard工具通過讀取TensorFlow產生的事件(events)文件來進行圖像繪制,而事件文件是在運行TensorFlow時產生的summary數據。這里的summary數據是由TensorBoard提供的Summary Operation生成的。

  如表 11所示,能夠生成Summary Data的Operation有四個:

表 11 summary operation

Operation

語義

tf.summary.scalar

產生標量(scalars)類型的summary data

tf.summary.histogram

產生直方圖(histograms)類型的summary data

tf.summary.image

產生圖片(images)類型的summary data

tf.summary.audio

產生音頻(Audio)類型的summary data

PS:

    上述四個函數分別產生的summary data會在TensorBoard圖形中的相應標簽中,如圖 11所示的SCALARS、IMAGES、AUDIO和HISTOGRAMS,而GRAPHS是自動產生的。

2.2 Tensor

  其實表 11中Operation生成的Summary Data也是一種Tensor對象,所以若沒有使用Session的run方法執行它們,這些Tensor是不會產生任何Summary Data的。因此為了生成Summary Data,需要用戶手動一個個生成,然而這種方法太過麻煩。所以TensorFlow提供一個將所有Summary Operation生成的Tensor集成為一個Tensor對象,用戶只需通過Session.run函數執行這個Tensor對象,即可生成所有的Summary Data。該函數為:tf.summary.merge_all()。

  在執行這個集成Tensor對象后,會生成一個Summary protobuf對象,用戶需要將這個對象傳遞給tf.summary.filewriter對象,這樣所有Summary data就會序列化到事件文件中。

  如下示例是將tf.summary.scalar操作生成的Summary Data序列化為事件文件:

import numpy as np

import tensorflow as tf

#Model parameters

w = tf.Variable([.3], tf.float32)

b = tf.Variable([-.3], tf.float32)

#Model input and output

x = tf.placeholder(tf.float32)

linear_model = w * x + b

y = tf.placeholder(tf.float32)

 

#loss

squared_deltas = tf.square(linear_model - y)

loss = tf.reduce_sum(squared_deltas)

#optimizer

optimizer = tf.train.GradientDescentOptimizer(0.01)

train = optimizer.minimize(loss)

#1.保存需要序列化的常量

tf.summary.scalar('loss', loss)

with tf.name_scope('constant'):

c = tf.constant(4.3,tf.float32)

tf.summary.scalar('c', c)

 

#training loop

init = tf.global_variables_initializer()

session = tf.Session()

#2.集成所有Summary Operation

merged = tf.summary.merge_all()

 

train_writer = tf.summary.FileWriter('/tmp/mnist_logs', session.graph)

session.run(init)

for i in range(1000):

session.run(train, {x:[1,2,3,4], y:[0, -1, -2, -3]})

#3.執行集成的operation

summary = session.run(merged, {x:[1,2,3,4], y:[0, -1, -2, -3]})

#4.序列化到事件文件中

train_writer.add_summary(summary,i)

 

#evaluate training accuracy

curr_w, curr_b, curr_loss = session.run([w,b,loss], {x:[1, 2, 3, 4], y:[0, -1, -2, -3]})

print("w:%s b:%s loss:%s"%(curr_w,curr_b,curr_loss))

 

圖 12

3. 命名空間

  典型的 TensorFlow 可以有數以千計的節點,如此多而難以一下全部看到,甚至無法使用標准圖表工具來展示。為簡單起見,TensorFlow提供一個將多個變量名划定范圍的函數,並且可視化把該信息用於在圖表中的節點上定義一個層級。該函數為:with tf.name_scope。默認情況下,只有頂層節點會顯示。

  如下示例將x和w划定為hidden范圍的命名空間內:

import tensorflow as tf

 

session = tf.Session()

 

b = tf.Variable([-.3], tf.float32,name="b")

with tf.name_scope('hidden'):

x = tf.placeholder(tf.float32,name="x")

w = tf.Variable([.3], tf.float32,name="w")

 

linear = w * x + b

 

train_writer = tf.summary.FileWriter('/tmp/mnist_logs', session.graph)

init = tf.global_variables_initializer()

session.run(init)

print(session.run(linear, {x: [1, 2, 3, 4]}))

 

圖 21

4. 參考文獻


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM