visdom的使用

  • 一、简介
  • 二、安装与启动
  • 三、设计思路
  • 四、在迭代训练中的绘图
  • 五、一般绘图
  • 六、基本调整与保存文件
    • 1、`调整大小、拖拽`:长按拖动即可,右下角落长按移动即可放大缩小
    • 2、`查看图片对应的数据`:点击右下角`Edit`,会跳转到新网页,可以灵活进行数据调整
    • 3、`图内控件调整`:比如,放大某一区域,或者图内整体放大缩小等等
    • 4、`保存单个图`
    • 5、`保存整个环境`:逐步将每个文件夹都保存一下
    • 6、`重新加载打开环境`
    • 7、`不小心关闭了网页`

一、简介

Visdom是一个基于Python的可视化工具包,可以用于PyTorch等深度学习框架中的实时数据可视化。它提供了一个Web界面,可以方便地创建图表、散点图和直方图等可视化元素。相比tensorboardrensorboardX具有更轻量、更便捷、更丰富、更快速等特点。

visdom的github主页:https://github.com/fossasia/visdom

visdom的中文参考文档:https://ptorch.com/news/77.html

visdom的优秀教程:https://blog.csdn.net/weixin_41010198/article/details/117853358

二、安装与启动

使用Visdom需要先安装visdom包,可以通过pip命令进行安装:

pip install visdom

接下来,在cmd或者Anaconda中使用python -m visdom.server启动服务。并在浏览器中输入提示的端口,并且需要保持黑框框cmdAnaconda)一直开启。


当你打开后,会呈现一个空白的界面,是因为目前还没有写入任何图形。

三、设计思路

假设你的电脑C盘中有很多文件夹,每个文件夹有很多文件,每个文件可以填入你想要的信息。

同样,visdom启动服务后,呈现出一个网页页面,会随时根据你电脑跑的程序中有关visdom的部分,呈现出可视化图。这个网页中,可以选择不同的文件夹进行存储,让你的图文件分门别类,比如程序A相关的图存在A文件夹中,程序B相关的图存在B文件夹下,当然也可以各个程序生成的图都存在C文件夹下。每个文件夹中可以画不同的图,每个图也可以画多个点、线、柱等等。

在每个文件夹下,可以存入视频图像文本等等

图像分为图片、以及生成的一些数据图,这里简单介绍一下生成的数据图,比如折线图

vis.scatter:2D或3D散点图
vis.line:线图
vis.stem:stem图
vis.heatmap:热图地块
vis.bar:条形图
vis.histogram:直方图
vis.boxplot:盒子
vis.surf:表面重复
vis.contour:等高线图
vis.quiver:颤抖的情节
vis.mesh:网格图
vis.dual_axis_lines:双y轴线图

四、在迭代训练中的绘图

首先创建一个可视化界面和文件夹:

import visdomviz = visdom.Visdom(env='main-8')

其中env='main-8' 表示一个文件夹名称,main-8可以替换为其他名称,倘若不写该参数,则默认存储在env='main'中,接下来,我们使用viz进行操作,就意味着操作对应的图存在'main-8'中。
此时,打开网页,会看到有两个环境Environment,一个是“main”,一个是“main-8”

创建好文件夹后,接下来,我们在这个文件夹下面写一些图。
先打开网页,确保是“online”在线模式

为了模拟迭代过程,这里设计一个循环语句。执行代码

import visdomviz = visdom.Visdom(env='main-8')viz.line(X=[0.],  # x坐标Y=[0.],  # y值win="line1",  # 窗口idname="Adam梯度",  # 线条名称update='append',  # 以添加方式加入opts={'showlegend': True,  # 显示网格'title': "Demo line in Visdom",'xlabel': "x1",  # x轴标签'ylabel': "y1",  # y轴标签},)for i in range(10):viz.line(X=[i], Y=[i*2],name="Adam梯度", win='line1', update='append')viz.line(X=[i], Y=[i**2],name="SGD梯度", win='line1', update='append')viz.line(X=[i], Y=[5*i+2],name="GDM梯度", win='line1', update='append')

先看一下,生成的结果。打开网页

假设现在我想要在main-8文件夹下面,画另外一个图,执行程序

import visdomvizs = visdom.Visdom(env='main-8')vizs.line(X=[0.],  # x坐标Y=[0.],  # y值win="line2",  # 窗口idname="Adam梯度",  # 线条名称update='append',  # 以添加方式加入opts={'showlegend': True,  # 显示网格'title': "Demo line in Visdom-1",'xlabel': "x1",  # x轴标签'ylabel': "y1",  # y轴标签},)for i in range(10):vizs.line(X=[i], Y=[5*i**3],name="Adam梯度", win='line2', update='append')vizs.line(X=[i], Y=[i**2],name="SGD梯度", win='line2', update='append')

查看结果

上面的内容,还不具有一般性,下面给出部分代码示例和效果图,以满足实际中的复杂需求

背景:假设,现在有一批数据,数据来自总体一元线性方程,我们根据A、B、C三种梯度下降算法,在不同的采样率rate下,对比分析,三种梯度下降算法中的损失值w值b值

描述:
图1:loss损失图,横轴为采样比rate、纵轴为loss损失值,图中有3个折线,对应A(无梯度)、B(小梯度)、C(随机梯度)三种梯度下降方法
同理,图2为w值图,图3为b值图,其余类似。

生成文件夹下面的三个图窗口,生成图窗口只需要执行一次就行,放在env='main-9'文件夹中

name_1 = '无梯度'
name_2 = '小梯度'
name_3 = '随机梯度'import visdomviz = visdom.Visdom(env='main-9')window_loss = viz.line(X=[0.1],  # x坐标Y=[0.],  # y值win="line_loss_1",  # 窗口idname= name_1,  # 线条名称update='append',  # 以添加方式加入opts={'showlegend': True,  # 显示网格'title': "loss",'xlabel': "rate",  # x轴标签'ylabel': "loss",  # y轴标签},)window_w = viz.line(X=[0.1],  # x坐标Y=[0.],  # y值win="line_w_1",  # 窗口idname=name_1,  # 线条名称update='append',  # 以添加方式加入opts={'showlegend': True,  # 显示网格'title': "W value",'xlabel': "rate",  # x轴标签'ylabel': "w",  # y轴标签},)window_b = viz.line(X=[0.1],  # x坐标Y=[0.],  # y值win="line_b_1",  # 窗口idname=name_1,  # 线条名称update='append',  # 以添加方式加入opts={'showlegend': True,  # 显示网格'title': "b value",'xlabel': "rate",  # x轴标签'ylabel': "b",  # y轴标签},)

在迭代训练中,每次result生成的结果为([loss_A, loss_B, loss_C],[A_w,B_w, C_w],[A_b, B_b, C_b])


for i in range(9):va = 'append'if i == 0:va = "replace"rate += 0.1result = main()#result: ([loss_A, loss_B, loss_C],[A_w,B_w, C_w],[A_b, B_b, C_b])viz.line(X=[rate], Y=[result[0][0]],name=name_1, win=window_loss, update=va)viz.line(X=[rate], Y=[result[0][1]],name=name_2, win=window_loss, update=va)viz.line(X=[rate], Y=[result[0][2]],name=name_3, win=window_loss, update=va)viz.line(X=[rate], Y=[result[1][0]],name=name_1, win=window_w, update=va)viz.line(X=[rate], Y=[result[1][1]],name=name_2, win=window_w, update=va)viz.line(X=[rate], Y=[result[1][2]],name=name_3, win=window_w, update=va)viz.line(X=[rate], Y=[result[2][0]],name=name_1, win=window_b, update=va)viz.line(X=[rate], Y=[result[2][1]],name=name_2, win=window_b, update=va)viz.line(X=[rate], Y=[result[2][2]],name=name_3, win=window_b, update=va)

打开网页

倘若是在机器学习、深度学习中:

#训练模型
vis = visdom.Visdom(env='main')  # 设置环境窗口的名称,如果不设置名称就默认为main
opt = {'xlabel': 'epochs','ylabel': 'loss_value','title': 'SGD_loss'}
loss_window = vis.line(X=[0],Y=[0],opts=opt
)for epoch in range(400):y_pred = model(x_data)loss = criterion(y_pred, y_data)print(epoch, loss.item())#所有梯度归零化optimizer.zero_grad()#反向传播求出梯度loss.backward()#更新权重和偏置值,即w和boptimizer.step()vis.line(X=[epoch], Y=[loss.item()], win=loss_window, opts=opt, update='append')

五、一般绘图

放在“main”下面,可忽略参数。在jupyter notebook中执行代码:

import visdom
import numpy as npvis = visdom.Visdom()vis.text('Hello, world!')
vis.image(np.ones((3, 10, 10)))
import visdom
vis = visdom.Visdom()trace = dict(x=[1, 2, 3], y=[4, 5, 6], mode="markers+lines", type='custom',marker={'color': 'red', 'symbol': 104, 'size': "10"},text=["one", "two", "three"], name='1st Trace')
layout = dict(title="First Plot", xaxis={'title': 'x1'}, yaxis={'title': 'x2'})vis._send({'data': [trace], 'layout': layout, 'win': 'mywin'})
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literalsfrom visdom import Visdom
import numpy as np
import math
import os.path
import getpass
from sys import platform as _platform
from six.moves import urllibviz = Visdom()
assert viz.check_connection()try:import matplotlib.pyplot as pltplt.plot([1, 23, 2, 4])plt.ylabel('some numbers')viz.matplot(plt)
except BaseException as err:print('Skipped matplotlib example')print('Error message: ', err)
#单张
viz.image(np.random.rand(3, 512, 256),opts=dict(title='Random!', caption='How random.'),
)
#多张
viz.images(np.random.randn(20, 3, 64, 64),opts=dict(title='Random images', caption='How random.')
)
#画出随机的散点图
import time
Y = np.random.rand(100)
old_scatter = viz.scatter(X=np.random.rand(100, 2),Y=(Y[Y > 0] + 1.5).astype(int),opts=dict(legend=['Didnt', 'Update'],xtickmin=-50,xtickmax=50,xtickstep=0.5,ytickmin=-50,ytickmax=50,ytickstep=0.5,markersymbol='cross-thin-open',),
)time.sleep(5)#对窗口进行更新,包括标注,坐标,样式等
viz.update_window_opts(win=old_scatter,opts=dict(legend=['Apples', 'Pears'],xtickmin=0,xtickmax=1,xtickstep=0.5,ytickmin=0,ytickmax=1,ytickstep=0.5,markersymbol='cross-thin-open',),
)
## 通过update='new'添加新散点import time
win = viz.scatter(X=np.random.rand(255, 2),opts=dict(markersize=10,markercolor=np.random.randint(0, 255, (255, 3,)),),
)# 判断窗口是否存在
assert viz.win_exists(win), 'Created window marked as not existing'
time.sleep(2)# 向散点图中加入新的描述
viz.scatter(X=np.random.rand(255),Y=np.random.rand(255),win=win,name='new_trace',update='new'
)
# 2D散点图,分配不同颜色
viz.scatter(X=np.random.rand(255, 2),#随机指定1或者2Y=(np.random.rand(255) + 1.5).astype(int),opts=dict(markersize=10,## 分配两种颜色markercolor=np.random.randint(0, 255, (2, 3,)),),
)
#3D 散点图
viz.scatter(X=np.random.rand(100, 3),Y=(Y + 1.5).astype(int),opts=dict(legend=['Men', 'Women'],markersize=5,)
)
viz.line(Y=np.random.rand(10), opts=dict(showlegend=True))Y = np.linspace(-5, 5, 100)
viz.line(Y=np.column_stack((Y * Y, np.sqrt(Y + 5))),X=np.column_stack((Y, Y)),opts=dict(markers=False),
)
viz.bar(X=np.random.rand(20))
viz.bar(X=np.abs(np.random.rand(5, 3)),opts=dict(stacked=True,legend=['Facebook', 'Google', 'Twitter'],rownames=['2012', '2013', '2014', '2015', '2016'])
)
viz.bar(X=np.random.rand(20, 3),opts=dict(stacked=False,legend=['The Netherlands', 'France', 'United States'])
)
viz.heatmap(X=np.outer(np.arange(1, 6), np.arange(1, 11)),opts=dict(columnnames=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'],rownames=['y1', 'y2', 'y3', 'y4', 'y5'],colormap='Electric',)
)
# contour
x = np.tile(np.arange(1, 101), (100, 1))
y = x.transpose()
X = np.exp((((x - 50) ** 2) + ((y - 50) ** 2)) / -(20.0 ** 2))
viz.contour(X=X, opts=dict(colormap='Viridis'))# surface
viz.surf(X=X, opts=dict(colormap='Hot'))
# boxplot
X = np.random.rand(100, 2)
X[:, 1] += 2
viz.boxplot(X=X,opts=dict(legend=['Men', 'Women'])
)# stemplot
Y = np.linspace(0, 2 * math.pi, 70)
X = np.column_stack((np.sin(Y), np.cos(Y)))
viz.stem(X=X,Y=Y,opts=dict(legend=['Sine', 'Cosine'])
)# quiver plot
X = np.arange(0, 2.1, .2)
Y = np.arange(0, 2.1, .2)
X = np.broadcast_to(np.expand_dims(X, axis=1), (len(X), len(X)))
Y = np.broadcast_to(np.expand_dims(Y, axis=0), (len(Y), len(Y)))
U = np.multiply(np.cos(X), Y)
V = np.multiply(np.sin(X), Y)
viz.quiver(X=U,Y=V,opts=dict(normalize=0.9),
)
# text window with Callbacks
txt = 'This is a write demo notepad. Type below. Delete clears text:<br>'
callback_text_window = viz.text(txt)# pie chart
X = np.asarray([19, 26, 55])
viz.pie(
X=X,
opts=dict(legend=['Residential', 'Non-Residential', 'Utility'])
)# mesh plot
x = [0, 0, 1, 1, 0, 0, 1, 1]
y = [0, 1, 1, 0, 0, 1, 1, 0]
z = [0, 0, 0, 0, 1, 1, 1, 1]
X = np.c_[x, y, z]
i = [7, 0, 0, 0, 4, 4, 6, 6, 4, 0, 3, 2]
j = [3, 4, 1, 2, 5, 6, 5, 2, 0, 1, 6, 3]
k = [0, 7, 2, 3, 6, 7, 1, 1, 5, 5, 7, 6]
Y = np.c_[i, j, k]
viz.mesh(X=X, Y=Y, opts=dict(opacity=0.5))

生成的图片

六、基本调整与保存文件

在上面使用代码生成的这些图片,我应该怎么保存呢?我下次再打开网页,能不能还是显示这样的动态网页呢?我能不能调整某一个图片大小,显示它的数据之类的呢?答案是肯定的!

1、调整大小、拖拽:长按拖动即可,右下角落长按移动即可放大缩小


2、查看图片对应的数据:点击右下角Edit,会跳转到新网页,可以灵活进行数据调整

3、图内控件调整:比如,放大某一区域,或者图内整体放大缩小等等

4、保存单个图

5、保存整个环境:逐步将每个文件夹都保存一下

点击文件夹图标,然后更改名称,再点击fork,再点击“save”,即可保存,我们将上图中的4个文件夹都进行保存。

还有许多其他功能,自行了解
此时,可以关闭网页,关闭黑框框,不用担心数据丢失。

6、重新加载打开环境

很久以后,当我们需要查看这些图形的时候,不需要重新跑代码,直接启动服务,打开网页即可。

同样的操作:在黑框框中启动服务打开网页。使用python -m visdom.server启动服务。并在浏览器中输入提示的端口,那么我们就可以看到之前生成的图形了。

7、不小心关闭了网页

只要黑框框没有关闭,不小心将网页关闭了,没有关系,数据不会丢失,重新复制端口在浏览器中访问即可。

pytorch训练可视化包visdom的使用相关推荐

  1. PyTorch 训练可视化教程 visdom

    visdom 快速启动 启动地址:http://localhost:8097/ visdom 的介绍 Visdom是Facebook专为PyTorch开发的实时可视化工具包,其作用相当于TensorF ...

  2. Pytorch的可视化工具visdom的基本使用

    Pytorch的可视化工具visdom的基本使用 一.简介 Visdom 是 Facebook 专门为Pytorch开发的一款用于创建.组织和共享实时丰富数据的开源可视化工具.支持 Torch 和 N ...

  3. 【深度学习】PyTorch深度学习训练可视化工具visdom

    PyTorch Author:louwill Machine Learning Lab 在进行深度学习实验时,能够可视化地对训练过程和结果进行展示是非常有必要的.除了Torch版本的TensorBoa ...

  4. PyTorch之—可视化(Visdom/TensorboardX)

    文章目录 一.Visdom 安装与使用 小案例 二.TensorBoardX 案例一 案例二 使用PROJECTOR对高维向量可视化 绘制网络结构 一.Visdom Visdom是Facebook在2 ...

  5. PyTorch深度学习训练可视化工具tensorboardX

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 之前笔者提到了PyTorch的专属可视化工具visdom,参看Py ...

  6. 详解PyTorch可视化工具visdom(一)

    一.介绍 在深度学习领域,模型训练是一个必须的过程,因此常常需要实时监听并可视化一些数据,如损失值loss,正确率acc等.在Tensorflow中,最常使用的工具非Tensorboard莫属:在Py ...

  7. PyTorch项目使用TensorboardX进行训练可视化

    PyTorch项目使用TensorboardX进行训练可视化 什么是TensorboardX 配置TensorboardX 使用 pip 安装 从源码安装 使用TensorboardX 参考资料 什么 ...

  8. pytorch学习笔记(八):PytTorch可视化工具 visdom

    Visdom PyTorch可视化工具 本文翻译的时候把 略去了 Torch部分. 项目地址 一个灵活的可视化工具,可用来对于 实时,富数据的 创建,组织和共享.支持Torch和Numpy. 总览 基 ...

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

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

最新文章

  1. Analysis and Design Overview
  2. 拼多多就知乎不当评论致歉!相关部门已展开调查
  3. cinder连接mysql数据库_Openstack入门篇(十六)之Cinder服务的部署与测试
  4. JDK1.7 深入理解 LinkedHashMap
  5. bat中的start
  6. java技术面试之面试题大全
  7. C# dataTable实用例
  8. Neo4j如何对大量数据-(千万节点及以上数据)进行加载入库
  9. nginx location总结
  10. 旁边一位员工天天跟别人聊天,主管都不敢管,那你当什么主管
  11. php 判断输入字符串,php 判断(输入框) 字符串函数
  12. 小米6刷miui12.5中出现网络问题(微信登不上等)的解决办法
  13. 关于tomcat启动出现To prevent a memory leak, the JDBC Driver has been forcibly unregistered.问题
  14. 《费马大定理》-站在巨人的肩膀上
  15. Typora Beta版过期解决
  16. 四、FFI和第三方模块
  17. server giving msxml3.dll error '80072f7d' when trying to access secure url
  18. 2019杭州电子科技大学计算机考研经验——97天一战上岸
  19. Chrome打开网页不慢,但是卡顿,滚动滚轮卡顿,打开b站等特定网址卡顿问题解决
  20. 【面试宝典】Mysql面试题大全

热门文章

  1. 华为Mate 20X 5G手机供应链一览,附手机深度拆解过程
  2. bvh文件读取(blender版)
  3. python截取视频图片_python提取视频第一帧图片
  4. wps计算机课笔记,学霸笔记|2022一轮复习课本-WPS Office.doc
  5. 全程配图超清晰的Springboot权限控制后台管理项目实战第二期(Springboot+shiro+mybatis+redis)
  6. 关系数据库系列文章之到底什么是关系(一)
  7. Excel 数值格式四舍五入出现不统一问题。
  8. tp6发送邮件(qq邮箱)
  9. 哪些文字生成图片的软件好用?分享这三款好用的软件
  10. git生成ssh密钥。代码形式可以选定存储位置