在训练CNN模型时候,一般需要实时打印出Loss, Accuracy等数值,这样我们大概可以判断模型是否收敛,准确度如何。但是只打印Loss的方法不太直观,为此需要将Loss,Accuracy等数值用曲线显示出来。

visdom是Facebook专门为Pytorch开发的一款可视化工具,开源于2017年3月,项目地址为visdom,其十分轻量级,但功能丰富,提供了大多数的科学运算可视化API

     visdom运行效率比tensorboard高。tensorboard是30s刷新一次,visdom是1s刷新一次

visdom支持多种数据格式的可视化,包括数值、图像、文本以及视频等,支持Pytorch、Torch和Numpy。用户可以通过编程的方式组织可视化空间或者通过用户接口为数据打造仪表板,检查实验结果和调试代码

visdom本质是一个web服务器,开启之后,程序向web服务器丢数据,web服务器把数据渲染到网页上。客户端与服务器间通过tornado进行非阻塞交互。

所以程序运行前就要开启visdom

启动

python -m visdom.server

刚打开是这个样子

启动好了之后,只要以后在程序中调用visdom库,就会与web服务器交互了

指定端口

python -m visdom.server -p 2019

这就是指定了2019端口

程序中使用

#初始化
viz = Visdom()
viz.line([0.],[0.], win='train_loss', opts=dict(title='train loss'))#forward循环中添加
viz.line([loss.item()], [iters], win='train_loss', update='append')

win一定要和初始化时候的win对应

如果指定了其他端口,在程序中也一定要指明端口

viz = Visdom(port=8098)

不然程序会默认8097

同一图中画多条线

viz = Visdom()
visdom_win = 'DAN_contra_from_scratch' #窗口命名
viz.line([[0.0, 0.0, 0.0]], [0.], win=visdim_win, opts=dict(title=visdom_win,legend=['total_loss', 'rec_loss', 'contra_loss']#在程序中
viz.line([[x,y,z]], [self.iters], win=(visdom_win, update='append')

visdom核心概念

  • env:环境

看作一个大容器

可以使用envs对可视化空间进行分区。默认地,每个用户都会有一个叫做mainenvs。可以通过编程或UI创建新的envsenvs的状态是长期保存的。不同环境的可视化结果相互隔离,互不影响。在使用时如果不指定env,默认使用main。不同用户、不同程序,最好使用不同的env,避免相互影响。

  • pane:窗格

    就是用于绘图的小窗口,在代码中叫 window。

       窗格用于可视化图像、数值或文本等,它可以自由拖动、缩放、保存和关闭。类似于一个一个的小的窗口。一个程序可以使用同一个env中的不同pane,每个pane可视化记录某一信息。

UI刚开始是个白板,可以用图像,图片,文本填充它。这些填充的数据出现在 Panes 中,您可以这些 Panes 进行 拖放,删除,调整大小和销毁操作。Panes 是保存在 envs 中的, envs 的状态存储在会话之间

如图所示,当前env共有两个pane,一个用于打印log,另一个用于记录损失函数的变化。单击“clear”按钮可以清空当前env的所有pane,单击“save”按钮可将当前env保存成json文件,保存路径位于-/.visdom/目录下。修改env的名字后单击fork,可将当前env另存为新文件。

使用visdom时需要注意,需手动指定保存env,可在Web界面单击“save”按钮或在程序中调用save方法,否则visdom服务重启后,env等信息会丢失。

visdom以Plotly为基础,支持丰富的可视化操作。

visdom同时支持PyTorch的tensor和numpy的ndarray两种数据结构,但不支持Python的int、float等类型,因此每次传入时都需要先将数据转成ndarray或tensor。

不同visdom操作(line,image.text等)的参数一般不同,但有两个参数是绝大多数操作都具备的。

  • win:用于指定pane的名字如果不指定,visdom将自动分配一个新的pane。如果两次操作指定的win名字一样,新的操作将覆盖当前pane的内容,因此建议每次操作都指定win。win的值就是一个id,是一个唯一标识符
  • opts:用来可视化配置,接收一个字典,常见的option包括title、xlabe1、ylabel、width等,主要用于设置pane的显示格式。

绘制简单曲线

sin函数

from visdom import Visdom
import numpy as npviz = Visdom(env='test')
#这句话新建一个连接客户端x = np.linspace(start=0, stop=2 * np.pi, num=100)
y = np.sin(x)
viz.line(Y=y, X=x, win='sine')

tanh

from visdom import Visdom
import numpy as npviz = Visdom(env='test')
#这句话就新建一个连接客户端x = np.linspace(start=0, stop=2 * np.pi, num=100)
y = np.tanh(x)
viz.line(Y=y, X=x, win='tanh', opts={'title':'y=tanh(x)'})

当有新的就会把旧的给覆盖了

两图堆叠

from visdom import Visdom
import numpy as npviz = Visdom(env='test1')
x = np.linspace(0, 2*np.pi,100)
y1 = np.sin(x)
y2 = np.cos(x)
viz.line(Y=np.column_stack((y1, y2)), X=x, win='sin-cos')

visdom每次新的操作都会覆盖之前的数值,但我们在训练网络的过程中往往需要不断更新数值,如损失值等,这时就需要指定参数update=append,来避免覆盖之前的数值

显示实时的动态曲线

from visdom import Visdom
import numpy as np
import timeviz = Visdom(env='test5')
x, y = 0, 0for i in np.linspace(0, 2 * np.pi, 1000):x = iy = np.sin(x)viz.line(X=np.array([x]), Y=np.array([y]), win='sin-realtime', update='append')time.sleep(0.0001)

another example

from visdom import Visdom
import numpy as np
import torchviz = Visdom(env='test')
#这句话就新建一个连接客户端for i in range(0,10):x = torch.tensor([i])y = xviz.line(X=x, Y=y, win='polynomial', update='append' if i>0 else None)#updateTrace新增一条线
x = torch.arange(0,9,0.1)
y = (x**2) / 9
viz.line(X=x, Y=y, win='polynomial', name='this is a new Trace',update='append')

显示图片

viz.image的功能可分为如下两类

  • image接收一个二维或三维向量,HxW或3×HxW,前者是黑白图像,后者是彩色图像。
  • images接收一个四维向量NxCxHxW,C可以是1或3,分别代表黑白和彩色图像。可实现类似torchvision中makegrid的功能,将多张图片拼接在一起。images也可以接收一个二维或三维的向量,此时它所实现的功能与image一致。
from visdom import Visdom
import numpy as np
import skimage.io as ioviz = Visdom(env='test2')
img = io.imread('wave.jpg')
#img是numpy array
#img是 (326, 474, 3)img = np.transpose(img, (2,0,1))
viz.image(img, win='wave')

another example

from visdom import Visdom
import numpy as np
import torchviz = Visdom(env='test')
#这句话就新建一个连接客户端#可视化一张随机的黑白图片
viz.image(torch.randn(64,64).numpy())#可视化一张随机的彩色图片
viz.image(torch.randn(3,64,64).numpy(), win='random2')#可视化36张随机的彩色图片,每行6张
# viz.image(torch.randn(36,3,64,64).numpy(), nrow=6, win='random3',opts={'title':'random_imgs'})
viz.images(torch.randn(36, 3, 64, 64).numpy(), nrow=6, win='random3', opts={'title':'random_imgs'})

显示文本

vis.text用于可视化文本,支持所有的html标签,同时也遵循着html的语法标准。例如,换行需使用<br>标签,\r\n无法实现换行。

from visdom import Visdom
import numpy as np
import torchviz = Visdom(env='test')
#这句话就新建一个连接客户端viz.text(u'''<h1>Hello Visdom</h1><br>Visdom是Facebook专门为<b>PyTorch</b>开发的一个可视化工具,在内部使用了很久,在2017年3月份开源了它。Visdom十分轻量级,但是却有十分强大的功能,支持几乎所有的科学运算可视化任务''',win='visdom',opts={'title': u'visdom简介'}
)

lines: single trace

win的这个‘train_loss’ 就是一个id,是一个唯一的标识符

还有一个id是env=

visdom的窗口,每一个大的窗口是一个env,env里面很多小窗口是win

env如果不指定的话默认是main

update='append'就是添加操作

lines: multi-traces

visual X

完整的

import  torch
import  torch.nn as nn
import  torch.nn.functional as F
import  torch.optim as optim
from    torchvision import datasets, transformsfrom visdom import Visdombatch_size=200
learning_rate=0.01
epochs=10train_loader = torch.utils.data.DataLoader(datasets.MNIST('dataset', train=True, download=True,transform=transforms.Compose([transforms.ToTensor(),# transforms.Normalize((0.1307,), (0.3081,))])),batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(datasets.MNIST('dataset', train=False, transform=transforms.Compose([transforms.ToTensor(),# transforms.Normalize((0.1307,), (0.3081,))])),batch_size=batch_size, shuffle=True)class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.model = nn.Sequential(nn.Linear(784, 200),nn.LeakyReLU(inplace=True),nn.Linear(200, 200),nn.LeakyReLU(inplace=True),nn.Linear(200, 10),nn.LeakyReLU(inplace=True),)def forward(self, x):x = self.model(x)return xdevice = torch.device('cuda:0')
net = MLP().to(device)
optimizer = optim.SGD(net.parameters(), lr=learning_rate)
criteon = nn.CrossEntropyLoss().to(device)viz = Visdom()viz.line([0.], [0.], win='train_loss', opts=dict(title='train loss'))
viz.line([[0.0, 0.0]], [0.], win='test', opts=dict(title='test loss&acc.',legend=['loss', 'acc.']))
global_step = 0for epoch in range(epochs):for batch_idx, (data, target) in enumerate(train_loader):data = data.view(-1, 28*28)data, target = data.to(device), target.cuda()logits = net(data)loss = criteon(logits, target)optimizer.zero_grad()loss.backward()# print(w1.grad.norm(), w2.grad.norm())optimizer.step()global_step += 1viz.line([loss.item()], [global_step], win='train_loss', update='append')if batch_idx % 100 == 0:print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch, batch_idx * len(data), len(train_loader.dataset),100. * batch_idx / len(train_loader), loss.item()))test_loss = 0correct = 0for data, target in test_loader:data = data.view(-1, 28 * 28)data, target = data.to(device), target.cuda()logits = net(data)test_loss += criteon(logits, target).item()pred = logits.argmax(dim=1)correct += pred.eq(target).float().sum().item()viz.line([[test_loss, correct / len(test_loader.dataset)]],[global_step], win='test', update='append')viz.images(data.view(-1, 1, 28, 28), win='x')viz.text(str(pred.detach().cpu().numpy()), win='pred',opts=dict(title='pred'))test_loss /= len(test_loader.dataset)print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(test_loss, correct, len(test_loader.dataset),100. * correct / len(test_loader.dataset)))

Pytorch(八) —— Visdom相关推荐

  1. pytorch使用visdom可视化loss

    目录 介绍 Visdom核心概念 visdom的操作 viz.line的例子 visdom在训练中可视化loss 写在最后: 介绍 visdom是Facebook专门为PyTorch开发的一款可视化工 ...

  2. Pytorch(八) --Pytorch实现多分类问题

    所谓的多分类问题,实际上是使用了softmax函数,这一点和tensorflow是有区别的.tensorflow中的softmax和交叉熵函数是分开的,而pytorch是合并到一起的. 对mnist数 ...

  3. Pytorch学习——visdom启动路径错误

    下载了一晚上,一直报错,看了无数求助帖,试了各种方法,卸载重下数十次 看到知乎一回答,说visdom保存文件到文件夹 猜它可能没有自动生成,尝试在该路径添加一个.visdom文件夹 结果,真tm成了- ...

  4. pytorch中visdom安装

    安装方式 使用pip3进行安装 pip3 install visdom 在github上下载压缩包到本地,地址如下:visdom_github  点击Download ZIP  下载到本地之后,解压, ...

  5. Pytorch:visdom

    visdom作为可视化工具,效率更高. (1)install 在命令行窗口使用 pip install visdom (2)开始进程 在程序运行前,开启visdom.使用-m visdom serve ...

  6. PyTorch学习笔记(13)——强力的可视化工具visdom

    今天,让我们来放松一下大脑,学习点轻松的东西----可视化工具Visdom,它可以让我们在使用PyTorch训练模型的时候,可视化中间的训练情况,无论是loss变化还是中间结果比较.相比干呆呆的瞪着命 ...

  7. 30_visdom可视化、TensorboardX及其案例、安装visdom、使用visdom的案例

    1.25.visdom可视化 1.25.1.TensorboardX Pytorch也能用的tensorboard,此外Pytorch还有visdom可视化. 首先上项目地址:https://gith ...

  8. pythrch 启动 visdom可视化

    pytorch 启动 visdom wtnt@server:~/anaconda3/lib/python3.6/site-packages/visdom$ python -m visdom.serve ...

  9. Visdom:Python可视化神器

    Visdom:可视化神器 项目地址:visdom 文章目录 Visdom:可视化神器 visdom实质 visdom核心概念 env:环境 pane:窗格 创建Visdom环境 常用API plot. ...

最新文章

  1. linux同步到对象存储,将Cpanel备份配置为S3对象存储的方法
  2. python数据科学手册_小白入门Python数据科学
  3. python 多线程 多进程 zmq_研二硕, Python +pyqt,多进程问题求助
  4. linux grouplist groupinstall groupremove 简介
  5. Python基础 --- 使用 dict 和 set
  6. Process 执行shell 脚本
  7. 女朋友跟你说晚安之后仍然在线,我用Python制作脚本成功征服
  8. mysql id 不连续_MySQL中自增主键不连续之解决方案。(20131109)
  9. 中间表为什么可以不用实体类_法国蜗牛供不应求,为什么不用中国蜗牛代替?看完才知道真不可以...
  10. 机器学习:HMM:基础
  11. 复旦大学邱锡鹏老师深度学习课程笔记(一)—— 一些模型概述
  12. 免费稳定又好用的微信投票小程序,照片投票评选,视频投票打分小程序
  13. iview+Collapse折叠面板动态操作表单
  14. 产品升级|10月产品捷报频传,解锁更多新成就!
  15. 粉笔网页端资料分析仿ipad分屏插件开发完成总结
  16. 钛媒体乌镇咖荟 | 这场对话把“元宇宙”说透了:AI、区块链、5G技术将如何碰撞...
  17. SHA 256算法是什么?哈希算法有哪些特点,主要应用在哪里?
  18. 如何让一个IFRAME调用页面的背景为透明
  19. 世界上排名前100的英文歌详细名单及介绍
  20. 【黑金动力社区】【原创博文集锦】《液晶驱动与GUI 基础教程》导读

热门文章

  1. 图片上传到腾讯云COS小案例
  2. 荣耀帐号服务,提升用户使用体验
  3. 2022 柯利亚诺KOREANO品牌盛典璀璨启幕 ESSENTIAL系列耀目亮相
  4. geoserver服务管理-图层与图层组发布、样式管理
  5. 79-80 - 硬盘驱动程序设计
  6. 360一键重装系统 安全又方便
  7. 分享这些实用但冷门的软件
  8. matplotlib-21 stackplot堆积折线图
  9. 【宫水三叶的刷题日记】497. 非重叠矩形中的随机点(中等)
  10. 苹果 iPhone 4 手机拆机组图,看看 iPhone 4 的内部构造与零件(二)_打杂的_新浪博客...