编程语言
首页 > 编程语言> > visdom可视化安装与入门使用(附带pytorch-MPL手写数字识别案例源码)

visdom可视化安装与入门使用(附带pytorch-MPL手写数字识别案例源码)

作者:互联网

注:附带案例需要有pytorch基础

0为什么用visdom而不用matplotlib或tensorboardX?

1.visdom可以直接接受torch的tensor,而不用转化成numpy array;
2.运行效率更高。 tensorboard会把数据写入文件,导致监听文件很大,占用大量的资源,且是每隔三十秒更新一次;而visdom直接在内存中获取数据,毫秒级刷新。

1.安装与使用

安装很简单,直接执行命令:pip install visdom

1.1开启服务

因为visdom本质上是一个类似于就jupyter notebook 的web服务器,在使用之前需要在终端打开服务
在终端中输入 python -m visdom.server(注意第一次运行的时候,visdom会去外网下载一些需要的文件,这时需要当前的网络能翻墙不然页面会一直卡在t might take a while那里不动。)
在这里插入图片描述
正常执行后,在浏览器中打开程序给出的网页http://localbost:8097
在这里插入图片描述
出现蓝底空白的页面,并且上排有一些bar,表示安装使用成功

1.2简单的使用

1.2.1绘制一条曲线

在这里插入图片描述
先创建一个visdom()实例;
viz.line(),前两个参数分别为y和x,win定义当前图的id,另外还有一个env参数,相当于一个更大范围的id,一个env可以包括多个win,在不指定env的情况下,env默认为‘main’
opt=定义一些每个图的具体设置,如title等;
再次调用viz.line(), 使用相同的env和win,将数据给到图中去,update定义数据的更新方式,‘append’表示附加。

1.2.2绘制多条曲线

在同一个图中绘制多条曲线时,只需要y的参数提供为一个list[y1, y2];
opts中加图标参数legend=[y1, y2]。
在这里插入图片描述

1.2.3可视化图片和文字等

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

2.pytorch训练识别手写数字网络过程的visdom可视化案例

现在终端启动visdom服务,在浏览器中打开程序给的网页,具体操作参考1.1

案例代码与解读

先导入需要的包

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

定义训练参数

batch_size=200
learning_rate=0.01
epochs=10
# 获取训练和测试数据
train_loader = torch.utils.data.DataLoader(
    datasets.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('../data', train=False, transform=transforms.Compose([
        transforms.ToTensor(),
        # transforms.Normalize((0.1307,), (0.3081,))
    ])),
    batch_size=batch_size, shuffle=True)
# 定义多层感知机(全连接网络)
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

# 定义训练过程
device = torch.device('cuda:0')
net = MLP().to(device)
optimizer = optim.SGD(net.parameters(), lr=learning_rate)
criteon = nn.CrossEntropyLoss().to(device)
# 定义两个用于可视化训练和测试过程visdom窗口,即两张图
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

这个代码块执行后,去查看visdom提高供的网页,可以发现网页中出现了两个定义的win,即两张没有数据的图
在这里插入图片描述

# 开始训练,并给图送入实时更新的数据,以可视化训练过程
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()

        global_step += 1
        # 给‘train_loss’送入数据
        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()))


    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’送入数据
    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)))

执行成功后,在visdom网页可以看到实时更新的训练过程的数据变化
在这里插入图片描述
每一个epoch测试数据更新一次
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

zinc_abc 发布了1 篇原创文章 · 获赞 0 · 访问量 30 私信 关注

标签:visdom,loss,nn,win,MPL,源码,test,data
来源: https://blog.csdn.net/weixin_43143670/article/details/104442750