TensorFlow 計算圖功能十分強大,但也非常復雜。圖的直觀展示可幫助您理解圖并對圖進行調試。以下示例顯示了實際的可視化效果。
要查看您自己的圖,請運行 TensorBoard 并將其指向作業的日志目錄,點擊頂部窗格中的 “圖” 標簽,然后使用左上角的菜單選擇適當的運行條目。要深入了解如何運行 TensorBoard 并確保記錄所有必要信息,請參閱TensorBoard:直觀展示學習。
名稱范圍和節點
典型的 TensorFlow 圖可能具有數千個節點 — 數量過多,難以一次性查看,甚至難以使用標準圖工具來進行布置。為了進行簡化,可以對變量名稱設定范圍,然后,直觀展示工具可以使用此信息來為圖中的節點定義層次結構。默認情況下僅顯示該層次結構的頂層。以下示例使用tf.name_scope在hidden名稱作用域下定義了三個操作:
import tensorflow as tfwith tf.name_scope('hidden') as scope: a = tf.constant(5, name='alpha') W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0), name='weights') b = tf.Variable(tf.zeros([1]), name='biases')
這導致出現以下三個 op 名稱:
hidden/alpha
hidden/weights
hidden/biases
默認情況下,直觀展示工具會將這三個名稱收起到一個標作hidden的節點中。其他詳細信息不會丟失。您可以雙擊節點或點擊右上角的橙色+符號以展開節點,然后您將看到alpha、weights和biases三個子節點。
以下真實示例展示了一個更加復雜的節點的初始狀態和展開狀態。
頂級名稱范圍pool_1的初始視圖。點擊右上角的橙色+按鈕或雙擊節點本身即可展開該節點
pool_1名稱范圍的展開視圖。點擊右上角的橙色-按鈕或雙擊節點本身即可收起該名稱范圍
要讓圖易于觀看,按名稱范圍對節點進行分組至關重要。如果您要構建模型,名稱范圍可幫助您控制生成的直觀展示。您的名稱范圍越好,直觀展示的效果也就越棒。
上圖顯示了直觀展示的另一方面。TensorFlow 圖具有兩種連接:數據依賴關系和控制依賴關系。數據依賴關系顯示兩個 op 之間的張量流動,該依賴關系顯示為實線箭頭,而控制依賴關系顯示為虛線。在展開視圖中(上圖右側),所有連接均為數據依賴關系,只有連接CheckNumerics和control_dependency的虛線除外。
還有一個技巧可以簡化布局。大多數 TensorFlow 圖都包含幾個連接至許多其他節點的節點。例如,許多節點可能對初始化步驟存在控制依賴關系。繪制init節點及其依賴項之間的所有邊緣時,會產生極為雜亂的視圖。
為了減輕雜亂,直觀展示工具會將所有高等級節點劃分到右側的輔助區域中,并且不繪制線來表示它們的邊緣。我們不使用線而使用節點圖標來表示連接。分出輔助節點時通常不會移除關鍵信息,因為這些節點通常與簿記函數相關。請參閱下方交互部分,了解如何在主圖和輔助區域之間移動節點。
節點conv_1連接到save。請注意它右側的save節點小圖標
save的級別較高,它將顯示為輔助節點。與conv_1的連接顯示為左側的節點圖標。為了進一步減輕雜亂,由于save有許多連接,我們僅顯示前 5 個連接,并將其余連接縮寫為... 12 more
最后一種結構簡化方法是序列收起。如下所示,序列模體 (motif)(即結構相同但名稱末尾的數字不同的節點)將收起到節點的單個層疊中。對于具有長序列的網絡,這極大地簡化了視圖。對于具有層次結構的節點,雙擊即可展開序列。請參閱下方交互部分,了解如何為一組特定的節點停用/啟用序列收起。
節點序列收起后的視圖
雙擊后顯示的展開視圖的一小部分內容
直觀展示工具為了改進易讀性而采取的最后一項輔助措施是:為常量和總結節點使用特殊圖標。下表對節點符號進行了總結:
交互
通過平移和縮放在圖中導航。點擊并拖動可進行平移,使用滾動手勢可進行縮放。雙擊節點或點擊它的+按鈕可展開代表一組指令的名稱范圍。為了在縮放和平移時輕松跟蹤當前視點,右下角提供了一個小地圖。
要關閉打開的節點,請再次雙擊節點或點擊它的 — 按鈕。您也可以點擊一次以選擇一個節點。該節點的顏色將加深,其相關詳細信息及與其連接的節點將顯示在直觀展示工具右上角的信息卡上。
顯示了conv2名稱范圍的相關詳情的信息卡。輸入和輸出是從名稱范圍內的指令節點的輸入和輸出合并而來。沒有顯示名稱范圍的屬性
顯示了DecodeRaw指令節點的詳細信息的信息卡。除了輸入和輸出以外,該卡還顯示與當前指令關聯的設備和和屬性
TensorBoard 提供了數種方法來改變圖的視覺布局。這不會改變圖的計算語義,但可讓網絡結構變得更加清晰。通過右鍵點擊節點或按下節點信息卡底部的按鈕,您可以對它的布局做出以下更改:
您可在主圖和輔助區域之間移動節點
您可以對一系列節點取消分組,使得序列中的節點不以分組的形式顯示。您同樣可以對取消分組的序列進行重新分組
選中節點也有助于您理解高級別節點。請選擇任意高級別節點,隨后該節點的其他連接所對應的節點圖標也將被選中。此操作可幫助您輕松了解正在保存哪些節點,以及沒有保存哪些節點。
點擊信息卡中的節點名稱即可選中該節點。如有必要,視點將自動平移以便使節點顯示出來。
最后,您可以使用圖例上方的顏色菜單為您的圖選擇兩種配色方案。默認的結構視圖顯示了結構:當兩個高級別節點具有相同的結構時,它們將顯示相同的彩虹色。具有獨特結構的節點顯示為灰色。第二個視圖顯示運行不同指令的設備。名稱范圍根據其內部指令的設備比例來按比例著色。
下圖顯示了一個真實圖的一部分的圖解。
結構視圖:灰色節點具有獨特的結構。橙色conv1和conv2節點具有相同的結構,其他顏色相同的節點同樣如此
設備視圖:名稱范圍根據其內部指令節點的設備比例來按比例著色。此處的紫色代表 GPU,綠色代表 CPU
張量形狀信息
當序列化GraphDef包含張量形狀時,圖可視化工具會使用張量維度來標記邊緣,而邊緣厚度反映總張量大小。要在GraphDef中包括張量形狀,請在對圖執行序列化時,將實際圖對象(如sess.graph中所示)傳遞到FileWriter。下圖顯示了包含張量形狀信息的 CIFAR-10 模型:
包含張量形狀信息的 CIFAR-10 模型
運行時統計信息
通常,收集運行的運行時元數據(例如節點的總內存使用量、總計算時間和張量形狀)很有用。以下代碼示例節選自修改版Estimator MNIST 教程的訓練和測試部分,在該代碼段中,我們記錄了匯總和運行時統計信息。請參閱匯總教程 以詳細了解如何記錄匯總。要查看完整的源代碼,請點擊此處(https://github.com/tensorflow/tensorflow/blob/r1.10/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py)。
# Train the model, and also write summaries. # Every 10th step, measure test-set accuracy, and write test summaries # All other steps, run train_step on training data, & add training summaries def feed_dict(train): """Make a TensorFlow feed_dict: maps data onto Tensor placeholders.""" if train or FLAGS.fake_data: xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data) k = FLAGS.dropout else: xs, ys = mnist.test.images, mnist.test.labels k = 1.0 return {x: xs, y_: ys, keep_prob: k} for i in range(FLAGS.max_steps): if i % 10 == 0: # Record summaries and test-set accuracy summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False)) test_writer.add_summary(summary, i) print('Accuracy at step %s: %s' % (i, acc)) else: # Record train set summaries, and train if i % 100 == 99: # Record execution stats run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) run_metadata = tf.RunMetadata() summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True), options=run_options, run_metadata=run_metadata) train_writer.add_run_metadata(run_metadata, 'step%d' % i) train_writer.add_summary(summary, i) print('Adding run metadata for', i) else: # Record a summary summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True)) train_writer.add_summary(summary, i)
此代碼將從第 99 步開始,每隔 100 步發出一次運行時統計。
當您啟動 TensorBoard 并轉至 “圖” (Graph) 標簽時,您現在將在 “會話運行” (Session runs)(與添加了運行元數據的步對應)下看到一些選項。選擇其中一個運行后,系統將為您顯示該步時的網絡快照,并將未使用的節點顯示為淡出。在左側的控件中,您將能夠按總內存或總計算時間為節點著色。此外,點擊節點可顯示確切的總內存量、計算時間和張量輸出大小。
-
可視化
+關注
關注
1文章
1200瀏覽量
21033 -
tensorflow
+關注
關注
13文章
329瀏覽量
60629
原文標題:TensorBoard:圖的直觀展示
文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論