[chapter27][PyTorch][visdom]

news2025/1/12 20:49:22

前言:

           Visdom是Facebook专为PyTorch开发的实时可视化工具包,相当于TensorFlow中的Tensorboard,灵活高效且界面美观。

目录:

       1: 环境安装

        2: 参数简介

        3: 监听单一数据

        4: 监听多个数据

        5: 综合例子


一  环境安装

       1.1 安装环境

pip install visdom

     1.2 启动环境

         

python -m visdom.server

  启动成功后,会返回会返回一个网址,然后在浏览器里输入:http://localhost:8097 进行登录

 注意事项:

            如遇到Downloading scripts, this may take a little while,长时间未响应,

可以使用代理服务器访问外网,这个应该是国内防火墙导致的,导致开发脚本无法下载.

1.3 启动成功界面

 


二  参数简介

      1.1 基本可视化函数

vis.image : #图片
vis.line:     #线
vis.images : #图片
vis.text : # 输出文字
vis.properties : #属性网格
vis.audio : #音频
vis.video : #视频
vis.svg : #SVG对象
vis.matplot : #matplotlib图
vis.save : #序列化状态服务端

1.2 opt的参数

   可以用python字典的格式传入

 opts.title : #图标题
win:#窗口名称
opts.width : #图宽
opts.height : #图高
opts.showlegend : #显示图例 (true or false)
opts.xtype : #x轴的类型 ('linear' or 'log')
opts.xlabel : #x轴的标签
opts.xtick : #显示x轴上的刻度 (boolean)
opts.xtickmin : #指定x轴上的第一个刻度 (number)
opts.xtickmax : #指定x轴上的最后一个刻度 (number)
opts.xtickvals : #x轴上刻度的位置(table of numbers)
opts.xticklabels : #在x轴上标记标签 (table of strings)
opts.xtickstep : #x轴上刻度之间的距离 (number)
opts.xtickfont :#x轴标签的字体 (dict of font information)
opts.ytype : #type of y-axis ('linear' or 'log')
opts.ylabel : #label of y-axis
opts.ytick : #show ticks on y-axis (boolean)
opts.ytickmin : #first tick on y-axis (number)
opts.ytickmax : #last tick on y-axis (number)
opts.ytickvals : #locations of ticks on y-axis (table of numbers)
opts.yticklabels : #ticks labels on y-axis (table of strings)
opts.ytickstep : #distances between ticks on y-axis (number)
opts.ytickfont : #font for y-axis labels (dict of font information)
opts.marginleft : #左边框 (in pixels)
opts.marginright :#右边框 (in pixels)
opts.margintop : #上边框 (in pixels)
opts.marginbottom: #下边框 (in pixels)
opts.legent=['']: #显示图标


三  监听单一数据

     示例: 监听train loss的变化

    

    

# -*- coding: utf-8 -*-
"""
Created on Fri Apr 14 10:49:46 2023

@author: chengxf2
"""

import numpy as np
from visdom import Visdom
import numpy as np
import time

def  train():
    
    vis = Visdom() #实例化窗口
    #Y坐标轴的第一个点,X坐标轴的第一个点,窗口名称,图标标题
    vis.line([0],[0],win ='train_loss',opts = dict(title='train_loss'))
    
    
    for epoch in range(100):
        
        loss = 100-epoch+ np.random.randn()
        vis.line([loss],[epoch],
        win='train_loss',# 窗口名称 与上个窗口同名表示显示在同一个表格里
        update='append') # 添加到上一个点的后面
        time.sleep(0.1)
        

if __name__ == "__main__":
    train()

四  监听多条数据

   监听 train loss 和 acc的例子

   

from visdom import Visdom
import numpy as np
import time

def train():

    # 实例化窗口
    vis = Visdom()
    # 初始化窗口参数
    vis.line([[0.,0.]],[0.],win = 'train',opts = dict(title = 'loss&acc',legend = ['loss','acc']))
                # 更新窗口数据
    for step in range(10):
    	loss = 10-step+0.2 * np.random.randn()
    	acc =step/10   
    	vis.line([[loss, acc]],[step],win = 'train',update = 'append')
    	time.sleep(0.5)


train()

五 应用实例

    下面是一个完整的例子

    虽然我指定了在GPU上面运行,但是因为PC没有安装CUDA CUDNN

   最终还是在CPU 上运行

  参考pytorch gpu版本安装 - 知乎

'''
导入库文件
'''

import  torch
import  torch.nn as nn
import  torch.nn.functional as F
import  torch.optim as optim
from    torchvision import datasets, transforms
from visdom import Visdom
import numpy as np
'''
构建简单的模型:简单线性层+Relu函数的多层感知机
nn.Sequential
    一个序列容器,用于搭建神经网络的模块被按照被传入构造器的顺序添加到nn.Sequential()容器中
    模型前向传播时调用forward()方法,模型接收的输入首先被传入nn.Sequential()包含的第一个网络模块中。
    然后,第一个网络模块的输出传入第二个网络模块作为输入,按照顺序依次计算并传播,
    直到nn.Sequential()里的最后一个模块输出结果。
'''
class MLP(nn.Module):

   def __init__(self):
    super(MLP, self).__init__()
    self.model = nn.Sequential(
            nn.Linear(784, 200),
            nn.ReLU(inplace=True),
            nn.Linear(200, 200),
            nn.ReLU(inplace=True),
            nn.Linear(200, 10),
            nn.ReLU(inplace=True))
    
   def forward(self, x):
        x = self.model(x)
        return x
    
def train():
    batch_size = 128
    learning_rate = 1e-3
    epochs = 10
    
    #获取训练数据
    train_loader = torch.utils.data.DataLoader(
    datasets.MNIST('../data', train=True, download=True,          #train=True则得到的是训练集
                   transform=transforms.Compose([                 #transform进行数据预处理
                       transforms.ToTensor(),                     #转成Tensor类型的数据
                       transforms.Normalize((0.1307,), (0.3081,)) #进行数据标准化(减去均值除以方差)
                   ])),
    batch_size=batch_size, shuffle=True)                          #按batch_size分出一个batch维度在最前面,shuffle=True打乱顺序

    #获取测试数据
    test_loader = torch.utils.data.DataLoader(
    datasets.MNIST('../data', train=False, transform=transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize((0.1307,), (0.3081,))
    ])),
    batch_size=batch_size, shuffle=True)
    
    

    # 初始化visdom类
    viz = Visdom()
    # 绘制起点
    viz.line([0.], [0.], win="train loss", opts=dict(title='train_loss'))
    device = torch.device('cuda:0')
    
    #模型放到GPU上
    net = MLP().to(device)
    
    #损失函数放到GPU 上
    optimizer = optim.SGD(net.parameters(), lr=learning_rate)
    criteon = nn.CrossEntropyLoss().to(device)

    for 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()
            optimizer.step()
            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 = 0
    correct = 0
    for 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()

    test_loss /= len(test_loader.dataset)
    # 绘制epoch以及对应的测试集损失loss
    viz.line([test_loss], [epoch], win="train loss", update='append') # win是必须的 
    print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
   	test_loss, correct, len(test_loader.dataset), correct / len(test_loader.dataset)))


if __name__ == "__main__":
    train()

参考文献

详解PyTorch可视化工具visdom(一)_底层研究生的博客-CSDN博客

可视化工具Visdom的使用_修行僧yicen的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

晶振电路并联一个电阻作用

晶振电路并联一个电阻的作用 前言 在设计电路时,通常看到一些主控的外部高速晶振并联了一个1MΩ的电阻,但是发现有的电路不用也可以正常工作,对这个就有点好奇啦? 电路图如下: 实际上晶振电路在工作时没有并联一个1…

如何使用Sublime来规范化代码的格式,让代码更加规范整齐,批量修改代码

如何使用Sublime来规范化代码的格式,让代码更加规范整齐,批量修改代码 设备/引擎:Mac(11.7)/cocos 开发工具:Sublime Text 开发语言:c/java 代码开发中经常需要将代码进行规范化处理&#x…

PHP +python+nodejs+springboot+vue 校园电子资料资源管理系统

能实现不出家门就可以通过网络进行系统管理,交易等,而且过程简单、快捷。同样的,在人们的工作生活中,也就需要互联网技术来方便人们的日常工作生活,实现工作办公的自动化处理,实现信息化,无纸化…

js录音支持h5 pc ios android

最近在做h5录音的页面要求可暂停录音,继续录音,写好后发现不兼容ios,无奈只能找兼容方法,找了一天也没找到,后来看到一个网站在ios上可以暂停录音,后来引入他的js文件果然能用了 网站放下面了 Recorder H5: 用于html5网页中的前…

ASP.NET ZERO Crack坚实的体系结构

ASP.NET ZERO Crack坚实的体系结构 据说ASP.NET ZERO是互联网应用程序新流程的起点,该流程包含现代用户界面,具有强大的体系结构和完整的源代码。它可以通过提供共享的应用程序来节省用户时间,这些应用程序是visual studio预构建解决方案所必…

PostMan笔记(一)简介+安装和设置

1. PostMan简介 Postman 是一款功能强大的 API 开发工具,支持多种 HTTP 请求方法和测试断言,能够快速调试和测试 API 接口,提高开发效率。本文将介绍 Postman 工具的使用方法。 安装和设置 首先,需要下载和安装 Postman 工具。…

[ChatGPT]-02-ChatGPT对安全的影响和开源的LLM大模型资源汇总

文章目录 0.ChatGPT大模型带来的影响0.1 ChatGPT带来信息化革命性创新,目前尚不能处理专业知识但成长很快0.2 Chat GPT为网安行业带来新的创新方向,也将引领新一轮投融资热潮0.2.1 攻击方发起网络攻击的门槛降低0.2.2 防守方合理使用ChatGPT可大幅减少安…

零基础入门前端--JavaScript 循环结构语句

循环控制 控制程序重复执行若干次相同或似的逻辑,理解并正确使用循环控制,需要搞清楚循环的3个要素:起始值、变化量、终止条件。 ○ 起始值循环的起点,可以是【任意数据类型值】 ○ 变化量是指【改变起始值的方式】 ○ 终止条…

深度学习算法及卷积神经网络

目录标题 传统神经网络矩阵计算:正则化:激活函数sigmoid损失函数前向传播激活函数Relu数据预处理DROP-OUT 卷积神经网络(CNN)1.CNN网络的构成2. 卷积层2.1 卷积的计算⽅法2.2 padding2.3 stride2.4 多通道卷积2.5 多卷积核卷积2..6 特征图大小 3. 池化层…

无法打开“fsevents.node

在Mac 打开vue项目的时候「c c」出现这个,可能是一个项目多个ide打开, 如何解决呢? 图1 把 node_modules 文件夹删了,在编译一把。也就是 npm install npm install

配置中心Disconf、SpringCloudConfig、Apollo、Nacos比较

Config Server Center 1、Disconf 1、1简介 2014年7月百度开源的配置管理中心,同样具备配置的管理能力,不过目前已经不维护了,最近的一次提交是两年前了。 2、SpringCloudConfig 2-1、简介 2014年9月开源,Spring Cloud 生态…

技术选型|日志采集和管理工具您都了解哪些,看这篇就够了

简介 对于日志管理当前网络上提供了大量的日志工具,今天就给大家分析总结一下这些常用工具的特点,希望对你们在选型时有所帮助,如果有用记得一键三连。 1、Filebeat Filebeat是用于转发和集中日志数据的轻量级传送程序。作为服务器上的代理…

2_STM32最小系统设计

MCU最小系统:一个MCU在正常工作中,正常下载程序前提下的最简电路。 最简电路包含: 供电电路、复位电路、时钟电路(高速时钟、低速时钟):2个外部晶振、Boot启动模式选择(跳线帽)、下载电路(uart/JTAG/SWD)、后备电池VBAT(维持后备区…

使用vscode+cmake进行c++代码编写

1. 前言 因为vcode的主题格式比visual studio好看,而且注释使用ctr/注释非常方便。所以对于一下小型的c代码测试,例如用不到外部库,只需要纯c自己语法,我就想和python一样,在vscode上写。因此记录一下比较简单的典型的…

SAP ABAP 使用SICF发布HTTP API接口

一、SE24创建类:Z_HCX_HTTP 1、创建类: 2、切换到接口(interface)页签,输入IF_HTTP_EXTENSION ,回车。切换到方法(method)页签,双击IF_HTTP_EXTENSION~HANDLE_REQUEST进…

Linux学习记录——십구 进程间通信(1) 管道

文章目录 1、进程间通信介绍1、目的2、发展 2、管道1、原理2、简单模拟实现3、总结 3、匿名管道——控制进程4、命名管道1、原理2、模拟实现 1、进程间通信介绍 之前所学都是单个进程,多个进程之间如何运转? 1、目的 数据传输:一个进程需要…

Linux下SOCKET编程

一、SOCKET编程 1、socket()函数 int socket(int protofamily, int type, int protocol);//返回sockfd返回值sockfd是描述符。 socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socke…

2. C++使用Thread线程参数传递问题

1. 说明 在子线程函数中进行参数传递,实际上是Thread类的构造函数对传递的参数进行了拷贝,拷贝到线程独立的内存中,及时参数是引用的形式,也可以在新线程中进行访问,如果参数传递时的类型不一致,在线程的上…

Servlet(二)

目录 1.Cookie 和 Session 1.1HttpServletRequest 类中的相关方法 1.HttpSession getSession() 2.Cookie[] getCookies() 1.2HttpServletResponse 类中的相关方法 1.void addCookie(Cookie cookie) 1.3HttpSession 类中的相关方法 1.4Cookie 类中的相关方法 1.5网页登录…

详解Spring Security

目录 1.概述 2.登录 2.1.默认用户 2.2.自定义用户 2.3.加密 2.4.绕过加密 2.5.怎么传递用户信息 2.6.记住我 3.登出 4.使用数据库 4.1.jdbcAuthentication 4.2.userDetailsService 5.自定义处理器 6.更多细粒度的控制 7.原理简述 1.概述 Spring Security是一个…