TensorBoard 是一套 Web 應用程序,用於檢查和了解 TensorFlow 運行和圖表。
本自述文件概述了 TensorBoard 中的關鍵概念,以及如何解釋 TensorBoard 提供的視覺化效果。有關使用 TensorBoard 的深入範例,請參閱教學:TensorBoard:入門。有關如何使用 TensorBoard 處理圖像、圖形、超參數等的文檔以及 Colab 中的教程演練均從此處鏈接。
TensorBoard 設計為完全離線運行,無需上網。例如,這可能位於您的本機電腦上、公司防火牆後面或資料中心。
在執行 TensorBoard 之前,請確保您已透過建立摘要編寫器在日誌目錄中產生摘要資料:
# sess.graph contains the graph definition; that enables the Graph Visualizer.
file_writer = tf . summary . FileWriter ( '/path/to/logs' , sess . graph )
有關更多詳細信息,請參閱 TensorBoard 教程。取得事件檔案後,執行 TensorBoard 並提供日誌目錄。如果您使用預先編譯的 TensorFlow 套件(例如透過 pip 安裝),請執行:
tensorboard --logdir path/to/logs
或者,如果您從原始程式碼建置:
bazel build tensorboard:tensorboard
./bazel-bin/tensorboard/tensorboard --logdir path/to/logs
# or even more succinctly
bazel run tensorboard -- --logdir path/to/logs
這應該會列印 TensorBoard 已啟動。接下來,連線到 http://localhost:6006。
TensorBoard 需要一個logdir
來讀取日誌。有關配置 TensorBoard 的信息,請運行tensorboard --help
。
TensorBoard 可在 Google Chrome 或 Firefox 中使用。其他瀏覽器可能可以工作,但可能存在錯誤或效能問題。
使用 TensorBoard 的第一步是從 TensorFlow 運作中取得資料。為此,您需要摘要操作。摘要操作就是操作,就像tf.matmul
和tf.nn.relu
一樣,這意味著它們接受張量、產生張量,並在 TensorFlow 圖中進行評估。然而,摘要操作有一個特點:它們產生的張量包含序列化的 protobuf,這些 protobuf 被寫入磁碟並發送到 TensorBoard。要在 TensorBoard 中視覺化摘要數據,您應該評估摘要操作,檢索結果,然後使用 Summary.FileWriter 將該結果寫入磁碟。教程中有完整的解釋和範例。
支援的摘要操作包括:
tf.summary.scalar
tf.summary.image
tf.summary.audio
tf.summary.text
tf.summary.histogram
當你做一個摘要操作時,你也會給它一個tag
。標籤基本上是該操作記錄的資料的名稱,並將用於組織前端中的資料。標量和直方圖儀表板按標籤組織數據,並根據目錄/類似/層次結構將標籤分組到資料夾中。如果您有很多標籤,我們建議使用斜線將它們分組。
summary.FileWriters
從 TensorFlow 取得摘要數據,然後將它們寫入指定的目錄(稱為logdir
。具體來說,資料被寫入檔案名稱中包含“tfevents”的僅附加記錄轉儲。 TensorBoard 從完整目錄中讀取數據,並將其組織到單一 TensorFlow 執行的歷史記錄中。
為什麼它會讀取整個目錄,而不是單一檔案?您可能一直在使用supervisor.py來運行您的模型,在這種情況下,如果TensorFlow崩潰,supervisor將從檢查點重新啟動它。當它重新啟動時,它將開始寫入新的事件文件,TensorBoard 會將各個事件文件拼接在一起,以產生所發生事件的一致歷史記錄。
您可能想要直觀地比較模型的多次執行;例如,假設您更改了超參數並想看看它是否收斂得更快。 TensorBoard 透過不同的「運行」來實現這一點。當 TensorBoard 在啟動時傳遞一個logdir
時,它會遞歸地遍歷以logdir
為根的目錄樹,尋找包含 tfevents 資料的子目錄。每次遇到這樣的子目錄時,它都會將其載入為新的run
,並且前端將相應地組織資料。
例如,這裡是一個組織良好的 TensorBoard 日誌目錄,有兩個運行,「run1」和「run2」。
/some/path/mnist_experiments/
/some/path/mnist_experiments/run1/
/some/path/mnist_experiments/run1/events.out.tfevents.1456525581.name
/some/path/mnist_experiments/run1/events.out.tfevents.1456525585.name
/some/path/mnist_experiments/run2/
/some/path/mnist_experiments/run2/events.out.tfevents.1456525385.name
/tensorboard --logdir /some/path/mnist_experiments
您還可以傳遞以逗號分隔的日誌目錄列表,TensorBoard 將監視每個目錄。您也可以透過在名稱和路徑之間放置冒號來為各個日誌目錄指派名稱,如下所示
tensorboard --logdir_spec name1:/path/to/logs/1,name2:/path/to/logs/2
不鼓勵使用該標誌( --logdir_spec
),並且通常可以避免使用該標誌。 TensorBoard 遞歸地遍歷日誌目錄;為了更細粒度的控制,更喜歡使用符號連結樹。使用--logdir_spec
而不是--logdir
時,某些功能可能不起作用。
TensorBoard 的標量儀表板視覺化隨時間變化的標量統計;例如,您可能想要追蹤模型的損失或學習率。如關鍵概念中所述,您可以比較多次運行,並且資料按標籤組織。折線圖有以下交互作用:
點擊每個圖表左下角的藍色小圖示將展開圖表
拖曳圖表上的矩形區域將放大
雙擊圖表將縮小
將滑鼠懸停在圖表上將產生十字準線,資料值會記錄在左側的運行選擇器中。
此外,您可以透過在儀表板左上角的方塊中編寫正規表示式來建立新資料夾來組織標籤。
直方圖儀表板顯示張量的統計分佈如何隨時間變化。它可視化透過tf.summary.histogram
記錄的資料。每個圖表顯示資料的時間“切片”,其中每個切片都是給定步驟的張量的直方圖。它的組織方式是最舊的時間步在後面,最近的時間步在前面。透過將直方圖模式從“偏移”變更為“疊加”,透視圖將旋轉,以便每個直方圖切片呈現為一條線並相互疊加。
分佈儀表板是可視化tf.summary.histogram
直方圖資料的另一種方式。它顯示了一些關於分佈的高級統計數據。圖表上的每條線代表資料分佈中的一個百分位:例如,底線顯示最小值如何隨時間變化,中間的線顯示中位數如何變化。由上至下閱讀,各行具有以下意義: [maximum, 93%, 84%, 69%, 50%, 31%, 16%, 7%, minimum]
這些百分位數也可以視為常態分佈上的標準差邊界: [maximum, μ+1.5σ, μ+σ, μ+0.5σ, μ, μ-0.5σ, μ-σ, μ-1.5σ, minimum]
這樣,從內到外讀取的彩色區域的寬度分別為[σ, 2σ, 3σ]
。
影像儀表板可以顯示透過tf.summary.image
儲存的 png。儀表板的設定使每一行對應一個不同的標籤,每列對應一個運行。由於影像儀表板支援任意 png,因此您可以使用它將自訂視覺化(例如 matplotlib 散點圖)嵌入到 TensorBoard 中。此儀表板始終向您顯示每個標籤的最新圖像。
音訊儀表板可以嵌入可播放的音訊小工具,用於透過tf.summary.audio
儲存的音訊。儀表板的設定使每一行對應一個不同的標籤,每列對應一個運行。此儀表板始終嵌入每個標籤的最新音訊。
Graph Explorer 可以視覺化 TensorBoard 圖,從而能夠檢查 TensorFlow 模型。為了充分利用圖形視覺化工具,您應該使用名稱範圍對圖形中的操作進行分層分組 - 否則,圖形可能難以解讀。如需更多資訊(包括範例),請參閱檢查 TensorFlow 圖教學。
嵌入投影機可讓您視覺化高維度資料;例如,您可以在模型將輸入資料嵌入高維空間後查看輸入資料。嵌入投影機從模型檢查點文件中讀取數據,並且可以配置其他元數據,例如詞彙文件或精靈圖像。有關更多詳細信息,請參閱嵌入投影機教程。
文字儀表板顯示透過tf.summary.text
儲存的文字片段。支援包括超連結、清單和表格在內的 Markdown 功能。
時間序列儀表板顯示一個統一的介面,其中包含透過tf.summary.scalar
、 tf.summary.image
或tf.summary.histogram
保存的所有標量、直方圖和圖像。例如,它可以與啟動直方圖和訓練範例影像並排查看「準確度」折線圖。
特點包括:
自訂運行顏色:按一下運行選擇器中的彩色圓圈可變更運行的顏色。
固定卡片:點擊任何卡片上的“固定”圖標,將其添加到頂部的固定部分以便快速比較。
設定:右側窗格提供圖表和其他視覺化效果的設定。當託管在同一 URL 來源時,重要設定將在 TensorBoard 會話之間保留。
標籤過濾器中的自動完成:更輕鬆地搜尋特定圖表。
首先,檢查傳遞給--logdir
目錄是否正確。您也可以透過導覽至標量儀表板(在「非活動」功能表下)並在左側邊欄底部尋找日誌目錄路徑來驗證這一點。
如果您從正確的路徑加載,請確保事件檔案存在。 TensorBoard 將遞歸地遍歷其 logdir,如果資料嵌套在子目錄下就可以了。確保以下至少顯示一個結果:
find DIRECTORY_PATH | grep tfevents
您也可以透過在檢查模式下執行tensorboard來檢查事件檔案的內容來檢查事件檔案是否確實具有資料。
tensorboard --inspect --logdir DIRECTORY_PATH
與空白 TensorBoard 對應的事件檔案的輸出有時仍可能顯示幾個步驟,代表 TensorBoard 未顯示的一些初始事件(例如,當使用 Keras TensorBoard 回調時):
tensor
first_step 0
last_step 2
max_step 2
min_step 0
num_steps 2
outoforder_steps [(2, 0), (2, 0), (2, 0)]
相反,具有更多資料的事件文件的輸出可能如下所示:
tensor
first_step 0
last_step 55
max_step 250
min_step 0
num_steps 60
outoforder_steps [(2, 0), (2, 0), (2, 0), (2, 0), (50, 9), (100, 19), (150, 29), (200, 39), (250, 49)]
更新: 2.3.0 發布後,TensorBoard 不再每 30 秒自動重新加載一次。若要重新啟用該行為,請透過點擊 TensorBoard Web 介面右上角的齒輪圖示開啟設置,然後啟用「重新載入資料」。
更新:實驗性的
--reload_multifile=true
選項現在可用於輪詢目錄中的所有「活動」檔案以獲取新數據,而不是如下所述的最新文件。只要檔案在--reload_multifile_inactive_secs
秒前收到新數據,該檔案就處於「活動」狀態,預設為 86400。
出現此問題的原因通常是 TensorBoard 迭代tfevents
文件的方式:它按時間戳順序遍歷事件文件,並且一次僅讀取一個文件。假設我們有時間戳為a
和b
文件,其中a 。一旦 TensorBoard 讀取了
a
中的所有事件,它就永遠不會返回到 a ,因為它假設任何新事件都被寫入較新的檔案中。例如,如果您有兩個FileWriters
同時寫入同一目錄,這可能會導致問題。如果您有多個摘要編寫者,則每個摘要編寫者都應寫入單獨的目錄。
更新:實驗性的
--reload_multifile=true
選項現在可用於輪詢目錄中的所有「活動」文件以獲取新數據,定義為在--reload_multifile_inactive_secs
秒前接收新數據的任何文件,預設為 86400。
不會。如果您正在執行分散式 TensorFlow 實例,我們鼓勵您指定一個工作人員為負責所有總計處理的「首席」。有關範例,請參閱supervisor.py。
如果您看到的數據似乎隨著時間的推移而倒退並與自身重疊,則有幾種可能的解釋。
您可能會多次執行 TensorFlow,並且全部寫入相同日誌目錄。請讓每個 TensorFlow 運行寫入自己的日誌目錄。
更新:實驗性的
--reload_multifile=true
選項現在可用於輪詢目錄中的所有「活動」文件以獲取新數據,定義為在--reload_multifile_inactive_secs
秒前接收新數據的任何文件,預設為 86400。
您的程式碼中可能存在錯誤,其中 global_step 變數(傳遞給FileWriter.add_summary
)維護不正確。
您的 TensorFlow 作業可能崩潰了,並從較早的檢查點重新啟動。請參閱下面的如何處理 TensorFlow 重新啟動。
作為解決方法,請嘗試將 TensorBoard 中的 x 軸顯示器從steps
變更為wall_time
。這通常可以解決問題。
TensorFlow 設計有一種在作業崩潰或被終止時可以正常恢復的機制:TensorFlow 可以定期寫入模型檢查點文件,這可讓您重新啟動 TensorFlow,而不會遺失所有訓練進度。
然而,這會讓 TensorBoard 的事情變得複雜;想像 TensorFlow 在步驟a
寫入了一個檢查點,然後繼續運行直到步驟b
,然後崩潰並在時間戳a
重新啟動。 a
和b
之間寫入的所有事件都被重新啟動事件“孤立”,應刪除。
為了方便這一點,我們在tensorflow/core/util/event.proto
中有一個SessionLog
訊息,它可以將SessionStatus.START
記錄為一個事件;與所有事件一樣,它可能有一個與之相關的step
。如果 TensorBoard 偵測到步驟a
的SessionStatus.START
事件,它將假定步驟大於a
的每個事件都是孤立的,並且它將丟棄這些事件。可以使用標誌--purge_orphaned_data false
停用此行為(在 0.7 之後的版本)。
Scalar Dashboard支援導出資料;您可以點擊左側欄中的“啟用下載連結”選項。然後,每個圖將提供其包含的數據的下載連結。
如果您需要存取完整的資料集,您可以使用summary_iterator
方法讀取TensorBoard所使用的事件檔案。
是的!您可以克隆和修改其中一個範例,並製作您自己的令人驚嘆的視覺化效果。 ADDING_A_PLUGIN 指南中描述了有關插件系統的更多文件。請隨意提出功能請求或有關插件功能的問題。
對您自己的突破性新外掛感到滿意後,請參閱發行部分,了解如何發佈到 PyPI 並與社群分享。
使用自訂標量插件,您可以為自訂運行標籤對建立帶有線條的標量圖。但是,在原始標量儀表板中,每個標量圖對應於特定標籤的數據,並包含包含該標籤的每次運行的行。
可以使用自訂標量外掛程式建立裕度圖(視覺化下限和上限)。原始標量插件不支援可視化邊距。
這還不可能。作為解決方法,您可以在自己的程式碼(例如 matplotlib)中建立自訂繪圖,然後將其寫入SummaryProto
( core/framework/summary.proto
) 並將其新增至您的FileWriter
。然後,您的自訂繪圖將出現在 TensorBoard 影像標籤中。
TensorBoard 使用水庫採樣對資料進行下採樣,以便將其載入到 RAM 中。您可以使用--samples_per_plugin
命令列參數來修改每個標籤保留的元素數量(例如: --samples_per_plugin=scalars=500,images=20
)。請參閱此堆疊溢位問題以取得更多資訊。
TensorBoard 2.0 之前的 TensorBoard 版本預設在可公開存取的主機0.0.0.0
上提供服務。對於這些版本的 TensorBoard,您可以透過在啟動時指定--host localhost
來停止彈出視窗。
在 TensorBoard 2.0 及更高版本中, --host localhost
是預設值。使用--bind_all
恢復在 IPv4 和 IPv6 上為公共網路提供服務的舊行為。
tensorboard
嗎?如果您沒有安裝 TensorFlow,TensorBoard 1.14+ 可以使用縮減的功能集運作。主要限制是,從 1.14 開始,僅支援以下插件:標量、自訂標量、圖像、音訊、圖形、投影機(部分)、分佈、直方圖、文字、PR 曲線、網格。此外,Google Cloud Storage 上不支援日誌目錄。
請參閱 DEVELOPMENT.md。
首先,嘗試搜尋我們的 GitHub 問題和 Stack Overflow。可能其他人已經遇到了同樣的問題或問題。
一般使用問題(或可能特定於您的本機設定的問題)應前往 Stack Overflow。
如果您在 TensorBoard 中發現錯誤,請提交一個 GitHub 問題,並提供盡可能多的支援資訊(例如附加事件文件,包括tensorboard --inspect
的輸出等)。