0703-可視化工具tensorboard和visdom


0703-可視化工具tensorboard和visdom

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 的安裝主要分為以下兩步:

  1. 安裝 TensorFlow:建議安裝 tf 的 cpu-only 版本,具體安裝教程參考 TensorFlow 官方文檔 - pip 安裝
  2. 安裝 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 中有以下兩個重要概念:

  1. env:環境。不同環境的可視化結果相互隔離,互不影響,使用的時候如果不指定 env,默認使用 main。不同用戶、不同的程序一般使用不同的 env。
  2. 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 時有兩點需要注意的地方:

  1. 需要手動指定保存 env,可以在 Web 界面單擊 “save” 按鈕或在程序中調用 save 方法,否則 visdom 服務重啟后,env 等信息會丟失
  2. 客戶端和服務器之間的交互采用 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'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM