TensorFlow計算圖功能強大但複雜。圖表可視化可以幫助您理解和調試它們。這是一個可視化工作的例子:
可視化TensorFlow圖形。
要查看您自己的圖形,請運行TensorBoard並將其指向作業的日誌目錄,單擊頂部窗格上的圖形選項卡,然後使用左上角的菜單選擇適當的運行。有關如何運行TensorBoard並確保記錄的深入信息,請參閱TensorBoard:可視化學習。
命名範圍和節點
典型的TensorFlow圖可以有成千上萬個節點 – 太多的節點很難一次看到,甚至無法使用標準的圖形工具進行布局。為簡化起見,變量名可以有作用域,可視化使用這些信息來定義圖中節點上的層次結構。默認情況下,隻顯示該層次結構的頂部。下麵是一個定義三個操作的例子:
import tensorflow as tf
with 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
。額外的細節不會丟失。你可以double-click,或點擊右上角的橙色+
展開節點,然後您會看到三個子節點alpha
,weights
和biases
。
這是一個在初始和擴展狀態下更複雜節點的例子。
top-level名稱範圍的初始視圖pool_1 。點擊右上角的橙色+ 按鈕或者節點本身的double-clicking會將其展開。 |
展開的視圖pool_1 名稱範圍。點擊右上角的橙色- 按鈕或節點上的double-clicking本身將折疊名稱範圍。 |
按名稱範圍對節點進行分組對於製作清晰的圖形至關重要。如果您正在構建模型,則名稱範圍可以控製生成的可視化。你的名字範圍越好,你的可視化就越好。
TensorFlow圖有兩種連接:數據依賴和控製依賴。數據依賴顯示兩個操作符之間的張量流,並顯示為實線箭頭,而控製依賴使用虛線。在展開的視圖(上圖右側)中,除CheckNumerics
和control_dependency
是虛線連接外,所有連接均為數據依賴。
還有一個簡化布局的技巧。大多數TensorFlow圖有幾個與其他節點連接的節點。例如,許多節點可能對初始化步驟具有控製依賴性。繪製init
節點及其依賴關係之間的所有邊會造成非常混亂的視圖。
為了減少混亂,可視化將所有high-degree節點分隔出來放到右側的輔助區域,並不畫線來表示它們的邊,而是畫小節點圖標表示連接。分離出輔助節點通常不會去除關鍵信息,因為這些節點通常與記錄函數相關。見交互:如何在主圖和輔助區之間移動節點。
節點conv_1 連接到save 。注意在其右側的save 節點圖標。 |
save 具有很高的度,會作為輔助節點。跟conv_1 的連接在其左側顯示為一個節點圖標。為了進一步減少混亂,因為save 有很多的連接,我們展示前5個,並縮寫為其他... 12 more 。 |
最後一個結構簡化是序列折疊。對於連續的圖案 – 也就是說,名稱在數量上有所不同,並且具有同構結構的節點 – 被折疊成一個堆節點,如下所示。對於長序列的網絡,這大大簡化了視圖。與分層節點一樣,double-clicking展開係列。見交互了解如何為特定的一組節點禁用/啟用序列折疊。
節點序列的折疊視圖。 | double-click之後的一小段擴展視圖。 |
最後,作為易讀性的最後一個幫助,可視化對常量和匯總節點使用特殊的圖標。總結一下,下麵是一個節點符號表:
符號 | 含義 |
---|---|
High-level代表名稱範圍的節點。 Double-click展開這個high-level節點。 | |
沒有相互連接編號節點序列。 | |
有相互連接的編號節點序列。 | |
一個單獨的操作節點。 | |
一個常數。 | |
摘要節點。 | |
邊,表示操作之間的數據流。 | |
邊,表示操作之間的控製依賴關係。 | |
引用邊,表示傳出操作節點可以改變傳入張量。 |
交互
通過平移和縮放導航圖形。點擊拖動可以平移,使用滾動手勢可以進行縮放。 Double-click一個節點,或者點擊它的+
按鈕,展開代表一組操作的名稱範圍。為了在放大和平移時輕鬆跟蹤當前視點,右下角會有一個小Map。
要關閉一個打開的節點,double-click或再次點擊它-
按鈕。您也可以單擊一次以選擇一個節點。它會變成一個較深的顏色,關於它的詳細信息以及它所連接的節點將出現在可視化對象右上角的信息卡中。
顯示詳細信息的信息卡conv2 名稱範圍。輸入和輸出由名稱範圍內的操作節點的輸入和輸出組合而成。對於名稱範圍,不顯示任何屬性。 |
顯示詳細信息的信息卡DecodeRaw 操作節點。除輸入和輸出外,卡片還顯示設備和與當前操作相關的屬性。 |
TensorBoard提供了幾種方法來改變圖形的視覺布局。這並不會改變圖的計算語義,但它可以讓網絡的結構更清晰。通過右鍵單擊某個節點或按該節點信息卡底部的按鈕,可以對其布局進行以下更改:
- 節點可以在主圖表和輔助區域之間移動。
- 可以將一係列節點取消分組,使得該係列中的節點不會出現在一起。未分組的係列也可以重新組合。
選擇對於理解high-degree節點也是有幫助的。選擇任何high-degree節點,其他連接的相應節點圖標也將被選中。例如,這可以很容易地看到哪些節點正在保存,哪些不是。
點擊信息卡中的節點名稱將選擇它。如有必要,視點將自動平移,以便節點可見。
最後,您可以使用圖例上方的顏色菜單為圖形選擇兩種配色方案。默認結構視圖顯示結構:當兩個high-level節點具有相同的結構時,它們顯示為與彩虹相同的顏色。結構獨特的節點是灰色的。還有第二個視圖,它顯示了不同操作運行的設備。名稱範的圍著色比例與其內部操作的設備一致。
下麵的圖片給出了一張real-life圖的圖示。
結構視圖:灰色節點具有獨特的結構。橙色conv1 和conv2 節點具有相同的結構,類似於其他顏色的節點。 |
設備視圖:名稱範圍與其內部操作節點的設備比例成比例。在這裏,紫色是指GPU,綠色是CPU。 |
張量形狀信息
當序列化的GraphDef
包括張量形狀,那麽圖形可視化器使用張量維度來標記邊,邊寬度反映總張量大小。下麵的圖片顯示了具有張量形狀信息的CIFAR-10模型:
張量形狀信息的CIFAR-10模型。 |
運行時統計
收集運行時元數據通常是非常有用的,例如內存使用總量,總計算時間和節點的張量形狀。下麵的代碼示例是一個修改簡單的MNIST教程代碼片段,其中我們記錄了摘要和運行時統計。見摘要教程有關如何記錄摘要的詳細信息。完整的來源是這裏。
# 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”下的選項,這些選項對應於添加運行元數據的步驟。選擇其中一個運行將顯示在該步驟的網絡快照,淡出未使用的節點。在左側的控件中,您可以通過總內存或總計算時間對節點著色。此外,單擊節點將顯示確切的總內存、計算時間和張量輸出大小。