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测试数据更新一次
标签:visdom,loss,nn,win,MPL,源码,test,data 来源: https://blog.csdn.net/weixin_43143670/article/details/104442750