0703-可視化工具tensorboard和visdom
目錄- 一、可視化工具概述
- 二、TensorBoard
- 三、Visdom
- 3.1 visdom 概述
- 3.2 visdom 的常用操作
- 3.3 visdom.line 可視化和 update 操作
- 3.4 visdom.image(images) 可視化
- 3.5 visdom.text 可視化
pytorch完整教程目錄:https://www.cnblogs.com/nickchen121/p/14662511.html
一、可視化工具概述
當我們訓練神經網路的時候,我們可能希望更加直觀地了解訓練情況,包括損失曲線、輸入圖片、輸出圖片、卷積核的引數分布等資訊,這些資訊能幫我們更好地監督網路的訓練程序,并且能夠為引數優化提供方向和資料,
以往我們都是通過 print 列印輸出,但是只能列印資訊,并且很多資料不夠直觀,本節我們將介紹兩個深度學習中常用的可視化工具——TensorBoard 和 visdom,它們能更直觀的體現很多資訊,
二、TensorBoard
TensorBoard 起初是 作為 TensorFlow 的可視化工具迅速流行開的,作為和 tf 深度集成的工具,tensorboard 能夠展現 tf 的網路計算圖,繪制影像生成定量指標圖及附加資料,界面如下圖所示:
雖然 TensorBoard 和 tf 深度集成,但是 TensorBoard 是一個相對獨立的工具,只要用戶保存的資料遵循相應的格式,tensorboard 就能讀取這些資料并進行可視化,
接下來將會介紹如何在 torch 中使用 tensorboard_logger 進行訓練損失的可視化,
tensorboard_logger 是 TeamHG-Memex 開發的一款輕量級工具,它把 TensorBoard 的功能抽取出來,讓非 TensorBoard 用戶也能使用它進行可視化,但是支持的功能有限,
tensorboard_logger 的安裝主要分為以下兩步:
- 安裝 TensorFlow:建議安裝 tf 的 cpu-only 版本,具體安裝教程參考 TensorFlow 官方檔案 - pip 安裝
- 安裝 tensorboard_logger:可以通過
pip install tensorboard_logger命令直接安裝
tensorboard_logger 安裝結束后,可以通過以下命令直接啟動 TensorBoard:tensorboard --logdir <your/running/dir> --port <your_bind_port>,其中 <your/running/dir> 是當前運行檔案所屬的檔案夾,
下面舉例來說明 tensorboard_logger 的使用,
from tensorboard_logger import Logger
# 構建 logger 物件,logdir 用來指定 log 檔案的保存路徑
# flush_secs 用來指定重繪同步間隔
logger = Logger(logdir='experimient_cnn', flush_secs=2)
for ii in range(100):
logger.log_value('loss', 10 - ii * 0.5, step=ii)
logger.log_value('accuracy', ii**0.5 / 10)
打開瀏覽器輸入 http://localhost:6006(其中 6006 是默認的 <your_bind_port>),即可以看到如圖所示的結果:
上圖左側的 Horizontal Axis 下有如下三個選項:
- Step:根據步長來記錄,log_value 是指如果有步長,則把它作為 x 軸坐標描點劃線
- Relative:用前后相對順序描點劃線,可以認為 logger 自己維護了一個 step 屬性,每呼叫一次 log_value 就自動加 1
- Wall:按時間排序描點劃線
左側的 Smoothing 條可以左右拖動,用來調節平滑的幅度,因為默認是 30s 自動重繪資料,因此可以單擊頁面右上角的重繪按鈕立即重繪結果,
雖然 tensorboard_logger 的使用十分簡單,但它只能統計簡單的數值資訊,暫不支持其他功能,
除了 tensorboard_logger,還有專門針對 torch 開發的 TensorBoardX,它封裝了更多的 tensorboard 介面,支持記錄標量、圖片、直方圖、聲音、文本、計算圖和 embedding 等資訊,幾乎包括和 tf 的 TensorBoard 完全一樣的功能,并且使用介面更加簡單,有興趣的同學可以自行學習,
三、Visdom
3.1 visdom 概述
visdom 是 Facebook 專門為 torch 開發的一款可視化工具,它非常輕量級,但是卻支持非常豐富的功能,能勝任大多數的科學運算可視化任務,它的可視化界面如下圖所示:

visdom 可以創造、組織和共享多種資料的可視化,包括數值、影像、文本,甚至是視頻,支持 PyTorch、Torch 和 Numpy,
用戶可以通過編程組織可視化空間或通過用戶介面為資料打造儀表板,檢查實驗結果和除錯代碼,
visdom 中有以下兩個重要概念:
- env:環境,不同環境的可視化結果相互隔離,互不影響,使用的時候如果不指定 env,默認使用 main,不同用戶、不同的程式一般使用不同的 env,
- pane:窗格,窗格可以用于可視化影像、數值或列印文本等,它可以拖動、縮放、保存和關閉,一個程式可以使用同一個 env 中的不同 pane,每個 pane 可視化或記錄某一資訊,
如下圖所示,當前 env 下有兩個 pane,一個用于列印 log,另外一個用于記錄損失函式的變化,單擊 “clear” 按鈕可以清空當前 env 的所有 pane,單擊 “save” 按鈕可以把當前 env 保存成 json 檔案,保存路徑位于 ~/.visdom/ 目錄下,修改 env 的名字后單擊 fork,可以將當前 env 另存為新檔案,
通過命令 pip install visdom 就可以完成 visdom 的安裝,安裝完成后,需要通過 python -m visdom.server 命令啟動 visdom 服務,或通過 nohup python -m visdom.server & 命令把服務放到后臺運行,visdom 服務是一個 Web Server 服務,默認系結 8097 埠,客戶端和服務器間通過 tornado 進行非堵塞互動,
因此在使用 visdom 時有兩點需要注意的地方:
- 需要手動指定保存 env,可以在 Web 界面單擊 “save” 按鈕或在程式中呼叫 save 方法,否則 visdom 服務重啟后,env 等資訊會丟失
- 客戶端和服務器之間的互動采用 tornado 異步框架,可視化操作不會堵塞當前程式,網路例外也不會導致程式退出
3.2 visdom 的常用操作
visdom 以 Plotly 為基礎,支持豐富的可視化操作,下面舉例說明一些最常用的操作,
# 啟動visdom 服務器
# nohup python -m visdom.server &
import visdom
import torch as t
# 新建一個連接客戶端
# 指定 env=u'test1',默認埠為 8097,host 是 'localhost'
vis = visdom.Visdom(env=u'test1')
x = t.arange(1, 30, 0.01)
y = t.sin(x)
vis.line(X=x, Y=y, win='sinx', opts={'title': 'y=sin(x)'})
Setting up a new session...
'sinx'

下面我們逐一分析上述代碼:
vis = visdom.Visdom(env=t'test1'),用于構建一個客戶端,客戶端除了指定 env 外,還可以指定 host、port 等引數,- vis 作為一個客戶端物件,可以使用如下常見的畫圖函式:
- line:類似 MATLAB 中的 plot 操作,用于記錄某些標量的變化,例如損失、準確率等
- image:可視化圖片,可以是輸入的圖片,也可以是 GAN 生成的圖片,還可以是卷積核的資訊
- text:用于記錄日志等文字資訊,支持 HTML 格式
- histgram:可視化分布,主要是查看資料、引數的分布
- scatter:繪制散點圖
- bar:繪制柱狀圖
- pie:繪制餅狀圖
- 更過操作可以參考 visdom 的 GitHub 主頁
本節主要介紹深度學習中常見的 line、immage 和 text 的操作,
注:visdom 同時支持 torch 的 tensor 和 numpy 的 ndarray 兩種資料結構,但不支持 python 的 int 和 float 等資料型別,因此每次傳入時都需要先把資料轉成 ndarray 或 tensor,
上述操作的引數一般不同,但有兩個引數時絕大多數操作都具備的:
- win:用于指定 pane 的名字,如果不指定,visdom 將自動分配一個新的 pane,如果兩次操作指定的 pane 的名字一樣,則后者會覆寫前者,因此建議每次操作都指定 win
- opts:用來可視化配置,接收一個字典,常見的 option 包括 title、xlabel、ylabel、width 等,主要用于設定 pane 的顯示格式
3.3 visdom.line 可視化和 update 操作
之前說過,每次操作都會覆寫之前的數值,但我們在訓練程序中往往需要不斷更新數值,如損失值等,這個時候就需要指定引數 update='append' 來避免覆寫之前的數值,
# append 追加資料
for ii in range(0, 10):
# y = x
x = t.Tensor([ii])
y = x
vis.line(X=x, Y=y, win='polynomial', update='append' if ii > 0 else None)
# updateTrace 新增一條線,由于使用了update='append',不會覆寫原來的資料
x = t.arange(0, 9, 0.1)
y = (x**2) / 9
vis.line(X=x,
Y=y,
win='polynomial',
name='this is a new Trace',
update='append')
'polynomial'

3.4 visdom.image(images) 可視化
images 的畫圖功能可分為如下兩類:
- image 接收一個二維或三維向量,H×W 或 3×H×W,前者是黑白影像,后者是彩色影像
- images 接收一個四維向量 N×C×H×W,C 可以是 1 或 3,分別代表黑白和彩色影像,可實作類似 torchvision 中 make_grid 的功能,可以讓多張圖片拼接在一起,images 也可以接收一個二維或三維的向量,此時它所實作的功能和 image 一致
# 可視化一張隨機的黑白圖片
vis.image(t.randn(64, 64).numpy())
# 可視化一張隨機的彩色圖片
vis.image(t.randn(3, 64, 64).numpy(), win='random2')
# 可視化 36 張隨機的彩色圖片,每一行 6 張
vis.images(t.randn(36, 3, 64, 64).numpy(),
nrow=6,
win='random3',
opts={'title': 'random_imgs'})
'random3'
3.5 visdom.text 可視化
vis.text 用于可視化文本,它支持所有的 html 標簽,同時也遵循著 html 的語法標準,下面舉例說明,
text = u'''
<h1>Hello visdom</h1><br>
Nick 是不是<b>最帥的</b><br>
……是的'''
vis.text(text=text, win='visdom', opts={'title': u'visdom 和 nick'})
'visdom'

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/281396.html
標籤:其他
