0


pytorch训练可视化包visdom的使用

visdom的使用

一、简介

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

  1. tensorboard

  1. rensorboardX

具有更轻量、更便捷、更丰富、更快速等特点。

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命令进行安装:

  1. pip install visdom

接下来,在

  1. cmd

或者

  1. Anaconda

中使用

  1. python -m visdom.server

启动服务。并在浏览器中输入提示的端口,并且需要保持

  1. 黑框框

  1. cmd

  1. Anaconda

)一直开启。
在这里插入图片描述
在这里插入图片描述
当你打开后,会呈现一个空白的界面,是因为目前还没有写入任何图形。
在这里插入图片描述

三、设计思路

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

同样,

  1. visdom

启动服务后,呈现出一个网页页面,会随时根据你电脑跑的程序中有关visdom的部分,呈现出可视化图。这个网页中,可以选择不同的文件夹进行存储,让你的图文件分门别类,比如

  1. 程序A

相关的图存在

  1. A文件夹

中,

  1. 程序B

相关的图存在

  1. B文件夹

下,当然也可以各个程序生成的图都存在

  1. C文件夹

下。每个文件夹中可以画不同的图,每个图也可以画多个点、线、柱等等。

在每个文件夹下,可以存入

  1. 视频

  1. 图像

  1. 文本

等等

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

  1. vis.scatter

:2D或3D散点图

  1. vis.line

:线图

  1. vis.stem

:stem图

  1. vis.heatmap

:热图地块

  1. vis.bar

:条形图

  1. vis.histogram

:直方图

  1. vis.boxplot

:盒子

  1. vis.surf

:表面重复

  1. vis.contour

:等高线图

  1. vis.quiver

:颤抖的情节

  1. vis.mesh

:网格图

  1. vis.dual_axis_lines

:双y轴线图

四、在迭代训练中的绘图

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

  1. import visdom
  2. viz = visdom.Visdom(env='main-8')

其中

  1. env='main-8'

表示一个文件夹名称,

  1. main-8

可以替换为其他名称,倘若不写该参数,则默认存储在

  1. env='main'

中,接下来,我们使用

  1. viz

进行操作,就意味着操作对应的图存在

  1. 'main-8'

中。
此时,打开网页,会看到有两个环境

  1. Environment

,一个是

  1. main

,一个是

  1. main-8

在这里插入图片描述
创建好文件夹后,接下来,我们在这个文件夹下面写一些图。
先打开网页,确保是

  1. online

在线模式
在这里插入图片描述
为了模拟迭代过程,这里设计一个循环语句。执行代码

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

先看一下,生成的结果。打开网页
在这里插入图片描述
假设现在我想要在main-8文件夹下面,画另外一个图,执行程序

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

查看结果
在这里插入图片描述
上面的内容,还不具有一般性,下面给出部分代码示例和效果图,以满足实际中的复杂需求

背景:假设,现在有一批数据,数据来自总体一元线性方程,我们根据

  1. ABC

三种梯度下降算法,在不同的采样率

  1. rate

下,对比分析,三种梯度下降算法中的

  1. 损失值

  1. w

  1. b

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

生成文件夹下面的三个图窗口,生成图窗口只需要执行一次就行,放在

  1. env='main-9'

文件夹中

  1. name_1 ='无梯度'
  2. name_2 ='小梯度'
  3. name_3 ='随机梯度'import visdom
  4. viz = visdom.Visdom(env='main-9')
  5. window_loss = viz.line(
  6. X=[0.1],# x坐标
  7. Y=[0.],# y
  8. win="line_loss_1",# 窗口id
  9. name= name_1,# 线条名称
  10. update='append',# 以添加方式加入
  11. opts={'showlegend':True,# 显示网格'title':"loss",'xlabel':"rate",# x轴标签'ylabel':"loss",# y轴标签},)
  12. window_w = viz.line(
  13. X=[0.1],# x坐标
  14. Y=[0.],# y
  15. win="line_w_1",# 窗口id
  16. name=name_1,# 线条名称
  17. update='append',# 以添加方式加入
  18. opts={'showlegend':True,# 显示网格'title':"W value",'xlabel':"rate",# x轴标签'ylabel':"w",# y轴标签},)
  19. window_b = viz.line(
  20. X=[0.1],# x坐标
  21. Y=[0.],# y
  22. win="line_b_1",# 窗口id
  23. name=name_1,# 线条名称
  24. update='append',# 以添加方式加入
  25. opts={'showlegend':True,# 显示网格'title':"b value",'xlabel':"rate",# x轴标签'ylabel':"b",# y轴标签},)

在迭代训练中,每次result生成的结果为

  1. ([loss_A, loss_B, loss_C],[A_w,B_w, C_w],[A_b, B_b, C_b])
  1. for i inrange(9):
  2. va ='append'if i ==0:
  3. va ="replace"
  4. rate +=0.1
  5. result = main()#result ([loss_A, loss_B, loss_C],[A_w,B_w, C_w],[A_b, B_b, C_b])
  6. viz.line(X=[rate], Y=[result[0][0]],name=name_1, win=window_loss, update=va)
  7. viz.line(X=[rate], Y=[result[0][1]],name=name_2, win=window_loss, update=va)
  8. viz.line(X=[rate], Y=[result[0][2]],name=name_3, win=window_loss, update=va)
  9. viz.line(X=[rate], Y=[result[1][0]],name=name_1, win=window_w, update=va)
  10. viz.line(X=[rate], Y=[result[1][1]],name=name_2, win=window_w, update=va)
  11. viz.line(X=[rate], Y=[result[1][2]],name=name_3, win=window_w, update=va)
  12. viz.line(X=[rate], Y=[result[2][0]],name=name_1, win=window_b, update=va)
  13. viz.line(X=[rate], Y=[result[2][1]],name=name_2, win=window_b, update=va)
  14. viz.line(X=[rate], Y=[result[2][2]],name=name_3, win=window_b, update=va)

打开网页
在这里插入图片描述

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

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

五、一般绘图

放在

  1. main

下面,可忽略参数。在

  1. jupyter notebook

中执行代码:

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

生成的图片
在这里插入图片描述
在这里插入图片描述

六、基本调整与保存文件

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

1、

  1. 调整大小、拖拽

:长按拖动即可,右下角落长按移动即可放大缩小

在这里插入图片描述
在这里插入图片描述

2、

  1. 查看图片对应的数据

:点击右下角

  1. Edit

,会跳转到新网页,可以灵活进行数据调整

在这里插入图片描述

3、

  1. 图内控件调整

:比如,放大某一区域,或者图内整体放大缩小等等

在这里插入图片描述

4、

  1. 保存单个图

在这里插入图片描述

5、

  1. 保存整个环境

:逐步将每个文件夹都保存一下

在这里插入图片描述

点击

  1. 文件夹图标

,然后更改名称,再点击

  1. fork

,再点击

  1. save

,即可保存,我们将上图中的4个文件夹都进行保存。
在这里插入图片描述
还有许多其他功能,自行了解
此时,可以关闭网页,关闭

  1. 黑框框

,不用担心数据丢失。

6、

  1. 重新加载打开环境

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

同样的操作:在

  1. 黑框框

中启动服务打开网页。使用

  1. python -m visdom.server

启动服务。并在浏览器中输入提示的端口,那么我们就可以看到之前生成的图形了。

在这里插入图片描述

7、

  1. 不小心关闭了网页

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


本文转载自: https://blog.csdn.net/AdamCY888/article/details/129789410
版权归原作者 高山莫衣 所有, 如有侵权,请联系我们删除。

“pytorch训练可视化包visdom的使用”的评论:

还没有评论