1. 程式人生 > >visdom的安裝及在pytorch下損失函式的視覺化應用

visdom的安裝及在pytorch下損失函式的視覺化應用

更新:新版visdom0.1.7安裝方式為:conda install -c srivasv visdom 

pytorch下可採用visidom作為視覺化工具

1. 安裝

pip install visdom
conda install visdom

啟動 

python -m visdom.server

在瀏覽器輸入:http://localhost:8097/,即可啟動

Note:

(1)有時安裝了之後不能用,比如網頁什麼都沒有,可嘗試替換 Anaconda3\Lib\site-packages\visdom下的static資料夾(如果你用anaconda的話),是因為網路的原因,導致檔案下載不全,檔案連結連結:https://pan.baidu.com/s/1c4liqoK 

密碼:q1sx,在Linux(Ubuntu)下也是同樣的處理,在Lib\site-packages\visdom下替換static檔案,重啟生效!!!!

(2)有時候啟動visdom的時候,顯示目標計算機拒絕等網路連線不成功,可用如下測試

from visdom import Visdom
viz = Visdom()
assert viz.check_connection()

主要是我是用了代理上網,導致我的IE瀏覽器的Internet選項被改變,如下圖:

2. 視覺化損失函式的示例

首先介紹一下visdom中的line()函式:

1) 畫一條直線

from visdom import Visdom
import numpy as np
viz = Visdom(env='my_wind')#設定環境視窗的名稱是'my_wind',如果不設定名稱就在main中
tr_loss=list(range(100))
viz.line(Y=np.array(tr_loss), opts=dict(showlegend=True))

在執行上面的程式之前,首先啟動visdom,在cmd裡輸入python -m visdom.server,然後在瀏覽器裡輸入:http://localhost:8097/,預設是在main環境下:

上面的程式碼裡,我們設定環境視窗的名稱是'my_wind',所以我們需要開啟my_wind環境,如下:

執行程式碼!

2) 如果要畫多條直線

from visdom import Visdom
import numpy as np
viz = Visdom(env='my_wind')#設定環境視窗的名稱是'my_wind',如果不設定名稱就在main中
tr_loss=list(range(100))
ts_loss=list(range(10,110))
viz.line(Y=np.column_stack((np.array(tr_loss),np.array(ts_loss))), opts=dict(showlegend=True))

注意:以上變數的值在繪製前是確定了的

3)如果要繪製隨程式執行逐漸產生的值,如在訓練的時候,可以採用line的update方法

from visdom import Visdom
import numpy as np
viz = Visdom(env='my_wind')
x,y=0,0
win = viz.line(
    X=np.array([x]),
    Y=np.array([y]),
    opts=dict(title='two_lines'))
for i in range(10):
    x+=i
    y+=i
    viz.line(
        X=np.array([x]),
        Y=np.array([y]),
        win=win,#win要保持一致
        update='append')

最後是深度學習訓練過程中的損失函式視覺化,參考的是pytorch實戰指南裡的視覺化操作。

將損失函式的視覺化放在visual_loss.py檔案:

#coding:utf8
import visdom
import time
import numpy as np

class Visualizer(object):
    def __init__(self, env='default', **kwargs):
        self.vis = visdom.Visdom(env=env, **kwargs)
        self.index = {}         
    def plot_many_stack(self, d):
        '''
        self.plot('loss',1.00)
        '''
        name=list(d.keys())
        name_total=" ".join(name)
        x = self.index.get(name_total, 0)
        val=list(d.values())
        if len(val)==1:
            y=np.array(val)
        else:
            y=np.array(val).reshape(-1,len(val))
        #print(x)
        self.vis.line(Y=y,X=np.ones(y.shape)*x,
                    win=str(name_total),#unicode
                    opts=dict(legend=name,
                        title=name_total),
                    update=None if x == 0 else 'append'
                    )
        self.index[name_total] = x + 1            

在jupyter notebook——loss_visual_test.ipynb中進行函式功能測試:

from visual_loss import Visualizer
from torchnet import meter
#用 torchnet來存放損失函式,如果沒有,請安裝conda install torchnet
'''
訓練前的模型、損失函式設定 
vis = Visualizer(env='my_wind')#為了視覺化增加的內容
loss_meter = meter.AverageValueMeter()#為了視覺化增加的內容

for epoch in range(10):
    #每個epoch開始前,將存放的loss清除,重新開始記錄
    loss_meter.reset()#為了視覺化增加的內容
    model.train()
    for ii,(data,label)in enumerate(trainloader):     
        ...
        out=model(input)
        loss=...
        loss_meter.add(loss.data[0])#為了視覺化增加的內容
        
    #loss視覺化
    #loss_meter.value()[0]返回存放的loss的均值
    vis.plot_many_stack({'train_loss': loss_meter.value()[0]})#為了視覺化增加的內容    
'''
#示例
vis = Visualizer(env='my_wind')#為了視覺化增加的內容
loss_meter = meter.AverageValueMeter()#為了視覺化增加的內容
for epoch in range(10):
    loss_meter.reset()#為了視覺化增加的內容
    loss_meter.add(epoch)#假設loss=epoch
    vis.plot_many_stack({'train_loss': loss_meter.value()[0]})#為了視覺化增加的內容 
    #如果還想同時顯示test loss,如法炮製,並用字典的形式賦值,如下。還可以同時顯示train和test accuracy
    #vis.plot_many_stack({'train_loss': loss_meter.value()[0],'test_loss':test_loss_meter.value()[0]})#為了視覺化增加的內容 

檔案結構:

其中__init__.py為空

注意:我的visdom版本為

也不知道用的是哪個,通過conda install visdom安裝的版本比較舊,官網的最新版本是

安裝方式是在終端輸入

conda install -c srivasv visdom 
 

更多細節請參看官網