前言:
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 time
def 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 time
def 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 x
def train():
batch_size = 128
learning_rate = 1e-3
epochs = 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 = 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_loss /= len(test_loader.dataset)
# 绘制epoch以及对应的测试集损失loss
viz.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博客