torch.optim

本文详细介绍了PyTorch中torch.optim模块的使用,包括各种优化算法如Adadelta、Adagrad、Adam、AdamW等,并讨论了如何调整学习率,如LambdaLR、StepLR、MultiStepLR等。此外,还涵盖了优化器的参数组、状态管理和优化步骤的执行方法。

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

参考 torch.optim - 云+社区 - 腾讯云

目录

如何使用一个优化器

构建它

预参数选项

采取优化步骤

算法

class torch.optim.Optimizer(params, defaults)[source]

add_param_group(param_group)[source]

load_state_dict(state_dict)[source]

state_dict()[source]

zero_grad()[source]

class torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)[source]

class torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0)[source]

step(closure)[source]

class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)[source]

step(closure)[source]

class torch.optim.AdamW(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.01, amsgrad=False)[source]

step(closure)[source]

class torch.optim.SparseAdam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08)[source]

step(closure)[source]

class torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)[source]

step(closure)[source]

class torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)[source]

step(closure)[source]

class torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-05, tolerance_change=1e-09, history_size=100, line_search_fn=None)[source]

step(closure)[source]

class torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)[source]

step(closure)[source]

class torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))[source]

step(closure)[source]

class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)[source]

step(closure)[source]

如何调整学习率

class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)[source]

load_state_dict(state_dict)[source]

state_dict()[source]

class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)[source]

class torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)[source]

class torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)[source]

class torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)[source]

class torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)[source]

class torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr, max_lr, step_size_up=2000, step_size_down=None, mode='triangular', gamma=1.0, scale_fn=None, scale_mode='cycle', cycle_momentum=True, base_momentum=0.8, max_momentum=0.9, last_epoch=-1)[source]

get_lr()[source]


如何使用一个优化器

为了使用torch.optim,你必须构建一个优化对象,那将会保持现有的状态,并且基于计算的来更新参数。

构建它

为了构建一个优化器,你必须给定一个用来优化的参数的迭代器(所有应该是变量s)。然后,你能指定优化指定选项,例如学习率、权重衰减等。

注意:

If you need to move a model to GPU via .cuda(), please do so before constructing optimizers for it. Parameters of a model after .cuda() will be different objects with those before the call.In general, you should make sure that optimized parameters live in consistent locations when optimizers are constructed and used.

如果你通过.cuda()将一个模型移动到GPU,对它请在构建优化器之前这么做。.cuda()之后的模型参数与调用之前的参数是不同的对象。通常情况下,你应该确保使得优化在连续的位置上,当优化器构建和使用的时候。

例:

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr=0.0001)

预参数选项

Optimizers also support specifying per-parameter options. To do this, instead of passing an iterable of Variable s, pass in an iterable of dict s. Each of them will define a separate parameter group, and should contain a params key, containing a list of parameters belonging to it. Other keys should match the keyword arguments accepted by the optimizers, and will be used as optimization options for this group.

Optimizers也支持预参数选项。这么做,代替传递一个可迭代的变量s,传入一个可迭代的字典s。它们的每一个都会定一个分离的参数组,并且应该包含一个参数键,包含一个属于它的参数列表。其余键应该匹配优化器接受的关键字参数,并将作为这个组的优化选项。

注意:

注意你依然能够传递关键字参数。它们将会被用作默认值,在不重写它们的组中。当你仅仅想改变一个单一的选项时这很有用,同时保持参数组之间的所有其他一致。例如,当需要指定每层的学习速率时,这是非常有用的:

optim.SGD([
                {'params': model.base.parameters()},
                {'params': model.classifier.parameters(), 'lr': 1e-3}
            ], lr=1e-2, momentum=0.9)

This means that model.base’s parameters will use the default learning rate of 1e-2, model.classifier’s parameters will use a learning rate of 1e-3, and a momentum of 0.9 will be used for all parameters.

这意味着model.base的参数将会使用默认的学习率1e-2,model.classifier的参数将会适应1e-3,对所有参数动量都设置为0.9。

采取优化步骤

所有优化器实现一个step()方法用来更新参数。它的使用方法有两种:

optimizer.step()

这是大多数优化器都支持的简单版本。这个函数只调用一次,梯度计算用backward()来实现。

例:

for input, target in dataset:
    optimizer.zero_grad()
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()
    optimizer.step()
optimizer.step(closure)

一些优化算法例如联合提盒LBFGS需要重新评估函数多次,所以你必须传递一个闭包允许他们重新计算你的模型。闭包应该清除梯度,计算损失,并返回它。

例:

for input, target in dataset:
    def closure():
        optimizer.zero_grad()
        output = model(input)
        loss = loss_fn(output, target)
        loss.backward()
        return loss
    optimizer.step(closure)

算法

class torch.optim.Optimizer(params, defaults)[source]

所有优化器的基类。

Warning

需要将参数指定为具有确定性排序、在运行之间保持一致的集合。不满足这些属性的对象的例子是集合和字典值的迭代器。

参数:

  • params (iterable) – 一个可迭代的对象或者字典。指定了什么张量应该优化。

  • defaults – (dict): 包含优化选项默认值的字典(当一个优化器组不指定他们时才使用)

add_param_group(param_group)[source]

向Optimizer参数组加入一个参数组。当预先训练好的网络作为冻结层进行微调时,这是有用的,并且可以在训练过程中添加到优化器中。

参数:

  • param_group (dict) – 沿着组指定哪个张量应该优化。

  • optimization options. (specific) – 指定

load_state_dict(state_dict)[source]

载入优化器的状态。

参数:

  • state_dict (dict) – 优化器状态。应该是调用state_dict()的返回对象。

state_dict()[source]

以字典的形式返回优化器的状态。

It contains two entries:

它包含两个部分:

  • state - 保持目前优化器状态的字典。它的内容和优化器的类别不同。

  • param_groups - 包含所有优化器组的字典。

step(closure)[source]

执行一个单一的优化步骤(参数更新)。

参数:

  • closure (callable) – 重新评估并且返回损失的闭包。对大多数优化器是可选的。

zero_grad()[source]

清楚所有优化后的torch.Tensor的梯度。

class torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)[source]

实现Adadelta算法,实现这个算法的文章为:ADADELTA: An Adaptive Learning Rate Method

参数:

  • params (iterable) – 参数的可迭代性,以优化或dicts定义参数组

  • rho (float, optional) – 用来计算平方梯度平均值的系数(默认是0.9)

  • eps (float, optional) – 将项加到分母以提高数值稳定性(默认是1e-6)

  • lr (float, optional) – 在delta应用到参数之前对其进行缩放的系数(默认值:1.0)

  • weight_decay (float, optional) – 体重衰减(L2惩罚)(默认值:0)

tep(closure)[source]

执行一个单一的优化步骤(参数更新)。

参数:

  • closure (callable) – 重新评估并且返回损失的闭包。对大多数优化器是可选的。

class torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0)[source]

Implements Adagrad algorithm.

实现Adagrad算法,论文为:Adaptive Subgradient Methods for Online Learning and Stochastic Optimization

参数:

  • params (iterable) – 参数的可迭代性,以优化或dicts定义参数组

  • lr (float, optional) – 学习率(默认为1e-2)

  • lr_decay (float, optional) – 学习率衰减(默认值:0)

  • weight_decay (float, optional) – 权重衰减(L2 乘法)(默认:0)

step(closure)[source]

执行一个单一的优化步骤(参数更新)。

参数:

  • closure (callable) – 重新评估并且返回损失的闭包。对大多数优化器是可选的。

class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)[source]

实现Adam算法,论文为:Adam: A Method for St

### PyTorch `torch.optim` 使用方法及功能介绍 #### 一、模块概述 PyTorch 提供了一个灵活且强大的优化器模块 `torch.optim`,用于定义模型训练中的参数更新方式。该模块内置了许多经典的优化算法,如 Adam、AdamW 和 SGD 等,同时也支持自定义优化逻辑。 #### 二、常见优化器及其特点 以下是几种常用的优化器以及它们的功能: 1. **Adam Optimizer** - Adam 是一种基于梯度的一阶优化算法,结合了 AdaGrad 和 RMSProp 的优点。 - 它通过计算梯度的指数移动平均来动态调整每个参数的学习率。 - 在实际应用中,Adam 往往表现出良好的收敛性能和稳定性。 ```python optimizer = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-8, weight_decay=0, amsgrad=False) ``` 上述代码展示了如何初始化 Adam 优化器[^1]。 2. **AdamW Optimizer** - AdamW 是 Adam 的改进版本,在权重衰减方面表现更优。 - 它将 L2 正则化与 Adam 结合起来,从而更好地控制过拟合现象。 ```python optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.01, amsgrad=False) ``` 3. **SGD (Stochastic Gradient Descent)** - SGD 是最基础的随机梯度下降法,适用于许多场景。 - 可选配置包括动量项 (`momentum`)、Nesterov 动量 (`nesterov`) 和权重衰减 (`weight_decay`)。 ```python optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4, nesterov=True) ``` 这里展示的是带有 Nesterov 动量和 L2 正则化的 SGD 配置[^4]。 #### 三、学习率调度器 为了进一步提升模型性能,可以配合使用 `torch.optim.lr_scheduler` 来动态调整学习率。常见的调度策略如下: 1. **StepLR** - StepLR 按照固定的步长降低学习率。 - 用户需指定每几步(`step_size`)减少一次学习率,以及每次减少的比例(`gamma`)。 ```python scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1) ``` 2. **LambdaLR** - LambdaLR 允许用户通过函数定义学习率的变化规律。 ```python lambda_lr = lambda epoch: 0.95 ** epoch scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda_lr) ``` 3. **MultiStepLR** - MultiStepLR 类似于 StepLR,但在多个特定阶段改变学习率。 ```python scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[30, 80], gamma=0.1) ``` 4. **ExponentialLR** - ExponentialLR 实现按指数形式递减学习率。 ```python scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.9) ``` 上述四种调度器均属于逐步调整类,而其他高级调度器(如 CosineAnnealingLR 或 ReduceLROnPlateau)可根据具体需求选用][^[^23]。 #### 四、总结 `torch.optim` 不仅提供了丰富的优化器选项,还允许开发者轻松集成各种学习率调度机制。合理选择并调参能够显著改善模型训练效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wanderer001

ROIAlign原理

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值