visdom的安装及在pytorch下损失函数的可视化应用

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

pytorch下可采用visidom作为可视化工具

1. 安装

pip install visdomconda 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 Visdomviz = Visdom()assert viz.check_connection()

主要是我是用了代理上网,导致我的IE浏览器的Internet选项被改变,如下图:

2. 可视化损失函数的示例

首先介绍一下visdom中的line()函数:

1) 画一条直线

from visdom import Visdomimport numpy as npviz = 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 Visdomimport numpy as npviz = 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 Visdomimport numpy as npviz = Visdom(env='my_wind')x,y=0,0win = 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:utf8import visdomimport timeimport 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 Visualizerfrom 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 

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

编辑于

人工智障

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

译文 | 与TensorFlow的第一次接触 第六章:并发

第一版TensorFlow第一版发布于2015年11月,它可以运行在多台服务器的GPU上,同时并在其上面进行训练。2016年2月,更新版中增加了分布式与并发处理...

4207
来自专栏debugeeker的专栏

《coredump问题原理探究》windows版5.2节数组

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

1033
来自专栏debugeeker的专栏

《coredump问题原理探究》windows版9.2节dll hell导致的虚函数偏移

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

811
来自专栏搞前端的李蚊子

echarts柱状图标签显示不完全的问题

echarts 柱状图当x轴标签数目超过一定数目时在小尺寸设备上第一个和最后一个标签不显示(不是重叠),axisLabel设置interval:0也不起作用; ...

3823
来自专栏GAN&CV

深度学习优化器算法详解:梯度更新规则+缺点+如何选择

转载自:https://mp.weixin.qq.com/s/RZc1PUgZs1BqRPeyBmTELA

3432
来自专栏小L的魔法馆

C++定义一个简单的Computer类

4946
来自专栏xingoo, 一个梦想做发明家的程序员

汇编语言 手记7

CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址; 在8086PC中,内存地址由段地址和偏移地址组成。 8086CPU中有一个DS寄存器,通常用来存...

2159
来自专栏Deep learning进阶路

caffe随记(六)---tools工具举例

经过前面几篇博文的介绍,我们已经对caffe有了个大概的了解,知道它的数据结构,而且也尝试了caffe的Hello World---mnist例程。 前一篇博文...

2220
来自专栏专知

基于网页的图像标注工具——imglab

【导读】imglab是一种基于Web的工具,用于标记可用于训练dlib或其他对象检测器的对象的图像。

1.1K3
来自专栏xingoo, 一个梦想做发明家的程序员

汇编语言 手记4

简单的汇编指令 ? CPU执行后,寄存器中的数据改变为如下: ? CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。 ...

1935

扫码关注云+社区

领取腾讯云代金券