TensorFlow 圖表計(jì)算強(qiáng)大而又復(fù)雜,圖表可視化在理解和調(diào)試時(shí)顯得非常有幫助。 下面是一個(gè)運(yùn)作時(shí)的可式化例子。
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/graph_vis_animation.gif" alt="一個(gè)TensorFlow圖表的可視化" /> "一個(gè)TensorFlow圖表的可視化") 一個(gè)TensorFlow圖表的可視化。
為了顯示自己的圖表,需將 TensorBoard 指向此工作的日志目錄并運(yùn)行,點(diǎn)擊圖表頂部窗格的標(biāo)簽頁(yè),然后在左上角的菜單中選擇合適的運(yùn)行。想要深入學(xué)習(xí)關(guān)于如何運(yùn)行 TensorBoard 以及如何保證所有必要信息被記錄下來(lái),請(qǐng)查看 Summaries 和 TensorBoard.
典型的 TensorFlow 可以有數(shù)以千計(jì)的節(jié)點(diǎn),如此多而難以一下全部看到,甚至無(wú)法使用標(biāo)準(zhǔn)圖表工具來(lái)展示。為簡(jiǎn)單起見(jiàn),我們?yōu)樽兞棵麆澏ǚ秶?,并且可視化把該信息用于在圖表中的節(jié)點(diǎn)上定義一個(gè)層級(jí)。默認(rèn)情況下, 只有頂層節(jié)點(diǎn)會(huì)顯示。下面這個(gè)例子使用tf.name_scope
在hidden
命名域下定義了三個(gè)操作:
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')
結(jié)果是得到了下面三個(gè)操作名:
默認(rèn)地,三個(gè)操作名會(huì)折疊為一個(gè)節(jié)點(diǎn)并標(biāo)注為hidden
。其額外細(xì)節(jié)并沒(méi)有丟失,你可以雙擊,或點(diǎn)擊右上方橙色的+
來(lái)展開(kāi)節(jié)點(diǎn),然后就會(huì)看到三個(gè)子節(jié)點(diǎn)alpha
,weights
和biases
了。
這有一個(gè)生動(dòng)的例子,例中有一個(gè)更復(fù)雜的節(jié)點(diǎn),節(jié)點(diǎn)處于其初始和展開(kāi)狀態(tài)。
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/pool1_collapsed.png" alt="未展開(kāi)的名稱域" title="未展開(kāi)的名稱域"> | http://wiki.jikexueyuan.com/project/tensorflow-zh/images/pool1_expanded.png" alt="展開(kāi)的名稱域" title="展開(kāi)的名稱域"> |
頂級(jí)名稱域的初始視圖pool_1 ,點(diǎn)擊右上方橙色的+ 按鈕或雙擊節(jié)點(diǎn)來(lái)展開(kāi)。
|
展開(kāi)的pool_1 名稱域視圖,點(diǎn)擊右上方橙色的- 按鈕或雙擊節(jié)點(diǎn)來(lái)收起此名稱域。
|
通過(guò)名稱域把節(jié)點(diǎn)分組來(lái)得到可讀性高的圖表很關(guān)鍵的。如果你在構(gòu)建一個(gè)模型,名稱域就可以用來(lái)控制可視化結(jié)果。你的名稱域越好,可視性就越好。
上面的圖像例子說(shuō)明了可視化的另一方面, TensorFlow 圖表有兩種連接關(guān)系:數(shù)據(jù)依賴和控制依賴。數(shù)據(jù)依賴顯示兩個(gè)操作之間的tensor流程,用實(shí)心箭頭指示,而控制依賴用點(diǎn)線表示。在已展開(kāi)的視圖(上面的右圖)中,除了用點(diǎn)線連接的CheckNumerics
和control_dependency
之外,所有連接都是數(shù)據(jù)依賴的。
還有一種手段用來(lái)簡(jiǎn)化布局。大多數(shù) TensorFlow 圖表有一部分節(jié)點(diǎn),這部分節(jié)點(diǎn)和其他節(jié)點(diǎn)之間有很多連接。比如,許多節(jié)點(diǎn)在初始化階段可能會(huì)有一個(gè)控制依賴,而繪制所有init
節(jié)點(diǎn)的邊緣和其依賴可能會(huì)創(chuàng)造出一個(gè)混亂的視圖。
為了減少混亂,可視化把所有 high-degree 節(jié)點(diǎn)分離到右邊的一個(gè)從屬區(qū)域, 而不會(huì)繪制線條來(lái)表示他們的邊緣。線條也不用來(lái)表示連接了,我們繪制了小節(jié)點(diǎn)圖標(biāo)來(lái)指示這些連接關(guān)系。分離出從屬節(jié)點(diǎn)通常不會(huì)把關(guān)鍵信息刪除掉,因?yàn)檫@些節(jié)點(diǎn)和內(nèi)構(gòu)功能是相關(guān)的。
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/conv_1.png" alt="conv_1是主圖表的部分" title="conv_1是主圖表的部分"> | http://wiki.jikexueyuan.com/project/tensorflow-zh/images/save.png" alt="save被抽出為從屬節(jié)點(diǎn)" title="save被抽出為從屬節(jié)點(diǎn)"> |
節(jié)點(diǎn)conv_1 被連接到save ,注意其右邊save 節(jié)點(diǎn)圖標(biāo)。
|
save has a high degree, 并會(huì)作為從屬節(jié)點(diǎn)出現(xiàn),與conv_1 的連接作為一個(gè)節(jié)點(diǎn)圖標(biāo)顯示在其左邊。為了繼續(xù)減少雜亂,既然save 有很多連接,我們則只顯示前5個(gè),而把其余的縮略為... 12 more 。
|
最后一個(gè)結(jié)構(gòu)上的簡(jiǎn)化法叫做序列折疊(series collapsing)。 序列基序(Sequential motifs)是擁有相同結(jié)構(gòu)并且其名稱結(jié)尾的數(shù)字不同的節(jié)點(diǎn),它們被折疊進(jìn)一個(gè)單獨(dú)的節(jié)點(diǎn)塊(stack)中。對(duì)長(zhǎng)序列網(wǎng)絡(luò)來(lái)說(shuō),序列折疊極大地簡(jiǎn)化了視圖,對(duì)于已層疊的節(jié)點(diǎn),雙擊會(huì)展開(kāi)序列。
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/series.png" alt="節(jié)點(diǎn)序列" title="節(jié)點(diǎn)序列"> | http://wiki.jikexueyuan.com/project/tensorflow-zh/images/series_expanded.png" alt="展開(kāi)的節(jié)點(diǎn)序列" title="展開(kāi)的節(jié)點(diǎn)序列"> |
一個(gè)節(jié)點(diǎn)序列的折疊視圖。 | 視圖的一小塊, 雙擊后展開(kāi)。 |
最后,針對(duì)易讀性的最后一點(diǎn)要說(shuō)到的是,可視化為常節(jié)點(diǎn)和摘要節(jié)點(diǎn)使用了特別的圖標(biāo),總結(jié)起來(lái)有下面這些節(jié)點(diǎn)符號(hào):
符號(hào) | 意義 |
---|---|
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/namespace_node.png" alt="名稱域" title="名稱域" /> | High-level節(jié)點(diǎn)代表一個(gè)名稱域,雙擊則展開(kāi)一個(gè)高層節(jié)點(diǎn)。 |
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/horizontal_stack.png" alt="斷線節(jié)點(diǎn)序列" title="斷線節(jié)點(diǎn)序列" /> | 彼此之間不連接的有限個(gè)節(jié)點(diǎn)序列。 |
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/vertical_stack.png" alt="相連節(jié)點(diǎn)序列" title="相連節(jié)點(diǎn)序列" /> | 彼此之間相連的有限個(gè)節(jié)點(diǎn)序列。 |
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/op_node.png" alt="操作節(jié)點(diǎn)" title="操作節(jié)點(diǎn)" /> | 一個(gè)單獨(dú)的操作節(jié)點(diǎn)。 |
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/constant.png" alt="常量節(jié)點(diǎn)" title="常量節(jié)點(diǎn)" /> | 一個(gè)常量結(jié)點(diǎn)。 |
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/summary.png" alt="摘要節(jié)點(diǎn)" title="摘要節(jié)點(diǎn)" /> | 一個(gè)摘要節(jié)點(diǎn)。 |
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/dataflow_edge.png" alt="數(shù)據(jù)流邊" title="數(shù)據(jù)流邊" /> | 顯示各操作間的數(shù)據(jù)流邊。 |
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/control_edge.png" alt="控制依賴邊" title="控制依賴邊" /> | 顯示各操作間的控制依賴邊。 |
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/reference_edge.png" alt="引用邊" title="引用邊" /> | 引用邊,表示出度操作節(jié)點(diǎn)可以使入度tensor發(fā)生變化。 |
通過(guò)平移和縮放來(lái)導(dǎo)航圖表,點(diǎn)擊和拖動(dòng)用于平移,滾動(dòng)手勢(shì)用于縮放。雙擊一個(gè)節(jié)點(diǎn)或點(diǎn)擊其+
按鈕來(lái)展開(kāi)代表一組操作的名稱域。右下角有一個(gè)小地圖可以在縮放和平移時(shí)方便的改變當(dāng)前視角。
要關(guān)閉一個(gè)打開(kāi)的節(jié)點(diǎn),再次雙擊它或點(diǎn)擊它的-
按鈕,你也可以只點(diǎn)擊一次來(lái)選中一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)的顏色會(huì)加深,并且會(huì)看到節(jié)點(diǎn)的詳情,其連接到的節(jié)點(diǎn)會(huì)在可視化右上角的詳情卡片顯現(xiàn)。
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/infocard.png" alt="一個(gè)名稱域的詳情卡片" title="一個(gè)名稱域的詳情卡片"> | http://wiki.jikexueyuan.com/project/tensorflow-zh/images/infocard_op.png" alt="操作節(jié)點(diǎn)的詳情卡片" title="操作節(jié)點(diǎn)的詳情卡片"> |
詳情卡片展示conv2 名稱域的詳細(xì)信息,名稱域中操作節(jié)點(diǎn)的輸入和輸出被結(jié)合在一起,適用于不顯示屬性的名稱域。
|
詳情卡片展示DecodeRaw 操作節(jié)點(diǎn),除了輸入和輸出,卡片也會(huì)展示與當(dāng)前節(jié)點(diǎn)相關(guān)的設(shè)備和屬性。
|
選擇對(duì)于 high-degree 節(jié)點(diǎn)的理解也很有幫助,選擇任意節(jié)點(diǎn),則與它的其余連接相應(yīng)的節(jié)點(diǎn)也會(huì)選中,這使得在進(jìn)行例如查看哪一個(gè)節(jié)點(diǎn)是否已保存等操作時(shí)非常容易。
點(diǎn)擊詳情卡片中的一個(gè)節(jié)點(diǎn)名稱時(shí)會(huì)選中該節(jié)點(diǎn),必要的話,視角會(huì)自動(dòng)平移以使該節(jié)點(diǎn)可見(jiàn)。
最后,使用圖例上方的顏色菜單,你可以給你的圖表選擇兩個(gè)顏色方案。默認(rèn)的結(jié)構(gòu)視圖下,當(dāng)兩個(gè) high-level 節(jié)點(diǎn)顏色一樣時(shí),其會(huì)以相同的彩虹色彩出現(xiàn),而結(jié)構(gòu)唯一的節(jié)點(diǎn)顏色是灰色。還有一個(gè)視圖則展示了不同的操作運(yùn)行于什么設(shè)備之上。名稱域被恰當(dāng)?shù)母鶕?jù)其中的操作節(jié)點(diǎn)的設(shè)備片件來(lái)著色。
下圖是一張真實(shí)圖表的圖解:
http://wiki.jikexueyuan.com/project/tensorflow-zh/images/colorby_structure.png" alt="按結(jié)構(gòu)著色" title="按結(jié)構(gòu)著色"> | http://wiki.jikexueyuan.com/project/tensorflow-zh/images/colorby_device.png" alt="按設(shè)備著色" title="按設(shè)備著色"> |
結(jié)構(gòu)視圖:灰色節(jié)點(diǎn)的結(jié)構(gòu)是唯一的。橙色的conv1 和conv2 節(jié)點(diǎn)有相同的結(jié)構(gòu), 其他顏色的節(jié)點(diǎn)也類似。
|
設(shè)備視圖:名稱域根據(jù)其中的操作節(jié)點(diǎn)的設(shè)備片件來(lái)著色,在此紫色代表GPU,綠色代表CPU。 |
原文: TensorBoard: Graph Visualization 翻譯: @Warln 校對(duì): lucky521