TensorFlow 計(jì)算圖功能十分強(qiáng)大,但也非常復(fù)雜。圖的直觀展示可幫助您理解圖并對(duì)圖進(jìn)行調(diào)試。以下示例顯示了實(shí)際的可視化效果。
要查看您自己的圖,請(qǐng)運(yùn)行 TensorBoard 并將其指向作業(yè)的日志目錄,點(diǎn)擊頂部窗格中的 “圖” 標(biāo)簽,然后使用左上角的菜單選擇適當(dāng)?shù)倪\(yùn)行條目。要深入了解如何運(yùn)行 TensorBoard 并確保記錄所有必要信息,請(qǐng)參閱TensorBoard:直觀展示學(xué)習(xí)。
名稱范圍和節(jié)點(diǎn)
典型的 TensorFlow 圖可能具有數(shù)千個(gè)節(jié)點(diǎn) — 數(shù)量過多,難以一次性查看,甚至難以使用標(biāo)準(zhǔn)圖工具來進(jìn)行布置。為了進(jìn)行簡(jiǎn)化,可以對(duì)變量名稱設(shè)定范圍,然后,直觀展示工具可以使用此信息來為圖中的節(jié)點(diǎn)定義層次結(jié)構(gòu)。默認(rèn)情況下僅顯示該層次結(jié)構(gòu)的頂層。以下示例使用tf.name_scope在hidden名稱作用域下定義了三個(gè)操作:
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')
這導(dǎo)致出現(xiàn)以下三個(gè) op 名稱:
hidden/alpha
hidden/weights
hidden/biases
默認(rèn)情況下,直觀展示工具會(huì)將這三個(gè)名稱收起到一個(gè)標(biāo)作hidden的節(jié)點(diǎn)中。其他詳細(xì)信息不會(huì)丟失。您可以雙擊節(jié)點(diǎn)或點(diǎn)擊右上角的橙色+符號(hào)以展開節(jié)點(diǎn),然后您將看到alpha、weights和biases三個(gè)子節(jié)點(diǎn)。
以下真實(shí)示例展示了一個(gè)更加復(fù)雜的節(jié)點(diǎn)的初始狀態(tài)和展開狀態(tài)。
頂級(jí)名稱范圍pool_1的初始視圖。點(diǎn)擊右上角的橙色+按鈕或雙擊節(jié)點(diǎn)本身即可展開該節(jié)點(diǎn)
pool_1名稱范圍的展開視圖。點(diǎn)擊右上角的橙色-按鈕或雙擊節(jié)點(diǎn)本身即可收起該名稱范圍
要讓圖易于觀看,按名稱范圍對(duì)節(jié)點(diǎn)進(jìn)行分組至關(guān)重要。如果您要構(gòu)建模型,名稱范圍可幫助您控制生成的直觀展示。您的名稱范圍越好,直觀展示的效果也就越棒。
上圖顯示了直觀展示的另一方面。TensorFlow 圖具有兩種連接:數(shù)據(jù)依賴關(guān)系和控制依賴關(guān)系。數(shù)據(jù)依賴關(guān)系顯示兩個(gè) op 之間的張量流動(dòng),該依賴關(guān)系顯示為實(shí)線箭頭,而控制依賴關(guān)系顯示為虛線。在展開視圖中(上圖右側(cè)),所有連接均為數(shù)據(jù)依賴關(guān)系,只有連接CheckNumerics和control_dependency的虛線除外。
還有一個(gè)技巧可以簡(jiǎn)化布局。大多數(shù) TensorFlow 圖都包含幾個(gè)連接至許多其他節(jié)點(diǎn)的節(jié)點(diǎn)。例如,許多節(jié)點(diǎn)可能對(duì)初始化步驟存在控制依賴關(guān)系。繪制init節(jié)點(diǎn)及其依賴項(xiàng)之間的所有邊緣時(shí),會(huì)產(chǎn)生極為雜亂的視圖。
為了減輕雜亂,直觀展示工具會(huì)將所有高等級(jí)節(jié)點(diǎn)劃分到右側(cè)的輔助區(qū)域中,并且不繪制線來表示它們的邊緣。我們不使用線而使用節(jié)點(diǎn)圖標(biāo)來表示連接。分出輔助節(jié)點(diǎn)時(shí)通常不會(huì)移除關(guān)鍵信息,因?yàn)檫@些節(jié)點(diǎn)通常與簿記函數(shù)相關(guān)。請(qǐng)參閱下方交互部分,了解如何在主圖和輔助區(qū)域之間移動(dòng)節(jié)點(diǎn)。
節(jié)點(diǎn)conv_1連接到save。請(qǐng)注意它右側(cè)的save節(jié)點(diǎn)小圖標(biāo)
save的級(jí)別較高,它將顯示為輔助節(jié)點(diǎn)。與conv_1的連接顯示為左側(cè)的節(jié)點(diǎn)圖標(biāo)。為了進(jìn)一步減輕雜亂,由于save有許多連接,我們僅顯示前 5 個(gè)連接,并將其余連接縮寫為... 12 more
最后一種結(jié)構(gòu)簡(jiǎn)化方法是序列收起。如下所示,序列模體 (motif)(即結(jié)構(gòu)相同但名稱末尾的數(shù)字不同的節(jié)點(diǎn))將收起到節(jié)點(diǎn)的單個(gè)層疊中。對(duì)于具有長(zhǎng)序列的網(wǎng)絡(luò),這極大地簡(jiǎn)化了視圖。對(duì)于具有層次結(jié)構(gòu)的節(jié)點(diǎn),雙擊即可展開序列。請(qǐng)參閱下方交互部分,了解如何為一組特定的節(jié)點(diǎn)停用/啟用序列收起。
節(jié)點(diǎn)序列收起后的視圖
雙擊后顯示的展開視圖的一小部分內(nèi)容
直觀展示工具為了改進(jìn)易讀性而采取的最后一項(xiàng)輔助措施是:為常量和總結(jié)節(jié)點(diǎn)使用特殊圖標(biāo)。下表對(duì)節(jié)點(diǎn)符號(hào)進(jìn)行了總結(jié):
交互
通過平移和縮放在圖中導(dǎo)航。點(diǎn)擊并拖動(dòng)可進(jìn)行平移,使用滾動(dòng)手勢(shì)可進(jìn)行縮放。雙擊節(jié)點(diǎn)或點(diǎn)擊它的+按鈕可展開代表一組指令的名稱范圍。為了在縮放和平移時(shí)輕松跟蹤當(dāng)前視點(diǎn),右下角提供了一個(gè)小地圖。
要關(guān)閉打開的節(jié)點(diǎn),請(qǐng)?jiān)俅坞p擊節(jié)點(diǎn)或點(diǎn)擊它的 — 按鈕。您也可以點(diǎn)擊一次以選擇一個(gè)節(jié)點(diǎn)。該節(jié)點(diǎn)的顏色將加深,其相關(guān)詳細(xì)信息及與其連接的節(jié)點(diǎn)將顯示在直觀展示工具右上角的信息卡上。
顯示了conv2名稱范圍的相關(guān)詳情的信息卡。輸入和輸出是從名稱范圍內(nèi)的指令節(jié)點(diǎn)的輸入和輸出合并而來。沒有顯示名稱范圍的屬性
顯示了DecodeRaw指令節(jié)點(diǎn)的詳細(xì)信息的信息卡。除了輸入和輸出以外,該卡還顯示與當(dāng)前指令關(guān)聯(lián)的設(shè)備和和屬性
TensorBoard 提供了數(shù)種方法來改變圖的視覺布局。這不會(huì)改變圖的計(jì)算語義,但可讓網(wǎng)絡(luò)結(jié)構(gòu)變得更加清晰。通過右鍵點(diǎn)擊節(jié)點(diǎn)或按下節(jié)點(diǎn)信息卡底部的按鈕,您可以對(duì)它的布局做出以下更改:
您可在主圖和輔助區(qū)域之間移動(dòng)節(jié)點(diǎn)
您可以對(duì)一系列節(jié)點(diǎn)取消分組,使得序列中的節(jié)點(diǎn)不以分組的形式顯示。您同樣可以對(duì)取消分組的序列進(jìn)行重新分組
選中節(jié)點(diǎn)也有助于您理解高級(jí)別節(jié)點(diǎn)。請(qǐng)選擇任意高級(jí)別節(jié)點(diǎn),隨后該節(jié)點(diǎn)的其他連接所對(duì)應(yīng)的節(jié)點(diǎn)圖標(biāo)也將被選中。此操作可幫助您輕松了解正在保存哪些節(jié)點(diǎn),以及沒有保存哪些節(jié)點(diǎn)。
點(diǎn)擊信息卡中的節(jié)點(diǎn)名稱即可選中該節(jié)點(diǎn)。如有必要,視點(diǎn)將自動(dòng)平移以便使節(jié)點(diǎn)顯示出來。
最后,您可以使用圖例上方的顏色菜單為您的圖選擇兩種配色方案。默認(rèn)的結(jié)構(gòu)視圖顯示了結(jié)構(gòu):當(dāng)兩個(gè)高級(jí)別節(jié)點(diǎn)具有相同的結(jié)構(gòu)時(shí),它們將顯示相同的彩虹色。具有獨(dú)特結(jié)構(gòu)的節(jié)點(diǎn)顯示為灰色。第二個(gè)視圖顯示運(yùn)行不同指令的設(shè)備。名稱范圍根據(jù)其內(nèi)部指令的設(shè)備比例來按比例著色。
下圖顯示了一個(gè)真實(shí)圖的一部分的圖解。
結(jié)構(gòu)視圖:灰色節(jié)點(diǎn)具有獨(dú)特的結(jié)構(gòu)。橙色conv1和conv2節(jié)點(diǎn)具有相同的結(jié)構(gòu),其他顏色相同的節(jié)點(diǎn)同樣如此
設(shè)備視圖:名稱范圍根據(jù)其內(nèi)部指令節(jié)點(diǎn)的設(shè)備比例來按比例著色。此處的紫色代表 GPU,綠色代表 CPU
張量形狀信息
當(dāng)序列化GraphDef包含張量形狀時(shí),圖可視化工具會(huì)使用張量維度來標(biāo)記邊緣,而邊緣厚度反映總張量大小。要在GraphDef中包括張量形狀,請(qǐng)?jiān)趯?duì)圖執(zhí)行序列化時(shí),將實(shí)際圖對(duì)象(如sess.graph中所示)傳遞到FileWriter。下圖顯示了包含張量形狀信息的 CIFAR-10 模型:
包含張量形狀信息的 CIFAR-10 模型
運(yùn)行時(shí)統(tǒng)計(jì)信息
通常,收集運(yùn)行的運(yùn)行時(shí)元數(shù)據(jù)(例如節(jié)點(diǎn)的總內(nèi)存使用量、總計(jì)算時(shí)間和張量形狀)很有用。以下代碼示例節(jié)選自修改版Estimator MNIST 教程的訓(xùn)練和測(cè)試部分,在該代碼段中,我們記錄了匯總和運(yùn)行時(shí)統(tǒng)計(jì)信息。請(qǐng)參閱匯總教程 以詳細(xì)了解如何記錄匯總。要查看完整的源代碼,請(qǐng)點(diǎn)擊此處(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 步發(fā)出一次運(yùn)行時(shí)統(tǒng)計(jì)。
當(dāng)您啟動(dòng) TensorBoard 并轉(zhuǎn)至 “圖” (Graph) 標(biāo)簽時(shí),您現(xiàn)在將在 “會(huì)話運(yùn)行” (Session runs)(與添加了運(yùn)行元數(shù)據(jù)的步對(duì)應(yīng))下看到一些選項(xiàng)。選擇其中一個(gè)運(yùn)行后,系統(tǒng)將為您顯示該步時(shí)的網(wǎng)絡(luò)快照,并將未使用的節(jié)點(diǎn)顯示為淡出。在左側(cè)的控件中,您將能夠按總內(nèi)存或總計(jì)算時(shí)間為節(jié)點(diǎn)著色。此外,點(diǎn)擊節(jié)點(diǎn)可顯示確切的總內(nèi)存量、計(jì)算時(shí)間和張量輸出大小。
-
可視化
+關(guān)注
關(guān)注
1文章
1196瀏覽量
20963 -
tensorflow
+關(guān)注
關(guān)注
13文章
329瀏覽量
60538
原文標(biāo)題:TensorBoard:圖的直觀展示
文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論