TensorBoard計算圖視覺化
TensorFlow計算圖功能強大但複雜。 圖表視覺化可以幫助您理解和除錯它們。 這是一個視覺化工作的例子。
名稱空間和節點
典型的TensorFlow圖可能有成千上萬個節點 - 太多的節點很難一次看到,甚至無法使用標準的圖形工具進行佈局。 為簡化起見,變數名宣告在作用域內,視覺化使用這些資訊來定義圖中節點上的層次結構。 預設情況下,只顯示該層次結構的頂部。 下面是一個使用tf.name_scope
在hidden
名稱範圍下定義三個操作的示例:
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')
這產生了以下三個操作名稱:
hidden/alpha
hidden/weights
hidden/biases
預設情況下,視覺化檔案將全部摺疊為標記為隱藏的節點。 額外的細節不會丟失。 你可以雙擊,或者點選右上角的橙色+
符號來展開節點,然後你會看到三個子節點,分別是alpha
,weight
和bias
。
這是一個複雜節點在其初始狀態和擴充套件狀態的例子。
按名稱空間對節點進行分組對於製作清晰的圖形至關重要。如果您正在構建模型,則名稱空間可以控制生成的視覺化影象。你的名稱空間越好,你的視覺化就越好。
上圖說明了視覺化的第二個方面。 TensorFlow圖有兩種連線:資料相關性和控制相關性。資料相關性顯示兩個操作符之間的張量流,並用實線箭頭顯示,而控制相關性使用虛線。在擴充套件檢視(上圖右側)中,除了連線CheckNumerics
和control_dependency
的虛線外,所有連線都是資料依賴關係。
還有一個簡化佈局的技巧。大多數TensorFlow圖有幾個與其他節點連線的節點。例如,許多節點可能對初始化步驟具有控制依賴性。繪製init
為了減少混亂,視覺化將所有高度節點分隔到右側的輔助區域,並不畫線來表示其邊緣。我們繪製小節點圖示來代替連線。分離出的輔助節點通常不會去除關鍵資訊,因為這些節點通常與簿記功能相關。有關如何在主圖形和輔助區域之間移動節點的資訊,請參閱互動。
最後一個結構簡化是series collapsing連續圖案 - 也就是說,名稱相差最後一個數字並具有同構結構的節點 - 會摺疊成一堆節點,如下所示。 對於長序列的網路,這大大簡化了檢視。 與分層節點一樣,雙擊將擴充套件該系列。 請參閱互動以瞭解如何為特定節點集禁用/啟用系列摺疊。
最後,作為易讀性的最後一個幫助,視覺化對常量和彙總節點使用特殊的圖示。 總結為下面的節點符號表:
互動
通過平移和縮放導航圖形。 點選並拖動以平移,並使用滾動手勢進行縮放。 雙擊某個節點,或單擊其+
按鈕,展開一個代表一組操作的名稱空間。 為了在放大和平移時輕鬆跟蹤當前視點,右下角會有一個小地圖。
要關閉開啟的節點,請再次雙擊它或單擊其-
按鈕。 您也可以單擊一次以選擇一個節點, 它會變成一個較深的顏色,並且關於它的詳細資訊以及它所連線的節點將出現在右上角的視覺化物件資訊卡中。
TensorBoard提供了幾種方法來改變圖形的視覺佈局。這不會改變圖的計算語義,但是它可以使網路的結構變得清晰。通過右鍵單擊某個節點或按該節點資訊卡底部的按鈕,可以對其佈局進行以下更改:
- 節點可以在主圖表和輔助區域之間移動。
- 可以將一系列節點取消分組,使得該系列中的節點不會出現在一起。未分組的序列也可以重新組合。
Selection
也可以幫助理解高層次節點。選擇任何高層次節點,其他連線的相應節點圖示也將被選中。這可以很容易地看到哪些節點正在儲存 - 哪些不是。
點選資訊卡中的節點名稱將選擇它。如有必要,視點將自動平移,以便節點可見。
最後,您可以使用圖例上方的顏色選單為圖形選擇兩種配色方案。預設的顯示結構:當兩個高層節點具有相同的結構時,它們以相同顏色出現。結構獨特的節點是灰色的。第二個檢視,它顯示了不同操作執行的裝置。名稱範圍與其內部操作的裝置成比例。
下面的圖片給出了例子。
張量形狀資訊
當序列化的GraphDef
包含張量形狀時,圖形視覺化器將張量標註為邊緣,邊緣厚度反映總張量大小。 要在GraphDef
中包含張量形狀,在序列化圖形時將實際圖形物件(如sess.graph
)傳遞給FileWriter
。 下面的圖片顯示了具有張量形狀資訊的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並轉到圖表選項卡時,您將在“會話執行”下看到與新增執行元資料的步驟相對應的選項。 選擇其中一個執行將顯示在該步驟的網路快照,淡出未使用的節點。 在左側的控制元件中,您可以通過總記憶體或總計算時間對節點著色。 此外,單擊節點將顯示確切的總記憶體,計算時間和張量輸出大小。