Pytorch求索(2): Pytorch使用visdom進行視覺化
Pytorch使用visdom進行視覺化
文章目錄
visdom介紹
visdom是Facebook專門為Pytorch開發的一款視覺化工具,開源於2017年3月,專案地址為visdom,其十分輕量級,但功能豐富,提供了大多數的科學運算視覺化API,基本視覺化介面如下圖所示:
visdom支援多種資料格式的視覺化,包括數值、影象、文字以及視訊等,支援Pytorch、Torch和Numpy。使用者可以通過程式設計的方式組織視覺化空間或者通過使用者介面為資料打造儀表板,檢查實驗結果和除錯程式碼。
visdom核心概念
-
env:環境
可以使用
envs
對視覺化空間進行分割槽。預設地,每個使用者都會有一個叫做main
的envs
。可以通過程式設計或UI
建立新的envs
。envs
的狀態是長期儲存的。不同環境的視覺化結果相互隔離,互不影響。在使用時如果不指定env,預設使用main。不同使用者、不同程式,最好使用不同的env,避免相互影響。 -
pane:窗格
窗格用於視覺化影象、數值或文字等,它可以自由拖動、縮放、儲存和關閉。類似於一個一個的小的視窗。一個程式可以使用同一個env中的不同pane,每個pane視覺化記錄某一資訊。
visdom安裝與使用
visdom安裝十分簡單,可以直接pip進行安裝
pip install visdom
安裝好以後,需要啟動visdom服務
python -m visdom.server
或者(後臺執行)
nohup python -m visdom.server &
visdom服務是一個Web Server服務,預設繫結8097埠。
基本使用,程式設計程式碼如下:
import visdom
import torch
# 新建一個連線客戶端
# 指定env = 'test1'
vis = visdom.Visdom(env='test1')
x = torch.arange(1, 100, 0.01)
y = torch.sin(x)
vis.line(X=x,Y=y, win='sinx',opts={'title':'y=sin(x)'})
開啟瀏覽器,輸入localhost:8097,如下圖所示:
選擇我們新建的env環境:
可以看到我們繪製的影象:
對於每一個影象,其佔用一個panel,都可以自由移動、縮放等
注意:
這些不會自動儲存,需要手動儲存save,不然會清空
常用API
Visdom
支援下列API
。由Plotly提供視覺化支援。
vis.scatter
: 2D 或 3D 散點圖vis.line
: 線圖vis.stem
: 莖葉圖vis.heatmap
: 熱力圖vis.bar
: 條形圖vis.histogram
: 直方圖vis.boxplot
: 箱型圖vis.surf
: 表面圖vis.contour
: 輪廓圖vis.quiver
: 繪出二維向量場vis.image
: 圖片vis.text
: 文字vis.mesh
: 網格圖vis.save
: 序列化狀態
plot.scatter
這個函式是用來畫2D
或3D
資料的散點圖。它需要輸入 N*2
或N*3
的 tensor X
來指定N
個點的位置。一個可供選擇的長度為N
的vector
用來儲存X
中的點對應的標籤(1 到 K)。 – 標籤可以通過點的顏色反應出來。
scatter()
支援下列的選項:
options.colormap
: 色圖(控制圖的顏色) (string
; default ='Viridis'
)options.markersymbol
: 標記符號 (string
; default ='dot'
)options.markersize
: 標記大小(number
; default ='10'
)options.markercolor
: 每個標記的顏色. (torch.*Tensor
; default =nil
)options.legend
: 包含圖例名字的table
options.markercolor
是一個包含整數值的Tensor
。Tensor
的形狀可以是 N
或 N x 3
或 K
或 K x 3
.
- Tensor of size
N
: 表示每個點的單通道顏色強度。 0 = black, 255 = red - Tensor of size
N x 3
: 用三通道表示每個點的顏色。 0,0,0 = black, 255,255,255 = white - Tensor of size
K
andK x 3
: 為每個類別指定顏色,不是為每個點指定顏色。
plot.line
這個函式用來畫 線圖。它需要一個形狀為N
或者N×M
的tensor Y
,用來指定 M
條線的值(每條線上有N
個點)。和一個可供選擇的 tensor X
用來指定對應的 x軸的值; X
可以是一個長度為N
的tensor(這種情況下,M條線共享同一個 x軸),也可以是形狀和Y
一樣的tensor。
The following options
are supported:
options.fillarea
: 填充線下面的區域 (boolean
)options.colormap
: 色圖 (string
; default ='Viridis'
)options.markers
: 顯示點標記 (boolean
; default =false
)options.markersymbol
: 標記的形狀 (string
; default ='dot'
)options.markersize
: 標記的大小 (number
; default ='10'
)options.legend
: 儲存圖例名字的table
plot.stem
這個函式用來畫莖葉圖。它需要一個 形狀為N
或者N*M
的 tensor X
來指定M
時間序列中N
個點的值。一個可選擇的Y
,形狀為N
或者N×M
,用Y
來指定時間戳,如果Y
的形狀是N
,那麼預設M
時間序列共享同一個時間戳。
支援以下特定選項:
options.colormap
: colormap (string
; default ='Viridis'
)options.legend
:table
containing legend names
plot.heatmap
這個函式用來畫熱力圖。它輸入一個 形狀為N×M
的 tensor X
。X
指定了熱力圖中位置的值。
支援下列特定選項:
options.colormap
: 色圖 (string
; default ='Viridis'
)options.xmin
: 小於這個值的會被剪下成這個值(number
; default =X:min()
)options.xmax
: 大於這個值的會被剪下成這個值 (number
; default =X:max()
)options.columnnames
: 包含x軸標籤的table
options.rownames
: 包含y軸標籤的table
plot.bar
這個函式可以畫 正常的,堆起來的,或分組的的條形圖。
輸入引數:
- X(tensor):形狀
N
或N×M
,指定每個條的高度。如果X
有M
列,那麼每行的值可以看作一組或者把他們值堆起來(取決與options.stacked
是否為True)。 - Y(tensor, optional):形狀
N
,指定對應的x軸的值。
支援以下特定選項:
options.columnnames
:table
containing x-axis labelsoptions.stacked
: stack multiple columns inX
options.legend
:table
containing legend labels
plot.histogram
這個函式用來畫指定資料的直方圖。他需要輸入長度為 N
的 tensor X
。X
儲存了構建直方圖的值。
支援下面特定選項:
options.numbins
:bins
的個數 (number
; default = 30)
plot.boxplot
這個函式用來畫箱型圖:
輸入:
- X(tensor): 形狀
N
或N×M
,指定做第m
個箱型圖的N
個值。
支援以下特定選項:
options.legend
: labels for each of the columns inX
plot.surf
shiyong
這個函式用來畫表面圖:
輸入:
- X(tensor):形狀
N×M
,指定表面圖上位置的值.
支援以下特定選項:
options.colormap
: colormap (string
; default ='Viridis'
)options.xmin
: clip minimum value (number
; default =X:min()
)options.xmax
: clip maximum value (number
; default =X:max()
)
plot.contour
這個函式用來畫輪廓圖。
輸入:
- X(tensor):形狀
N×M
,指定了輪廓圖中的值
支援以下特定選項:
options.colormap
: colormap (string
; default ='Viridis'
)options.xmin
: clip minimum value (number
; default =X:min()
)options.xmax
: clip maximum value (number
; default =X:max()
)
plot.quiver
這個函式用來畫二維向量場圖。
輸入:
- X(tensor): 形狀
N*M
- Y(tensor):形狀
N*M
- gridX(tensor, optional):形狀
N*M
- gradY(tensor, optional): 形狀
N*M
X
與Y
決定了 箭頭的長度和方向。可選的gridX
和gridY
指定了偏移。
支援下列特定選項:
options.normalize
: 最長肩頭的長度 (number
)options.arrowheads
: 是否現實箭頭 (boolean
; default =true
)
plot.image
這個函式用來畫 圖片。
輸入:
- img(tensor): shape(
C*H*W
)。
支援下面特定選項:
options.jpgquality
: JPG quality (number
0-100; default = 100)
plot.video
這個函式 播放一個 video
。
輸入: video
的檔名,或者是一個 shape 為L*H*W*C
的 tensor
。這個函式不支援其它特定的功能選項。
注意:使用tensor
作為輸入的時候,需要安裝ffmpeg
。
能不能播放video
取決你使用的瀏覽器:瀏覽器必須要支援Theano codec in an OGG container
。(chrome可以用)。
plot.svg
此函式繪製一個SVG
物件。輸入是一個SVG
字串或 一個SVG
檔案的名稱。該功能不支援任何特定的功能
options
。
plot.text
此函式可在文字框中列印文字。輸入輸入一個text
字串。目前不支援特定的options
plot.mesh
此函式畫出一個網格圖。
輸入:
- X(tensor): shape(
N*2
或N*3
) 定義N
個頂點 - Y(tensor, optional):shape(
M*2
或M×3
) 定義多邊形
支援下列特定選項:
options.color
: color (string
)options.opacity
: 多邊形的不透明性 (number
between 0 and 1)
Customizing plots
繪圖函式使用可選的options
表作為輸入。用它來修改預設的繪圖屬性。所有輸入引數在單個表中指定;輸入引數是基於輸入表中鍵的匹配。
下列的選項除了對於plot.img
和plot.txt
不可用以外,其他的繪圖函式都適用。我們稱他為 通用選項。
options.title
: figure titleoptions.width
: figure widthoptions.height
: figure heightoptions.showlegend
: show legend (true
orfalse
)options.xtype
: type of x-axis ('linear'
or'log'
)options.xlabel
: label of x-axisoptions.xtick
: show ticks on x-axis (boolean
)options.xtickmin
: first tick on x-axis (number
)options.xtickmax
: last tick on x-axis (number
)options.xtickstep
: distances between ticks on x-axis (number
)options.ytype
: type of y-axis ('linear'
or'log'
)options.ylabel
: label of y-axisoptions.ytick
: show ticks on y-axis (boolean
)options.ytickmin
: first tick on y-axis (number
)options.ytickmax
: last tick on y-axis (number
)options.ytickstep
: distances between ticks on y-axis (number
)options.marginleft
: left margin (in pixels)options.marginright
: right margin (in pixels)options.margintop
: top margin (in pixels)options.marginbottom
: bottom margin (in pixels)
注意:
如果想在同一個圖中畫多個曲線,原來的API updateTrace已經廢棄了,可以直接在line等API加上update="append"即可
visdom底層
visdom服務是一個Web Server服務,客戶端與伺服器端通過tornado進行非阻塞互動,視覺化操作不會阻塞當前程式,網路異常也不會導致程式退出
參考
[1] 深度學習框架Pytorch:入門與實踐(陳雲著)
[2] 官方介紹:https://github.com/facebookresearch/visdom
[3] 部落格:pytorch學習筆記(八):PytTorch視覺化工具 visdom