visdom 使用指南

原文:https://blog.csdn.net/LXX516/article/details/79019328  
 

启动

python -m visdom.server

在浏览器输入:http://localhost:8097/,即可启动


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
 

更多细节请参看官网

猜你喜欢

转载自blog.csdn.net/jialibang/article/details/84836811
今日推荐