Visdom可視化Pytorch訓練過程
使用 visdom 可視化 pytorch 訓練過程。
visdom
Visdom 是支援 torch 和 Numpy 實時數據可視化工具。Support by feakbooksearch 。
可視化介面如下:
Preparation
- 安裝:
pip install visdom
- 啟動:
python -m visdom.server
- 瀏覽器進入//localhost:8097
Practice
-
utils.py
import numpy as np from visdom import Visdom class VisdomLinePlotter(object): """Plots to Visdom""" def __init__(self, env_name='main'): self.viz = Visdom() self.env = env_name self.plots = {} def plot(self, var_name, mode_name, title_name, x, y): if var_name not in self.plots: self.plots[var_name] = self.viz.line(X=np.array([x]), Y=np.array([y]), env=self.env, opts=dict( legend=[mode_name], # 每條曲線指定名字 title=title_name, xlabel='Batchs', # 橫坐標名稱 ylabel=var_name )) else: self.viz.line(X=np.array([x]), Y=np.array([y]), env=self.env, win=self.plots[var_name], name=mode_name, update='append')
Notes:
- Visdom 默認環境為「main」,如果要同時或者先後訓練不同的網路模型,可以為每個模型創建一個環境,分別顯示它們的可視化結果,如
viz = Visdom(env = 'demo')
var_name
: 變數名稱 (e.g.loss
,acc
)mode_name
: mode name (e.g.train
,val
)title_name
: 圖例標題 (e.g.Classification Accuracy
)update
: Use'append'
to append data,'replace'
to use new data, or'remove'
to remove the trace specified byname
.
- Visdom 默認環境為「main」,如果要同時或者先後訓練不同的網路模型,可以為每個模型創建一個環境,分別顯示它們的可視化結果,如
-
train.py
import utils if __name__ == "__main__": global plotter plotter = utils.VisdomLinePlotter(env_name='Tutorial Plots') def train(): ...... plotter.plot('reward', 'train', 'Rewards', train_batch_num, reward.avg) def val(): ...... plotter.plot('reward', 'val', 'Rewards', val_batch_num, reward.avg) plotter.plot('acc', 'val', 'Accurarys', val_batch_num, acc.avg)
-
main
(main.py)和train
(train.py)不在同一文件時全局變數(global
)的設置- 問題定義:global 定義的全局變數只能在同一個文件中使用,在工程中需要跨文件調用全局變數。
-
定義一個全局變數管理文件 globalvar.py
def _init(): global _global_dict _global_dict = {} def set_value(key,value): """ 定義一個全局變數 """ _global_dict[key] = value def get_value(key,defValue=None): """ 獲得一個全局變數,不存在則返回默認值 """ try: return _global_dict[key] except KeyError: return defValue
-
import globalvar
import utils import globalvar as gl def visual(self, env_name): gl._init() plotter = utils.VisdomLinePlotter(env_name=env_name) gl.set_value(env_name, plotter) return gl.get_value(env_name) def train(): ...... plotter = visual(env_name='Tutorial Plots') plotter.plot('reward', 'train', 'Rewards', train_batch_num, reward.avg)
Remote Server (未測試)
連接 SSH 時,將伺服器的 8097 埠重定向到自己機器上來:
ssh -L 18097:127.0.0.1:8097 username@remote_server_ip
其中:18097:127.0.0.1 代表自己機器上的 18097 號埠,8097 是伺服器上 visdom 使用的埠。
在伺服器上使用 8097 埠正常啟動 visdom:
python -m visdom.server
在本地瀏覽器中輸入地址:
127.0.0.1:18097