【pytorch24】Visdom可视化

news2024/12/28 5:42:22

TensorboardX

pytorch有一个工具借鉴了tensorboard

pip install tensorboardX
在这里插入图片描述
有查看变量的数值、监听曲线等功能

如何使用
在这里插入图片描述
新建SummaryWriter()实例

要把监听的数据,比如说要监听dummy_s1[0](y
坐标)存放到data/scalar1中,n_iter是哪一个epoch的(即x坐标,n_iter时间戳的数据)

tensorboard本质上是抽取numpy的数据,如果要跟tensor直接做转换的话,需要把tensor转换到cpu上

Visdom

visdom可以接收tensor,且运行效率更高,因为tensorboard会把数据写到文件里面去,经常会导致监听文件非常大
在这里插入图片描述
如何安装visdompip install visdom

安装完成之后需要开启监听的进程,visdom本质上是可一个web服务器,程序向web服务器丢数据,这个web服务器会把数据渲染到网页上去
,因此确保程序在运行之前要确保开启visdompython -m visdom.server

在这里插入图片描述
在windows上可能会遇到这个问题

如果遇到这个问题,从0开始安装

  1. 先把现在安装的visdom卸载pip unstall visdom
  2. 从官方网页下载最新的源代码visdom
  3. 进入visdom目录中运行pip install -e.

在这里插入图片描述

这样安装会省略很多麻烦

退回到用户目录运行python -m visdom.server
在这里插入图片描述
在这里插入图片描述

功能

画一条曲线,比如train loss

在这里插入图片描述
创建一条直线viz.line([0.],[0.],win='train_loss',opts=dict(title='train loss')) 首先给一个初始的点,这里只有一个点,第一个[0.]的意思是Y赋值为0,第二个[0.]的意思是X赋值为0,win是一个唯一的标识符可以理解为id,还有另外一个id叫env,visdom每一个大的窗口是一个env,这个窗口可以理解为程序,一个程序里面可能有很多小窗口,env不指定的话默认是main,会在main窗口里面创建小窗口,查询现有的窗口有没有train_loss这个id,没有的话就会创建一个win,opts会配置额外的配置信息,比如把窗口名字命名成train_loss,可以很好的识别倒是的train_loss,还是test_loss

通过这句话会创建一个train_loss窗口,点只有[0,0]

viz.line([loss.item()],[global_step],win='train loss',update='append'),在训练的时候把数据逐步添加进去,X坐标是[global_step](时间戳),Y坐标是[loss.item()],对于非image数据传入的还是一个numpy数据,但是image可以直接接收tensor,需要指定update操作时append,添加在当前的直线后面
在这里插入图片描述

多条曲线

在这里插入图片描述
一个曲线占用一个窗口的话,会使得窗口非常多

比如要同时看train loss 和 test loss,此时Y要同时传入两个数值[Y1,Y2],legend接收list,代表了Y1的label和Y2的label

在这里插入图片描述
两条线范围不一样,loss是0到100,accuracy是0到1,看起来会很奇怪

visual X

可视化

在这里插入图片描述
data是[batch,1,28,28]的tensor,如果使用tensorboardX的话必须复制到cpu上,即.cpu().numpy()数据才能传给tensorboard

还可以看字符串,把pred的值转换成string类型
在这里插入图片描述

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms

from visdom import Visdom


def load_data(batch_size):
    train_loader = torch.utils.data.DataLoader(
        datasets.MNIST('mnist_data', 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('mnist_data', train=False, transform=transforms.Compose([
            transforms.ToTensor(),
            # transforms.Normalize((0.1307,), (0.3081,))
        ])),
        batch_size=batch_size, shuffle=True)
    return train_loader, test_loader


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 x


def training(train_loader, device, net, viz, global_step):
    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 += 1
        viz.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()))


def testing(test_loader, device, net, viz, global_step):
    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()

    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)))


global net

if __name__ == '__main__':
    batch_size = 200
    learning_rate = 0.01
    epochs = 10

    train_loader, test_loader = load_data(batch_size)

    device = torch.device('cuda:0')
    net = MLP().to(device)
    optimizer = optim.SGD(net.parameters(), lr=learning_rate)
    criteon = nn.CrossEntropyLoss().to(device)

    # 需要启动Visdom
    # python -m visdom.server
    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 = 0

    for epoch in range(epochs):
        training(train_loader, device, net, viz, global_step)
        testing(test_loader, device, net, viz, global_step)

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

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

相关文章

普中51单片机:中断系统与寄存器解析(六)

文章目录 引言中断流程图中断优先级下降沿中断结构图中断相关寄存器IE中断允许寄存器(可位寻址)XICON辅助中断控制寄存器(可位寻址)TCON标志控制寄存器SCON串行口控制寄存器 中断号中断响应条件中断函数代码模板电路图开发板IO连接…

洁净车间的压缩空气质量如何检测(露点、水油、粒子、浮游菌)

通常一个空压机站的设备即为一个狭义的压缩空气系统,下图为一个典型的压缩空气系统流程图: 气源设备(空气压缩机)吸入大气,将自然状态下的空气压缩成为具有较高压力的压缩空气,经过净化设备除去压缩空气中的…

新手如何正确学习Python?分享我是如何2个月熟练掌握Python的!学习大纲+学习方式+学习资料 汇总!

前言 一直以来都有很多想学习Python的朋友们问我,学Python怎么学?爬虫和数据分析怎么学?web开发的学习路线能教教我吗? 我先告诉大家一个点,不管你是报了什么培训班,还是自己在通过各种渠道自学&#xff…

[C++][ProtoBuf][Proto3语法][三]详细讲解

目录 1.默认值2.更新消息1.更新规则2.保留字段reserved 3.未知字段1.是什么?2.未知字段从哪获取 4.前后兼容性5.选项option1.选项分类2.常用选项列举3.设置自定义选项 1.默认值 反序列化消息时,如果被反序列化的⼆进制序列中不包含某个字段,…

elasticsearch集群模式部署

系统版本:CentOS Linux release 7.9.2009 (Core) es版本: elasticsearch-7.6.2 本次搭建es集群为三个节点 添加启动用户 确保elasticsearch的启动用户为普通用户,这里我创建了es用户用于启动elasticsearch 执行命令为es用户添加sudo权限 v…

数学建模及国赛

认识数学建模及国赛 认识数学建模 环境类:预测一下明天的气温 实证类: 评价一下政策的优缺点 农业类: 预测一下小麦的产量 财经类: 分析一下理财产品的最优组合 规划类: 土地利用情况进行 合理的划分 力学类&#xf…

如何在 CentOS 中配置 Linux 命名空间(ip netns)

引言 Linux 命名空间是一项强大的技术,允许在同一系统上创建多个独立的虚拟化实例,每个实例可以拥有自己的网络栈、路由表、IP 地址等网络资源,实现资源的隔离和管理。本文将深入探讨如何在 CentOS 中配置和使用 ip netns 命名空间&#xff0…

网络安全合规建设

网络安全合规建设 一、法律安全需求基本合规(1)《网络安全法》重要节点等级保护政策核心变化 二、安全需求 业务刚需(1)内忧(2)外患 三、解决方法(1)总安全战略目标图(2&…

PaddleVideo:Squeeze Time算法移植

参考PaddleVideo/docs/zh-CN/contribute/add_new_algorithm.md at develop PaddlePaddle/PaddleVideo GitHubAwesome video understanding toolkits based on PaddlePaddle. It supports video data annotation tools, lightweight RGB and skeleton based action recognitio…

Xilinx FPGA UltraScale SelectIO 接口逻辑资源

目录 1. 简介 2. Bank Overview 2.1 Diagram 2.2 IOB 2.3 Slice 2.4 Byte Group 2.5 I/O bank 示例 2.6 Pin Definition 2.7 数字控制阻抗(DCI) 2.8 SelectIO 管脚供电电压 2.8.1 VCCO 2.8.2 VREF 2.8.3 VCCAUX 2.8.4 VCCAUX_IO 2.8.5 VCCINT_IO 3. 总结 1. 简介…

基于信号量的生产者消费者模型

文章目录 信号量认识概念基于线程分析信号量信号量操作 循环队列下的生产者消费者模型理论认识代码部分 信号量 认识概念 信号量本质: 计数器 它也叫做公共资源 为了线程之间,进程间通信------>多个执行流看到的同一份资源---->多个资源都会并发访问这个资源(此时易出现…

【Qt课设】基于Qt实现的中国象棋

一、摘 要 本报告讨论了中国象棋程序设计的关键技术和方法。首先介绍了中国象棋的棋盘制作,利用Qt中的一些绘画类的函数来进行绘制。在创作中国象棋棋子方面,首先,我们先定义一下棋子类,将棋子中相同的部分进行打包,使…

Python:安装/Mac

之前一直陆陆续续有学python!今天开始!正式开肝!!! 进入网站:可能会有点慢,多开几个网页 https://www.python.org 点击下载,然后进入新的页面,往下滑 来到File&#xff0…

PHP验证日本免费电话号码格式

首先,您需要了解免费电话号码的格式。 日本免费电话也就那么几个号段:0120、0990、0180、0570、0800等开头的,0800稍微特殊点,在手机号里面有080 开头,但是后面不一样了。 关于免费电话号码的划分,全部写…

忘记Apple ID密码怎么退出苹果ID账号?

忘记Apple ID密码怎么退出账号?Apple ID对每个苹果用户来说都是必不可少的,没有它,用户就不能享受iCloud、App Store、iTunes等服务。苹果手机软件下载、丢失解锁、恢复出厂设置等都需要使用Apple ID。如果忘记Apple ID 密码,这会…

Linux——多线程(五)

1.线程池 1.1初期框架 thread.hpp #include<iostream> #include <string> #include <unistd.h> #include <functional> #include <pthread.h>namespace ThreadModule {using func_t std::function<void()>;class Thread{public:void E…

九、Linux二进制安装ElasticSearch集群

目录 九、Linux二进制安装ElasticSearch集群1 下载2 安装前准备(单机&#xff0c;集群每台机器都需要配置)3 ElasticSearch单机&#xff08;7.16.2&#xff09;4 ElasticSearch集群&#xff08;8.14.2&#xff09;4.1 解压文件&#xff08;先将下载文件放到/opt下&#xff09;4…

Java系列-valitile

背景 volatile这个关键字可以说是面试过程中出现频率最高的一个知识点了&#xff0c;面试官的问题也是五花八门&#xff0c;各种刁钻的角度。之前也是简单背过几道八股文&#xff0c;什么可见性&#xff0c;防止指令重拍等&#xff0c;但面试官一句&#xff1a;volatile原理是什…

Vue基础--v-model/v-for/事件属性/侦听器

目录 一 v-model表单元素 1.1 v-model绑定文本域的value 1.1.1 lazy属性&#xff1a;光标离开再发请求 1.1.2 number属性&#xff1a;如果能转成number就会转成numer类型 1.1.3 trim属性&#xff1a;去文本域输入的前后空格 1.2v-model绑定单选checkbox 1.3代码展示 二 …

Python OpenCV 教学取得视频资讯

这篇教学会介绍使用OpenCV&#xff0c;取得影像的长宽尺寸、以及读取影像中某些像素的颜色数值。 因为程式中的OpenCV 会需要使用镜头或GPU&#xff0c;所以请使用本机环境( 参考&#xff1a;使用Python 虚拟环境) 或使用Anaconda Jupyter 进行实作( 参考&#xff1a;使用Anaco…