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