> 文章列表 > [chapter27][PyTorch][visdom]

[chapter27][PyTorch][visdom]

[chapter27][PyTorch][visdom]

前言:

           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 timedef  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 timedef 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 xdef train():batch_size = 128learning_rate = 1e-3epochs = 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 = 0correct = 0for 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以及对应的测试集损失lossviz.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博客

英语口语