Pytorch——可视化不同的优化器效果

本文通过自制数据集,使用Pytorch搭建神经网络模型,对比了SGD、Momentum、RMSprop和Adam四种常见优化器的效果,并通过可视化图像展示各优化器的损失变化趋势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言

今天主要运用Pytorch实现不同优化器的效果,以可视化的图像形式展现。

2.制造人工数据

为了对比各种优化器的效果, 我们需要有一些数据, 今天我们还是自己编一些伪数据, 这批数据是这样的:

import torch
from torch.utils.data import TensorDataset, DataLoader
import torch.nn.functional as F
import torch.nn as nn

torch.manual_seed(111)

#可人为设定大小的超参数
LR = 0.02
BATCH_SIZE = 8
EPOCHS = 10

x = torch.unsqueeze(torch.linspace(-1,1,100), dim = 1)  #unsqueeze() 是为了体现batch的维度
y = x.pow(2) + 0.08*torch.normal(torch.zeros(x.size()))

plt.scatter(x.numpy(), y.numpy())
plt.show()

在这里插入图片描述

3.做DataLoader迭代器

dataset = TensorDataset(x, y)
data_loader = DataLoader(
        dataset,
        batch_size = BATCH_SIZE,
        shuffle = True,
        num_workers = 2)

4.搭建神经网络模型

为了对比每一种优化器, 我们给他们各自创建一个神经网络, 但这个神经网络都来自同一个 NetWork形式

class NetWork(nn.Module):
    
    def __init__(self):
        super(NetWork, self).__init__()
        self.hidden = nn.Linear(1,8)
        self.output = nn.Linear(8,1)
    
    def forward(self,x):
        output = F.relu(self.hidden(x))  #经过一个隐藏层后再用ReLU激活
        output = self.output(output)
        return output
    
#实例化四个模型
network_for_SGD = NetWork()
network_for_Momentum = NetWork()
network_for_RMSprop = NetWork()
network_for_Adam = NetWork()

networks = [network_for_SGD, network_for_Momentum, network_for_RMSprop, network_for_Adam]  #放入list中以便于for循环

5.将神经网络模型放入优化器中

接下来在创建不同的优化器, 用来训练不同的网络. 并创建一个 loss_func 用来计算误差. 我们用几种常见的优化器, SGD, Momentum, RMSprop, Adam.

optimizer_for_SGD = torch.optim.SGD(network_for_SGD.parameters(), lr = LR)
network_for_Momentum = torch.optim.SGD(network_for_Momentum.parameters(), lr = LR, momentum = 0.8)
network_for_RMSprop = torch.optim.RMSprop(network_for_RMSprop.parameters(), lr = LR, alpha = 0.9)
network_for_Adam = torch.optim.Adam(network_for_Adam.parameters(), lr = LR, betas = (0.9,.099))

optimizers = [optimizer_for_SGD, network_for_Momentum, network_for_RMSprop, network_for_Adam]  #把优化器放入list中

loss_func = torch.nn.MSELoss()    #损失函数用均方误差(适用于回归)
loss_lists = [[],[],[],[]]       #用于记录误差

6.并对比不同优化器

for epoch in range(EPOCHS):
    print('Epoch:',epoch)
    for step, (b_x, b_y) in enumerate(data_loader):
        
        #b_x = Variable(b_x)
        #b_y = Variable(b_y)
        
        for network, optimizer, loss_list in zip(networks, optimizers, loss_lists):  #把三个列表捆在一起再一个一个拿出来
            output = network(b_x)
            loss = loss_func(output, b_y)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            loss_list.append(loss.data.numpy())

labels = ['SGD', 'Momentum', 'RMSprop', 'Adam']
plt.figure(1, figsize = (10,7))
for i,l_his in enumerate(loss_lists):
    plt.plot(l_his, label = labels[i])
plt.legend(loc = 'best')
plt.xlabel('Steps')
plt.ylabel('Loss')
plt.ylim(0,0.4)
plt.show()

在这里插入图片描述

### PyTorch CNN 可视化的实现方法 #### 工具介绍 PyTorch 提供了多种工具来帮助开发者可视化卷积神经网络(CNN)。这些工具不仅可以显示网络的结构,还可以用于分析模型的行为以及优化性能。以下是几种常用的可视化技术及其对应的实现方式。 --- #### 方法一:`torchinfo` 库 `torchinfo` 是一个强大的库,可以方便地展示模型的每一层信息,包括类型、输出形状和参数数量等[^2]。它还提供了关于整个模型的信息,例如总的参数量、模型大小以及单次前向或反向传播所需的内存大小[^3]。 ##### 安装 `torchinfo` 可以通过以下命令安装该库: ```bash pip install torchinfo ``` ##### 使用示例 假设有一个简单的 CNN 模型定义如下: ```python import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1) self.relu = nn.ReLU() self.pool = nn.MaxPool2d(kernel_size=2, stride=2) def forward(self, x): x = self.conv1(x) x = self.relu(x) x = self.pool(x) return x ``` 使用 `torchinfo.summary()` 函数可以轻松获得模型的详细信息: ```python from torchinfo import summary model = SimpleCNN() input_shape = (1, 3, 32, 32) # 输入张量形状 summary(model, input_data=input_shape) ``` 上述代码将打印出每层的具体信息,便于理解模型的工作原理。 --- #### 方法二:`TensorBoard` `TensorBoard` 是 TensorFlow 的官方可视化工具,但它也支持 PyTorch 集成。它可以用来监控训练过程中的指标变化,并能直观地展示模型结构[^5]。 ##### 安装 TensorBoard 如果尚未安装 `TensorBoard` 或其扩展包 `tensorboardX`,可通过以下命令完成安装: ```bash pip install tensorboard # 或者 pip install tensorboardX ``` ##### 使用示例 首先,在训练过程中记录日志文件: ```python from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter('runs/cnn_experiment') # 创建日志目录 dummy_input = torch.randn(1, 3, 32, 32) # 构造虚拟输入 writer.add_graph(model, dummy_input) # 添加模型图 writer.close() # 关闭写入器 ``` 运行以下命令启动 TensorBoard 并打开浏览器查看结果: ```bash tensorboard --logdir=runs/ ``` 这将在默认地址 `http://localhost:6006/` 上加载界面,其中可以看到模型的图形表示以及其他统计信息。 --- #### 方法三:Grad-CAM 可视化 Grad-CAM(Gradient-weighted Class Activation Mapping)是一种用于解释 CNN 输出的技术,可以帮助定位图像中哪些部分对预测结果贡献最大[^4]。 ##### 安装 Grad-CAM 通过 pip 命令即可安装 grad-cam 库: ```bash pip install grad-cam ``` ##### 使用示例 以下是一个基本的例子,演示如何利用 Grad-CAM 来高亮重要区域: ```python from torchvision.models import resnet18 from pytorch_grad_cam import GradCAM from pytorch_grad_cam.utils.image import show_cam_on_image from PIL import Image import numpy as np import cv2 # 加载预训练模型并设置目标层 model = resnet18(pretrained=True).eval() target_layer = model.layer4[-1] cam = GradCAM(model=model, target_layers=[target_layer], use_cuda=False) # 处理输入图片 image_path = 'example.jpg' rgb_img = np.array(Image.open(image_path)) / 255. input_tensor = preprocess(rgb_img) # 自定义预处理函数 grayscale_cam = cam(input_tensor=input_tensor)[0, :] visualization = show_cam_on_image(rgb_img, grayscale_cam, use_rgb=True) cv2.imshow("Visualization", visualization[:, :, ::-1]) # 调整通道顺序以便于 OpenCV 显示 cv2.waitKey(0) ``` 此脚本生成了一幅叠加热力图的新图像,突出显示了影响分类决策的关键特征。 --- ### 总结 以上三种方法分别适用于不同的场景需求——`torchinfo` 主要用于概览模型架构;`TensorBoard` 更适合动态跟踪实验进展;而 Grad-CAM 则聚焦于探索特定样本上的激活模式。根据实际项目的需求选择合适的方案即可达到理想的效果。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值