0703-視覺化工具tensorboard和visdom

二十三歲的有德發表於2021-04-29

0703-視覺化工具tensorboard和visdom

pytorch完整教程目錄:https://www.cnblogs.com/nickchen121/p/14662511.html

一、視覺化工具概述

當我們訓練神經網路的時候,我們可能希望更加直觀地瞭解訓練情況,包括損失曲線、輸入圖片、輸出圖片、卷積核的引數分佈等資訊。這些資訊能幫我們更好地監督網路的訓練過程,並且能夠為引數優化提供方向和資料。

以往我們都是通過 print 列印輸出,但是隻能列印資訊,並且很多資料不夠直觀。本節我們將介紹兩個深度學習中常用的視覺化工具——TensorBoard 和 visdom,它們能更直觀的體現很多資訊。

二、TensorBoard

TensorBoard 起初是 作為 TensorFlow 的視覺化工具迅速流行開的,作為和 tf 深度整合的工具,tensorboard 能夠展現 tf 的網路計算圖,繪製影像生成定量指標圖及附加資料,介面如下圖所示:

0703-視覺化工具tensorboard和visdom

雖然 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>),即可以看到如圖所示的結果:

0703-視覺化工具tensorboard和visdom

上圖左側的 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 另存為新檔案。

0703-視覺化工具tensorboard和visdom

通過命令 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'
0703-視覺化工具tensorboard和visdom

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'

相關文章