pytorch训练可视化包visdom的使用

这篇具有很好参考价值的文章主要介绍了pytorch训练可视化包visdom的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介

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

import visdom,pytorch,pytorch,python,人工智能

二、安装与启动

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

pip install visdom

接下来,在cmd或者Anaconda中使用python -m visdom.server启动服务。并在浏览器中输入提示的端口,并且需要保持黑框框cmdAnaconda)一直开启。
import visdom,pytorch,pytorch,python,人工智能
import visdom,pytorch,pytorch,python,人工智能
当你打开后,会呈现一个空白的界面,是因为目前还没有写入任何图形。
import visdom,pytorch,pytorch,python,人工智能

三、设计思路

假设你的电脑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 visdom

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

其中env='main-8' 表示一个文件夹名称,main-8可以替换为其他名称,倘若不写该参数,则默认存储在env='main'中,接下来,我们使用viz进行操作,就意味着操作对应的图存在'main-8'中。
此时,打开网页,会看到有两个环境Environment,一个是“main”,一个是“main-8”
import visdom,pytorch,pytorch,python,人工智能
创建好文件夹后,接下来,我们在这个文件夹下面写一些图。
先打开网页,确保是“online”在线模式
import visdom,pytorch,pytorch,python,人工智能
为了模拟迭代过程,这里设计一个循环语句。执行代码

import visdom

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

viz.line(X=[0.],  # x坐标
         Y=[0.],  # y值
        win="line1",  # 窗口id
        name="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')

先看一下,生成的结果。打开网页
import visdom,pytorch,pytorch,python,人工智能
假设现在我想要在main-8文件夹下面,画另外一个图,执行程序

import visdom

vizs = visdom.Visdom(env='main-8')

vizs.line(X=[0.],  # x坐标
         Y=[0.],  # y值
        win="line2",  # 窗口id
        name="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')

查看结果
import visdom,pytorch,pytorch,python,人工智能
上面的内容,还不具有一般性,下面给出部分代码示例和效果图,以满足实际中的复杂需求

背景:假设,现在有一批数据,数据来自总体一元线性方程,我们根据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 visdom

viz = visdom.Visdom(env='main-9')


window_loss = viz.line(
        X=[0.1],  # x坐标
        Y=[0.],  # y值
        win="line_loss_1",  # 窗口id
        name= 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",  # 窗口id
        name=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",  # 窗口id
        name=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.1
        result = 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)

打开网页
import visdom,pytorch,pytorch,python,人工智能

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

#训练模型
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和b
    optimizer.step()

    vis.line(X=[epoch], Y=[loss.item()], win=loss_window, opts=opt, update='append')

五、一般绘图

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

import visdom
import numpy as np

vis = 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_literals

from visdom import Visdom
import numpy as np
import math
import os.path
import getpass
from sys import platform as _platform
from six.moves import urllib

viz = Visdom()
assert viz.check_connection()

try:
    import matplotlib.pyplot as plt
    plt.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或者2
    Y=(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))

生成的图片
import visdom,pytorch,pytorch,python,人工智能
import visdom,pytorch,pytorch,python,人工智能

六、基本调整与保存文件

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

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

import visdom,pytorch,pytorch,python,人工智能
import visdom,pytorch,pytorch,python,人工智能

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

import visdom,pytorch,pytorch,python,人工智能

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

import visdom,pytorch,pytorch,python,人工智能

4、保存单个图

import visdom,pytorch,pytorch,python,人工智能

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

import visdom,pytorch,pytorch,python,人工智能

点击文件夹图标,然后更改名称,再点击fork,再点击“save”,即可保存,我们将上图中的4个文件夹都进行保存。
import visdom,pytorch,pytorch,python,人工智能
还有许多其他功能,自行了解
此时,可以关闭网页,关闭黑框框,不用担心数据丢失。

6、重新加载打开环境

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

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

import visdom,pytorch,pytorch,python,人工智能

7、不小心关闭了网页

只要黑框框没有关闭,不小心将网页关闭了,没有关系,数据不会丢失,重新复制端口在浏览器中访问即可。文章来源地址https://www.toymoban.com/news/detail-755609.html

到了这里,关于pytorch训练可视化包visdom的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pytorch进阶学习(六):如何对训练好的模型进行优化、验证并且对训练过程进行准确率、损失值等的可视化,新手友好超详细记录

    课程资源:  7、模型验证与训练过程可视化【小学生都会的Pytorch】【提供源码】_哔哩哔哩_bilibili 推荐与上一节笔记搭配食用~: pytorch进阶学习(五):神经网络迁移学习应用的保姆级详细介绍,如何将训练好的模型替换成自己所需模型_好喜欢吃红柚子的博客-CSDN博客 训练

    2023年04月17日
    浏览(47)
  • YOLOv5 使用tensorboard查看可视化训练结果

    1.1.找的models/yolo.py文件中,将最下面有关 Tensorboard 的注释打开 2.进入项目根目录 比如你训练的是第20个版本,那么 tensorboard --logdir=./runs/train/exp20 就可以查看当前训练的可视化结果了 3.通过浏览器查看可视化训练结果

    2024年02月16日
    浏览(52)
  • pytorch中使用TensorBoard进行可视化Loss及特征图

    安装TensorBoard 导入TensorBoard 实例化TensorBoard 训练过程中的loss,accuracy等都是标量,都可以用TensorBoard中的add_scalar来显示,add_scalar方法中第一个参数表示表的名字,第二个参数表示的是你要存的值,第三个参数可以理解为x轴坐标。 终端输入tensorboard --logdir=logs,开启TensorBoard

    2023年04月12日
    浏览(59)
  • 【人工智能概论】 PyTorch可视化工具Tensorboard安装与简单使用

    Tensorboard原本是Tensorflow的可视化工具,但自PyTorch1.2.0版本开始,PyTorch正式内置Tensorboard的支持,尽管如此仍需手动安装Tensorboard。否则会报错。 ModuleNotFoundError: No module named ‘tensorboard’ 进入相应虚拟环境后,输入以下指令即可安装。 输入以下指令,不报错即说明安装成功。

    2023年04月24日
    浏览(52)
  • Pytorch深度学习实战3-8:详解数据可视化组件TensorBoard安装与使用

    在深度学习领域,网络内部如同黑箱,其中包含大量的连接参数,这给人工调试造成极大的困难。 Tensorboard 则是神经网络的可视化工具,可以记录训练过程的数字、图像、运行图等内容,方便研究人员对训练参数进行统计,观察神经网络训练过程并指导参数优化。 参考

    2023年04月09日
    浏览(43)
  • 【MMDetection3D】环境搭建,使用PointPillers训练&测试&可视化KITTI数据集

    2D卷不动了,来卷3D,之后更多地工作会放到3D检测上 本文将简单介绍什么是3D目标检测、KITTI数据集以及MMDetection3D算法库,重点介绍如何在MMDetection3D中,使用PointPillars算法训练KITTI数据集,并对结果进行测试和可视化。   对于一张输入图像,2D目标检测旨在给出物体类别并标

    2024年02月03日
    浏览(51)
  • PyTorch中的可视化工具

    目录 一、网络结构的可视化 1.1 通过HiddenLayer可视化网络  1.2 通过PyTorchViz可视化网络  二、训练过程可视化  2.1 通过tensorboardX可视化训练过程 2.2 HiddenLayer可视化训练过程 三、使用Visdom进行可视化           我们训练神经网络时,除了随着step或者epoch观察损失函数的走势

    2023年04月09日
    浏览(34)
  • 【Pytorch】 特征图的可视化

    Pytroch中间层的特征图可视化,网上已经有很多教程,比如用hook钩子函数,但是代码都写得不是很清楚,所以还是自己去摸索一下。 目前这种方法有很大的缺陷,最近看一篇国外的blog时,发现了Pytorch官方文档有一个Torch FX,基于这个实现了特征提取,更新一下Pytorch官方实现

    2023年04月18日
    浏览(91)
  • PyTorch Lightning教程七:可视化

    本节指导如何利用Lightning进行可视化和监控模型 为何需要跟踪参数 在模型开发中,我们跟踪感兴趣的值,例如validation_loss,以可视化模型的学习过程。模型开发就像驾驶一辆没有窗户的汽车,图表和日志提供了窗口,让我们知道该把车开到哪里。有了Lightning,几乎可以可视

    2024年02月14日
    浏览(38)
  • pytorch对中间特征层可视化方案

    本文主要介绍如何使用pytorch获得已经训练好的网络的中间特征层,并将其转化为热力图的简单方法 效果图 1、在原本的test代码上进行修改 2、随便写一个钩子函数(具体了解可以搜索“pytorch中的钩子(Hook)有何作用?”) 3、然后注册一下钩子函数(在你需要保存的卷积层进行

    2024年02月13日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包