為了更方便 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