0703-可視化工具tensorboard和visdom

0703-可視化工具tensorboard和visdom

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

1、可視化工具概述

當咱們訓練神經網絡的時候,咱們可能但願更加直觀地瞭解訓練狀況,包括損失曲線、輸入圖片、輸出圖片、卷積核的參數分佈等信息。這些信息能幫咱們更好地監督網絡的訓練過程,而且可以爲參數優化提供方向和數據。python

以往咱們都是經過 print 打印輸出,可是隻能打印信息,而且不少數據不夠直觀。本節咱們將介紹兩個深度學習中經常使用的可視化工具——TensorBoard 和 visdom,它們能更直觀的體現不少信息。git

2、TensorBoard

TensorBoard 起初是 做爲 TensorFlow 的可視化工具迅速流行開的,做爲和 tf 深度集成的工具,tensorboard 可以展示 tf 的網絡計算圖,繪製圖像生成定量指標圖及附加數據,界面以下圖所示:github

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

雖然 TensorBoard 和 tf 深度集成,可是 TensorBoard 是一個相對獨立的工具,只要用戶保存的數據遵循相應的格式,tensorboard 就能讀取這些數據並進行可視化。編程

接下來將會介紹如何在 torch 中使用 tensorboard_logger 進行訓練損失的可視化。json

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> 是當前運行文件所屬的文件夾。markdown

下面舉例來講明 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>),便可以看到如圖所示的結果:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

上圖左側的 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 徹底同樣的功能,而且使用接口更加簡單,有興趣的同窗能夠自行學習。

3、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 另存爲新文件。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

經過命令 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'
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

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'