更新:新版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
更多細節請參看官網