您的位置:首页 > 其它

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

2020-04-21 23:53 429 查看

注:附带案例需要有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测试数据更新一次


  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
zinc_abc 发布了3 篇原创文章 · 获赞 3 · 访问量 551 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐