4.PyTorch——优化器

本文介绍了如何在PyTorch中使用随机梯度下降(SGD)优化器,包括基本用法、设置不同层的学习率以及调整学习率的方法。特别强调了如何为不同子网络设置特定的学习率和在调整学习率时的两种策略。
部署运行你感兴趣的模型镜像
import numpy as np
import pandas as pd

import torch as t

PyTorch将深度学习中常用的优化方法全部封装在torch.optim中,其设计十分灵活,能够很方便的扩展成自定义的优化方法。

所有的优化方法都是继承基类optim.Optimizer,并实现了自己的优化步骤。下面就以最基本的优化方法——随机梯度下降法(SGD)举例说明。这里需重点掌握:

  • 优化方法的基本使用方法
  • 如何对模型的不同部分设置不同的学习率
  • 如何调整学习率
# 定义一个LeNet网络
class Net(t.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.features = t.nn.Sequential(
                        t.nn.Conv2d(3, 6, 5),
                        t.nn.ReLU(),
                        t.nn.MaxPool2d(2, 2),
                        t.nn.Conv2d(6, 16, 5),
                        t.nn.ReLU(),
                        t.nn.MaxPool2d(2, 2)
        )
        self.classifier = t.nn.Sequential(
                        t.nn.Linear(16*5*5, 120),
                        t.nn.ReLU(),
                        t.nn.Linear(120, 84),
                        t.nn.ReLU(),
                        t.nn.Linear(84, 10)
        )

    def  forward(self, x):
        x = self.features(x)
        x = x.view(-1, 16*5*5)
        x = self.classifier(x)
        return x

net = Net()
optimizer = t.optim.SGD(params=net.parameters(), lr=1)
optimizer.zero_grad()     # 梯度清零

input = t.randn(1, 3, 32, 32)
output = net(input)
output.backward(output)   

optimizer.step()   # 执行优化
# 为不同子网络设置不同的学习率,在finetune中经常用到
# 如果对某个参数不指定学习率,就使用最外层的默认学习率
optimizer = t.optim.SGD([
                {'params': net.features.parameters()}, # 学习率为1e-5
                {'params': net.classifier.parameters(), 'lr': 1e-2}
            ], lr=1e-5)
optimizer
SGD (
Parameter Group 0
    dampening: 0
    differentiable: False
    foreach: None
    lr: 1e-05
    maximize: False
    momentum: 0
    nesterov: False
    weight_decay: 0

Parameter Group 1
    dampening: 0
    differentiable: False
    foreach: None
    lr: 0.01
    maximize: False
    momentum: 0
    nesterov: False
    weight_decay: 0
)
# 只为两个全连接层设置较大的学习率,其余层的学习率较小
special_layers = t.nn.ModuleList([net.classifier[0], net.classifier[3]])
special_layers_params = list(map(id, special_layers.parameters()))
base_params = filter(lambda p: id(p) not in special_layers_params, net.parameters())

optimizer = t.optim.SGD([{'params':base_params},
                         {'params':special_layers.parameters(), 'lr':0.01}], lr=0.001)
optimizer
SGD (
Parameter Group 0
    dampening: 0
    differentiable: False
    foreach: None
    lr: 0.001
    maximize: False
    momentum: 0
    nesterov: False
    weight_decay: 0

Parameter Group 1
    dampening: 0
    differentiable: False
    foreach: None
    lr: 0.01
    maximize: False
    momentum: 0
    nesterov: False
    weight_decay: 0
)

对于如何调整学习率,主要有两种做法。一种是修改optimizer.param_groups中对应的学习率,另一种是更简单也是较为推荐的做法——新建优化器,由于optimizer十分轻量级,构建开销很小,故而可以构建新的optimizer。但是后者对于使用动量的优化器(如Adam),会丢失动量等状态信息,可能会造成损失函数的收敛出现震荡等情况。

# 方法1: 调整学习率,新建一个optimizer
old_lr = 0.1
optimizer1 = t.optim.SGD([
                {'params': net.features.parameters()},
                {'params': net.classifier.parameters(), 'lr': old_lr*0.1}
            ], lr=1e-5)
optimizer1
SGD (
Parameter Group 0
    dampening: 0
    differentiable: False
    foreach: None
    lr: 1e-05
    maximize: False
    momentum: 0
    nesterov: False
    weight_decay: 0

Parameter Group 1
    dampening: 0
    differentiable: False
    foreach: None
    lr: 0.010000000000000002
    maximize: False
    momentum: 0
    nesterov: False
    weight_decay: 0
)
# 方法2: 调整学习率, 手动decay, 保存动量
for param_group in optimizer.param_groups:
    param_group['lr'] *= 0.1 # 学习率为之前的0.1倍
optimizer
SGD (
Parameter Group 0
    dampening: 0
    differentiable: False
    foreach: None
    lr: 0.0001
    maximize: False
    momentum: 0
    nesterov: False
    weight_decay: 0

Parameter Group 1
    dampening: 0
    differentiable: False
    foreach: None
    lr: 0.001
    maximize: False
    momentum: 0
    nesterov: False
    weight_decay: 0
)

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### SSD 实现在 PyTorch 中的应用 #### 使用 `ssd.pytorch` 库安装和配置指南 对于希望基于 PyTorch 构建并训练 SSD 模型的研究者而言,`ssd.pytorch` 提供了一个完整的解决方案[^1]。此库不仅实现了经典的 SSD 网络结构,还提供了详细的文档指导用户完成环境搭建以及模型调优。 为了快速上手该工具包,建议按照官方提供的安装说明操作: ```bash # 克隆仓库到本地 git clone https://gitcode.com/gh_mirrors/ss/ssd.pytorch.git cd ssd.pytorch # 创建虚拟环境并激活 (推荐使用 conda) conda create -n ssd python=3.7 conda activate ssd # 安装依赖项 pip install -r requirements.txt ``` 接着可以运行预定义的数据集下载脚本准备 COCO 或 VOC 数据集用于后续实验。 #### 利用 `pytorch-ssd` 扩展功能特性 除了基础版本外,还有其他社区贡献的变体如 `pytorch-ssd` 支持更多网络架构的选择,包括但不限于 MobileNetV1/V2 和 VGG,这使得开发者能够灵活调整性能与速度之间的平衡以适应不同应用场景的需求[^2]。 特别是针对移动设备优化过的轻量化版本——MobileNetV2-SSD Lite,在保持较高精度的同时大幅减少了计算量,非常适合部署至边缘端执行实时推理任务。 以下是创建一个简单的 SSD 训练流程实例: ```python from data import * from utils.augmentations import SSDAugmentation from layers.modules import MultiBoxLoss from ssd import build_ssd if __name__ == '__main__': # 加载数据集 dataset = VOCDetection(root='path/to/voc', transform=SSDAugmentation()) # 初始化网络 net = build_ssd('train', size=300, num_classes=len(labelmap)+1) # 设置损失函数和其他超参数... ``` 通过上述代码片段可以看出构建过程相对直观易懂,同时也展示了如何集成自定义组件来增强原有框架的功能性。 #### 移动平台上的应用案例 —— Android 版本 最后值得一提的是存在专门面向移动端开发者的资源,例如 Python Mobilenetssd Android 项目就提供了一套完整的方案让使用者能够在智能手机和平板电脑等便携装置上面高效地运行目标检测算法[^3]。 这种跨平台的支持极大地促进了计算机视觉技术向更广泛领域渗透的可能性,也为广大爱好者和技术人员开辟了新的探索方向。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值