visdom使用技巧


Visdom PyTorch可視化工具

本文翻譯的時候把 略去了 Torch部分。

項目地址

一個靈活的可視化工具,可用來對於 實時,富數據的 創建,組織和共享。支持TorchNumpy

總覽

Visdom目的是促進遠程數據的可視化,重點是支持科學實驗。。

向您和您的合作者發送可視化 圖像,圖片和文本。

img

通過編程組織您的可視化空間,或者通過UI為實時數據創建dashboards,檢查實驗的結果,或者debug實驗代碼。

demo

基本概念

Visdom有一組簡單的特性,可以用它們組合成不同的用例。

Panes(窗格)

img

UI剛開始是個白板–您可以用圖像,圖片,文本填充它。這些填充的數據出現在 Panes 中,您可以這些Panes進行 拖放,刪除,調整大小和銷毀操作。Panes是保存在 envs 中的, envs的狀態 存儲在會話之間。您可以下載Panes中的內容–包括您在svg中的繪圖。

Tip: 您可以使用瀏覽器的放大縮小功能來調整UI的大小。

Environments(環境)

img

您可以使用envs對可視化空間進行分區。默認地,每個用戶都會有一個叫做mainenvs。可以通過編程或UI創建新的envsenvs的狀態是長期保存的。

您可以通過 url: http://localhost.com:8097/env/main訪問特定的env
You can access a specific env via url: http://localhost.com:8097/env/main. 如果您的服務器是被托管的,那么您可以將此url分享給其他人,那么其他人也會看到您的可視化結果。

管理 Envs:
在初始化服務器的時候,您的 envs 默認通過$HOME/.visdom/ 加載。您也可以將自定義的路徑 當作命令行參數 傳入。如果您移除了Env文件夾下的.json文件,那么相應的環境也會被刪除。

State(狀態)

一旦您創建了一些可視化,狀態是被保存的。服務器自動緩存您的可視化–如果您重新加載網頁,您的可視化會重新出現。

img

  • Save: 你可以手動的保存env通過點擊save按鈕。它會首先序列化env的狀態,然后以json文件的形式保存到硬盤上,包括窗口的位置。 同樣,您也可以通過編程來實現env的保存。

    當面對一些十分復雜的可視化,例如參數設置非常重要,這中保存env狀態的方法是十分有用的。例:數據豐富的演示,模型的訓練 dashboard, 或者 系統實驗。這種設計依舊可以使這些可視化十分容易分享和復用。

  • Fork: 有過您輸入了一個新的env 名字,saving會建立一個心的env – 有效的forking之前的狀態。(注:這個fork等價於github的fork,跟復制的意思差不多)

Setup

需要 Python 2.7/3 (and optionally Torch7)

# Install Python server and client,如果您使用python的話,裝這一個就可以了。
pip install visdom

123

啟動

啟動服務器(可能在screen或者tmux中):

python -m visdom.server

一旦啟動服務器,您就可以通過在瀏覽器中輸入http://localhost:8097來訪問 Visdomlocalhost可以換成您的托管地址。

If the above does not work, try using an SSH tunnel to your server by adding the following line to your local ~/.ssh/config:
LocalForward 127.0.0.1:8097 127.0.0.1:8097.

Python example

import visdom
import numpy as np
vis = visdom.Visdom()
vis.text('Hello, world!')
vis.image(np.ones((3, 10, 10)))

Demos

python example/demo.py

可視化接口

Visdom支持下列API。由visly提供可視化支持。

  • vis.scatter : 2D 或 3D 散點圖
  • vis.line : 線圖
  • vis.stem : 莖葉圖
  • vis.heatmap : 熱力圖
  • vis.bar : 條形圖
  • vis.histogram: 直方圖
  • vis.boxvis : 箱型圖
  • vis.surf : 表面圖
  • vis.contour : 輪廓圖
  • vis.quiver : 繪出二維矢量場
  • vis.image : 圖片
  • vis.text : 文本
  • vis.mesh : 網格圖
  • vis.save : 序列化狀態

關於上述API更詳盡的解釋將在下面給出。為了對visdom的能力有一個快速的了解,您可以看一下 example ,或者,您可以繼續往下看。

這些API的確切輸入類型有所不同,盡管大多數API 的輸入包含,一個tensor X(保存數據)和一個可選的tensor Y(保存標簽或者時間戳)。所有的繪圖函數都接收一個可選參數win,用來將圖畫到一個特定的window上。每個繪圖函數也會返回當前繪圖的win。您也可以指定 匯出的圖添加到哪個env上。
(這里的window的意思就是之前說的Pane)。

畫圖的方法的接口一般是 vis.some_func(X,Y, opts={})

  • opts存放當前pane的一些簡單設置,下面的是比較通用的一些配置
    • options.title
    • options.xlabel
    • options.ylabel

vis.scatter

這個函數是用來畫2D3D數據的散點圖。它需要輸入 N*2N*3的 tensor X來指定N個點的位置。一個可供選擇的長度為Nvector用來保存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 是一個包含整數值的TensorTensor的形狀可以是 NN x 3KK 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 and K x 3: 為每個類別指定顏色,不是為每個點指定顏色。

vis.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

vis.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

vis.heatmap

這個函數用來畫熱力圖。它輸入一個 形狀為N×M的 tensor XX指定了熱力圖中位置的值。

支持下列特定選項:

  • 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

vis.bar

這個函數可以畫 正常的,堆起來的,或分組的的條形圖。
輸入參數:

  • X(tensor):形狀 NN×M,指定每個條的高度。如果XM列,那么每行的值可以看作一組或者把他們值堆起來(取決與options.stacked是否為True)。
  • Y(tensor, optional):形狀 N,指定對應的x軸的值。

支持以下特定選項:

  • options.columnnames: table containing x-axis labels
  • options.stacked : stack multiple columns in X
  • options.legend : table containing legend labels

例子

from visdom import Visdom
import numpy as np
 
viz = Visdom(env='exp')
viz.bar(X=np.random.rand(4, 2),
        opts=dict(
        stacked=False,
        legend=['FC', 'POOL5'], 
        rownames=['top-1', 'top5', 'top10', 'top20'],
        title='Test',
        ylabel='rank-k  Error Rate',  # y軸名稱
        xtickmin=0.4,   # x軸左端點起始位置
        xtickstep=0.4   # 每個柱形間隔距離
    ))

img

vis.histogram

這個函數用來畫指定數據的直方圖。他需要輸入長度為 N 的 tensor XX保存了構建直方圖的值。

支持下面特定選項:

  • options.numbins: bins的個數 (number; default = 30)

vis.boxvis

這個函數用來畫箱型圖:

輸入:

  • X(tensor): 形狀 NN×M,指定做第m個箱型圖的N個值。

支持以下特定選項:

  • options.legend: labels for each of the columns in X

vis.surf

這個函數用來畫表面圖:
輸入:

  • 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())

vis.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())

vis.quiver

這個函數用來畫二維矢量場圖。

輸入:

  • X(tensor): 形狀 N*M
  • Y(tensor):形狀 N*M
  • gridX(tensor, optional):形狀 N*M
  • gradY(tensor, optional): 形狀 N*M
    XY決定了 箭頭的長度和方向。可選的gridXgridY指定了偏移。

支持下列特定選項:

  • options.normalize: 最長肩頭的長度 (number)
  • options.arrowheads: 是否現實箭頭 (boolean; default = true)

vis.image

這個函數用來畫 圖片。
輸入:

  • img(tensor): shape(C*H*W)。

支持下面特定選項:

  • options.jpgquality: JPG quality (number 0-100; default = 100)

vis.video

這個函數 播放一個 video
輸入: video 的文件名,或者是一個 shape 為L*H*W*Ctensor。這個函數不支持其它特定的功能選項。

注意:使用tensor作為輸入的時候,需要安裝ffmpeg
能不能播放video取決你使用的瀏覽器:瀏覽器必須要支持Theano codec in an OGG container。(chrome可以用)。

vis.svg

此函數繪制一個SVG對象。輸入是一個SVG字符串或 一個SVG文件的名稱。該功能不支持任何特定的功能
options

vis.text

此函數可在文本框中打印文本。輸入輸入一個text字符串。目前不支持特定的options

vis.mesh

此函數畫出一個網格圖。

輸入:

  • X(tensor): shape(N*2N*3) 定義N個頂點
  • Y(tensor, optional):shape(M*2M×3) 定義多邊形

支持下列特定選項:

  • options.color: color (string)
  • options.opacity: 多邊形的不透明性 (number between 0 and 1)

Customizing vis

繪圖函數使用可選的options表作為輸入。用它來修改默認的繪圖屬性。所有輸入參數在單個表中指定;輸入參數是基於輸入表中鍵的匹配。

下列的選項除了對於vis.imgvis.txt不可用以外,其他的繪圖函數都適用。我們稱他為 通用選項。

  • options.title : figure title
  • options.width : figure width
  • options.height : figure height
  • options.showlegend : show legend (true or false)
  • options.xtype : type of x-axis ('linear' or 'log')
  • options.xlabel : label of x-axis
  • options.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-axis
  • options.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介紹的時候已經提到過。

保存可視化數據

可視化的時候,可以設置log_to_filename屬性進行保存數據

demo代碼如下:

vis = Visdom(env="demo", log_to_filename="./visdom.log")
vis.bar(
    X=np.random.rand(20, 3),
    Y=np.arange(0, 20),
    opts=dict(
        stacked=False,
        legend=['The Netherlands', 'France', 'United States']
    )
)

如果要重新可視化保存的數據,則直接運行

Visdom.replay_log(log_filename="./visdom.log")

這樣在啟動visdom服務時即可看到之前可視化的數據

動態的變化增長的圖

隨時間動態增長的visdom圖

典型的例子如:創建追蹤loss變化的圖。

用法:update選項設置為“append”

舉例

track_loss = 0 #for draw graph
global_step = 0
vis = visdom.Visdom(env=u"train_loss")
win = vis.line(X = np.array([global_step]), Y = np.array([track_loss]))
 
for epoch in range(cfg.epoch_num):
    # 此處省略代碼
 
    for iter_num, dial_batch in enumerate(data_iterator):
        # 此處省略代碼
        loss = some_function() 
        vis.line(X = np.array([global_step]), Y = np.array([loss.data[0]]), win = win,                
                 update = 'append')  # for draw graph
        global_step += 1

總結

明確幾個名詞:

  • env:看作一個大容器,在代碼中是 vis=visdom.Visdom(env=''main)
  • pane: 就是用於繪圖的小窗口,在代碼中叫 window

使用Visdom就是在env中的pane上畫圖。

參考文章


免責聲明!

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



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