Visdom可視化Pytorch訓練過程

使用visdom可視化pytorch訓練過程,原文見Tmylla’s Blog

visdom

Visdom是支持torch和Numpy實時數據可視化工具。Support by feakbooksearch

可視化界面如下:

在這裏插入圖片描述

Preparation

  • 安裝:pip install visdom
  • 啓動:python -m visdom.server
    • 瀏覽器進入http://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 by name.
  • 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定義的全局變量只能在同一個文件中使用,在工程中需要跨文件調用全局變量。
    1. 定義一個全局變量管理文件 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
      
    2. 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

More details

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章