第4章 PyTorch数据处理工具箱(2/2)

4.4 可视化工具

TensorBoard是Google TensorFlow 的可视化工具,可以记录训练数据、评估数据、网络结构、图像等,并且可以在Web上展示,对于观察神经网路训练的过程非常有帮助。PyTorch支持tensorboard_logger、 visdom等可视化工具。

4.4.1 TensorBoard简介

TensorBoard功能很强大,支持scalar、image、figure、histogram、audio、text、graph、onnx_graph、embedding、pr_curve、videosummaries等可视化方式。
使用TensorBoard的一般步骤如下。
1)导入tensorboard,实例化SummaryWriter类,指明记录日志路径等信息。

from torch.utils.tensorboard import SummaryWriter
#实例化SummaryWriter,并指明日志存放路径。在当前目录没有logs目录将自动创建。
writer = SummaryWriter(log_dir='logs')
#调用实例
writer.add_xxx()
#关闭writer
writer.close()

 【说明】
(1)其中logs指生成日志文件路径,如果是在Windows环境下,需要注意其logs路径格式与Linux环境不同,需要使用转义字符或在字符串前加r,如
writer = SummaryWriter(log_dir=r'D:\myboard\test\logs')
(2)SummaryWriter的格式为:

SummaryWriter(log_dir=None, comment='', **kwargs)  
#其中comment在文件命名加上comment后缀

(3)如果不写log_dir,系统将在当前目录创建一个runs的目录。

2)调用相应的API接口,接口一般格式为:

add_xxx(tag-name, object, iteration-number)
#即add_xxx(标签,记录的对象,迭代次数)

3)启动tensorboard服务。cd到logs目录所在的同级目录,在命令行输入如下命令,logdir等式右边可以是相对路径或绝对路径。

tensorboard --logdir=logs --port 6006   
#如果是windows环境,要注意路径解析,如
#tensorboard --logdir=r'D:\myboard\test\logs' --port 6006

 4)Web展示。在浏览器输入:

http://服务器IP或名称:6006  #如果是本机,服务器名称可以使用localhost

便可看到logs目录保存的各种图形,如图4-4所示。

图4-4 TensorBoard示例图形
鼠标在图形上移动,还可以看到对应位置的具体数据。

4.4.2用TensorBoard可视化神经网络

4.4.1节介绍了TensorBoard的主要内容,为帮助大家更好地理解,下面我们将介绍几个实例。实例内容涉及如何使用TensorBoard可视化神经网络模型、可视化损失值、图像等。
1)导入需要的模块。

import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
from torch.utils.tensorboard import SummaryWriter

2)构建神经网络。

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)
        self.bn = nn.BatchNorm2d(20)
 
    def forward(self, x):
        x = F.max_pool2d(self.conv1(x), 2)
        x = F.relu(x) + F.relu(-x)
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = self.bn(x)
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        x = F.softmax(x, dim=1)
        return x

 3)把模型保存为graph。

#定义输入
input = torch.rand(32, 1, 28, 28)
#实例化神经网络
model = Net()
#将model保存为graph
with SummaryWriter(log_dir='logs',comment='Net') as w:
w.add_graph(model, (input, ))

 打开浏览器,便可看到图4-5所示的可视化计算图。
图4-5 TensorBoard可视化计算图

4.4.3用TensorBoard可视化损失值

可视化损失值,使用add_scalar函数,这里利用一层全连接神经网络,训练一元二次函数的参数。

dtype = torch.FloatTensor
writer = SummaryWriter(log_dir='logs',comment='Linear')
np.random.seed(100) 
x_train = np.linspace(-1, 1, 100).reshape(100,1) 
y_train = 3*np.power(x_train, 2) +2+ 0.2*np.random.rand(x_train.size).reshape(100,1) 
 
model = nn.Linear(input_size, output_size)
 
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
 
for epoch in range(num_epoches):
    inputs = torch.from_numpy(x_train).type(dtype)
    targets = torch.from_numpy(y_train).type(dtype)
 
    output = model(inputs)
    loss = criterion(output, targets)
 
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    # 保存loss的数据与epoch数值
writer.add_scalar('训练损失值', loss, epoch)

运行结果如图4-6所示。

图4-6 可视化损失值与迭代步的关系

4.4.4用TensorBoard可视化特征图

利用TensorBoard对特征图进行可视化,不同卷积层的特征图的抽取程度是不一样的。
x从cifair10数据集获取。注意:因PyTorch1.7 utils有一个bug,这里使用了PyTorch1.10版的utils。

#import torchvision.utils as vutils
##因pytorch1.7 utils有一个bug,
##这里使用了当前最新的utils版本(v1.10)
import utils as vutils 
writer = SummaryWriter(log_dir='logs',comment='feature map')
 
img_grid = vutils.make_grid(x, normalize=True, scale_each=True, nrow=2)
net.eval()
for name, layer in net._modules.items():
 
    # 为fc层预处理x
    x = x.view(x.size(0), -1) if "fc" in name else x
    print(x.size())
 
    x = layer(x)
    print(f'{name}')
 
    # 查看卷积层的特征图
    if  'layer' in name or 'conv' in name:
        x1 = x.transpose(0, 1)  # C,B, H, W  ---> B,C, H, W
        img_grid = vutils.make_grid(x1, normalize=True, scale_each=True, nrow=4)  # normalize进行归一化处理
        writer.add_image(f'{name}_feature_maps', img_grid, global_step=0)

运行结果如图4-7、图4-8所示。

图4-7 conv1的特征图

图4-8 conv2的特征图

4.5 小结

本章详细介绍了PyTorch有关数据下载、预处理方面的一些常用包,以及可视化计算结果的TensorBoard工具,并通过一些实例详细说明如何使用这些包或工具。第1-4章介绍了有关NumPy及PyTorch的基础知识,这有助于读者更好理解和使用接下来的深度学习方面的基本概念、原理和算法等内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值