matplotlib输出图形到网页_pytorch使用matplotlib和tensorboard实现模型和训练的可视化...

pytorch构建和训练深度学习模型的过程中,往往需要能够直观的观测到可视化的过程,比如画出训练曲线等。

对于简单的曲线绘制可以使用matplotlib库做出基本的图,如果需要更加高级的可视化过程,pytorch有好几个工具都可以做到,比如tensorwatch,visdom,tensorboard,实测下来发现tensorboard用起来比较方便和成熟稳定。

(pytorch自从1.2版本依赖就正式支持了独立的tensorboard,不再需要去安装tensorboardX了)

本文通过简单线性模型训练来讲解如何使用这两种可视化方法。

安装依赖

这里用的pytorch1.5 cpu版本,需要额外安装matplotlib和tensorboard库

pip 

代码

引入模块

import 

准备数据

这里用一个简单的线性模型为例

# real parameter

输入两个特征值,输出一个结果

通过随机数构造批量特征值矩阵,并增加随机噪声

# prepare data

定义模型

根据输入输出维度构建一个简单的线性层

# define model

定义训练参数

lr 

通过matplotlib可视化

在训练过程中保存中间结果,然后用matplotlib画出损失曲线

# define draw
# train and visualize

结果如下

=== train begin ===
epoch 0: train loss 1.163743, test loss 1.123318
epoch 10: train loss 0.002227, test loss 0.001833
epoch 20: train loss 0.000107, test loss 0.000106
epoch 30: train loss 0.000101, test loss 0.000106
epoch 40: train loss 0.000100, test loss 0.000104
epoch 50: train loss 0.000101, test loss 0.000104
epoch 60: train loss 0.000100, test loss 0.000103
epoch 70: train loss 0.000101, test loss 0.000102
epoch 80: train loss 0.000100, test loss 0.000103
epoch 90: train loss 0.000103, test loss 0.000103
final epoch: train loss 0.000100, test loss 0.000102
plot curves
=== train end ===

6e502744f88280e7fe6643b357794513.png

查看一下训练后好的参数

print 
Parameter containing:
tensor([[ 1.9967, -3.3978]], requires_grad=True)
 
Parameter containing:
tensor([4.2014], requires_grad=True)

通过tensorboard可视化

启动tensorboard显示网页

先引入模块

# train with tensorboard

定义一个writer,记录的中间数据会落到对应的目录中去用于显示

writer 

此时用命令行启动tensorboard网页服务

tensorboard --logdir=runs

然后打开 http://localhost:6006/ 网页进入tensorboard主页面

模型可视化

tensorboard可以通过传入一个样本,写入graph到日志中,在网页上看到模型的结构

sample 

刷新网页即可看到

732e6eeebc429c4b764500ce9c532fd9.png

训练过程可视化

定义新的训练函数,在过程中写入对应的scalar数据,就可以由tensorboard绘制出曲线

# trian and record scalar

结果如下

=== train begin ===
epoch 0: train loss 0.928869, test loss 0.978139
epoch 10: train loss 0.000948, test loss 0.000902
epoch 20: train loss 0.000102, test loss 0.000104
epoch 30: train loss 0.000101, test loss 0.000105
epoch 40: train loss 0.000101, test loss 0.000102
epoch 50: train loss 0.000100, test loss 0.000103
epoch 60: train loss 0.000101, test loss 0.000105
epoch 70: train loss 0.000102, test loss 0.000103
epoch 80: train loss 0.000104, test loss 0.000110
epoch 90: train loss 0.000100, test loss 0.000103
final epoch: train loss 0.000101, test loss 0.000104
=== train end ===

刷新页面可以看到

2e7e290a715652f1e62513ced8bae680.png

更多高阶用法就有待于自己去摸索研究了

94a9de1e6eb4b93c9bd43c061164e750.png
支持是知识分享的动力,有问题可扫码哦
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
训练前代码: ```python import torch import numpy as np from sklearn.manifold import TSNE import matplotlib.pyplot as plt # 定义模型 class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = torch.nn.Linear(784, 512) self.fc2 = torch.nn.Linear(512, 256) self.fc3 = torch.nn.Linear(256, 10) self.relu = torch.nn.ReLU() def forward(self, x): x = x.view(-1, 784) x = self.relu(self.fc1(x)) x = self.relu(self.fc2(x)) x = self.fc3(x) return x # 加载数据 train_loader = torch.utils.data.DataLoader( torchvision.datasets.MNIST('./data', train=True, download=True, transform=torchvision.transforms.Compose([ torchvision.transforms.ToTensor(), torchvision.transforms.Normalize( (0.1307,), (0.3081,)) ])), batch_size=64, shuffle=True) # 创建模型和优器 model = Net() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 训练模型 for epoch in range(10): for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() output = model(data) loss = torch.nn.functional.cross_entropy(output, target) loss.backward() optimizer.step() # 获取网络输出 outputs = [] labels = [] for batch_idx, (data, target) in enumerate(train_loader): output = model(data) outputs.append(output.detach().numpy()) labels.append(target.numpy()) outputs = np.concatenate(outputs, axis=0) labels = np.concatenate(labels, axis=0) # 使用t-SNE降维并可 tsne = TSNE(n_components=2, perplexity=30, init='pca', n_iter=5000) outputs_tsne = tsne.fit_transform(outputs) plt.scatter(outputs_tsne[:, 0], outputs_tsne[:, 1], c=labels) plt.show() ``` 训练后代码: ```python import torch import numpy as np from sklearn.manifold import TSNE import matplotlib.pyplot as plt # 定义模型 class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = torch.nn.Linear(784, 512) self.fc2 = torch.nn.Linear(512, 256) self.fc3 = torch.nn.Linear(256, 10) self.relu = torch.nn.ReLU() def forward(self, x): x = x.view(-1, 784) x = self.relu(self.fc1(x)) x = self.relu(self.fc2(x)) x = self.fc3(x) return x # 加载数据 train_loader = torch.utils.data.DataLoader( torchvision.datasets.MNIST('./data', train=True, download=True, transform=torchvision.transforms.Compose([ torchvision.transforms.ToTensor(), torchvision.transforms.Normalize( (0.1307,), (0.3081,)) ])), batch_size=64, shuffle=True) # 创建模型和优器 model = Net() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 加载已训练好的模型参数 model.load_state_dict(torch.load('model.pth')) # 获取网络输出 outputs = [] labels = [] for batch_idx, (data, target) in enumerate(train_loader): output = model(data) outputs.append(output.detach().numpy()) labels.append(target.numpy()) outputs = np.concatenate(outputs, axis=0) labels = np.concatenate(labels, axis=0) # 使用t-SNE降维并可 tsne = TSNE(n_components=2, perplexity=30, init='pca', n_iter=5000) outputs_tsne = tsne.fit_transform(outputs) plt.scatter(outputs_tsne[:, 0], outputs_tsne[:, 1], c=labels) plt.show() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值