`
wx1568037608
  • 浏览: 33489 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

pytorch 优化器调参

 
阅读更多

torch.optim

  1. 如何使用optimizer
  2. 算法
  3. 如何调整学习率

torch.optim是实现各种优化算法的包。最常用的方法都已经支持,接口很常规,所以以后也可以很容易地集成更复杂的方法。

如何使用optimizer

要使用torch.optim,您必须构造一个optimizer对象。这个对象能保存当前的参数状态并且基于计算梯度更新参数

构建

要构造一个Optimizer,你必须给它一个包含参数(必须都是Variable对象)进行优化。然后,您可以指定optimizer的参 数选项,比如学习率,权重衰减等。

例子:

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

为每个参数单独设置选项

Optimizer也支持为每个参数单独设置选项。若想这么做,不要直接传入Variableiterable,而是传入dict的iterable。每一个dict都分别定 义了一组参数,并且包含一个param键,这个键对应参数的列表。其他的键应该optimizer所接受的其他参数的关键字相匹配,并且会被用于对这组参数的 优化。

注意:

您仍然可以将选项作为关键字参数传递。它们将被用作默认值,在不覆盖它们的组中。当您只想改变一个选项,同时保持参数组之间的所有其他选项一致时,这很有用。

例如,当我们想指定每一层的学习率时,这是非常有用的:

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

这意味着model.base参数将使用默认的学习速率1e-2model.classifier参数将使用学习速率1e-3,并且0.9momentum将会被用于所有的参数。

进行单次优化

所有的optimizer都会实现step()更新参数的方法。它能按两种方式来使用:

optimizer.step()

这是大多数optimizer所支持的简化版本。一旦梯度被如backward()之类的函数计算好后,我们就可以调用该函数。

例子

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

optimizer.step(closure)

一些优化算法例如Conjugate GradientLBFGS需要重复多次计算函数,因此你需要传入一个闭包去允许它们重新计算你的模型。这个闭包会清空梯度, 计算损失,然后返回。

例子:

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)

所有优化的基类.

参数:

  1. params (iterable) —— 可迭代的Variable 或者 dict。指定应优化哪些变量。
  2. defaults-(dict):包含优化选项的默认值的dict(一个参数组没有指定的参数选项将会使用默认值)。
load_state_dict(state_dict)

加载optimizer状态

参数:

  1. state_dict (dict) —— optimizer的状态。应该是state_dict()调用返回的对象。
state_dict()

将优化器的状态返回为一个dict

它包含两个内容:

  1. state - 持有当前optimization状态的dict。它包含了 优化器类之间的不同。
  2. param_groups - 一个包含了所有参数组的dict
step(closure)

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

参数:

  1. closure (callable,可选) – 重新评估模型并返回损失的闭包。hon zero_grad()

清除所有优化过的Variable的梯度。

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

实现Adadelta算法。

ADADELTA中提出了一种自适应学习速率法

参数:

  1. params (iterable) – 用于优化的可以迭代参数或定义参数组
  2. rho (float, 可选) – 用于计算平方梯度的运行平均值的系数(默认值:0.9)
  3. eps (float, 可选) – 增加到分母中以提高数值稳定性的术语(默认值:1e-6)
  4. lr (float, 可选) – 将delta应用于参数之前缩放的系数(默认值:1.0)
  5. weight_decay (float, 可选) – 权重衰减 (L2范数)(默认值: 0)
step(closure)

执行单个优化步骤。

参数:

  1. closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0)

实现Adagrad算法。

在线学习和随机优化的自适应子梯度方法中被提出。

参数:

  1. params (iterable) – 用于优化的可以迭代参数或定义参数组
  2. lr (float, 可选) – 学习率(默认: 1e-2)
  3. lr_decay (float, 可选) – 学习率衰减(默认: 0)
  4. weight_decay (float, 可选) – 权重衰减(L2范数)(默认: 0)
step(closure)

执行单个优化步骤。

参数:

  1. closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)[source]

实现Adam算法。

它在Adam: A Method for Stochastic Optimization中被提出。

参数:

  1. params (iterable) – 用于优化的可以迭代参数或定义参数组
  2. lr (float, 可选) – 学习率(默认:1e-3)
  3. betas (Tuple[float, float], 可选) – 用于计算梯度运行平均值及其平方的系数(默认:0.9,0.999)
  4. eps (float, 可选) – 增加分母的数值以提高数值稳定性(默认:1e-8)
  5. weight_decay (float, 可选) – 权重衰减(L2范数)(默认: 0)
step(closure) 

执行单个优化步骤。

参数:

  1. closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

实现Adamax算法(Adam的一种基于无穷范数的变种)。

它在Adam: A Method for Stochastic Optimization中被提出。

参数:

  1. params (iterable) – 用于优化的可以迭代参数或定义参数组
  2. lr (float, 可选) – 学习率(默认:2e-3)
  3. betas (Tuple[float, float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数
  4. eps (float, 可选) – 增加分母的数值以提高数值稳定性(默认:1e-8)
  5. weight_decay (float, 可选) – 权重衰减(L2范数)(默认: 0)
step(closure=None)

执行单个优化步骤。

参数:

  1. closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)

实现平均随机梯度下降。

它在Acceleration of stochastic approximation by averaging中被提出。

参数:

  1. params (iterable) – 用于优化的可以迭代参数或定义参数组
  2. lr (float, 可选) – 学习率(默认:1e-2)
  3. lambd (float, 可选) – 衰减期(默认:1e-4)
  4. alpha (float, 可选) – eta更新的指数(默认:0.75)
  5. t0 (float, 可选) – 指明在哪一次开始平均化(默认:1e6)
  6. weight_decay (float, 可选) – 权重衰减(L2范数)(默认: 0)
step(closure)

执行单个优化步骤。

参数:

  1. closure (callable,可选) – 重新评估模型并返回损失的闭包。
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)

实现L-BFGS算法。

警告: 这个optimizer不支持为每个参数单独设置选项以及不支持参数组(只能有一个) 现在所有参数必须在单个设备上。将来会有所改善。

注意: 这是一个内存高度密集的optimizer(它要求额外的param_bytes * (history_size + 1) 个字节)。如果它不适应内存,尝试减小history size,或者使用不同的算法。

参数:

  1. lr (float) – 学习率(默认:1)
  2. max_iter (int) – 每个优化步骤的最大迭代次数(默认:20))
  3. max_eval (int) – 每个优化步骤的最大函数评估次数(默认:max * 1.25)
  4. tolerance_grad (float) – 一阶最优的终止容忍度(默认:1e-5)
  5. tolerance_change (float) – 功能值/参数更改的终止公差(默认:1e-9)
  6. history_size (int) – 更新历史记录大小(默认:100)
step(closure)

执行单个优化步骤。

参数:

  1. closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)[source]

实现RMSprop算法。

G. Hinton在他的课程中提出.

中心版本首次出现在Generating Sequences With Recurrent Neural Networks.

参数:

  1. params (iterable) – 用于优化的可以迭代参数或定义参数组
  2. lr (float, 可选) – 学习率(默认:1e-2)
  3. momentum (float, 可选) – 动量因子(默认:0)
  4. alpha (float, 可选) – 平滑常数(默认:0.99)
  5. eps (float, 可选) – 增加分母的数值以提高数值稳定性(默认:1e-8)
  6. centered (bool, 可选) – 如果为True,计算中心化的RMSProp,通过其方差的估计来对梯度进行归一化
  7. weight_decay (float, 可选) – 权重衰减(L2范数)(默认: 0)
step(closure)

执行单个优化步骤。

参数:

  1. closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))

实现弹性反向传播算法。

参数:

  1. params (iterable) – 用于优化的可以迭代参数或定义参数组
  2. lr (float, 可选) – 学习率(默认:1e-2)
  3. etas (Tuple[float, float], 可选) – 一对(etaminus,etaplis), 它们是乘数增加和减少因子(默认:0.5,1.2)
  4. step_sizes (Tuple[float, float], 可选) – 允许的一对最小和最大的步长(默认:1e-6,50)
step(closure) 

执行单个优化步骤。

参数:

  1. closure (callable,可选) – 重新评估模型并返回损失的闭包。
class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)

实现随机梯度下降算法(momentum可选)。

Nesterov动量基于On the importance of initialization and momentum in deep learning中的公式.

参数:

  1. params (iterable) – 用于优化的可以迭代参数或定义参数组
  2. lr (float) – 学习率
  3. momentum (float, 可选) – 动量因子(默认:0)
  4. weight_decay (float, 可选) – 权重衰减(L2范数)(默认:0)
  5. dampening (float, 可选) – 动量的抑制因子(默认:0)
  6. nesterov (bool, 可选) – 使用Nesterov动量(默认:False)

例子:

>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> optimizer.zero_grad()
>>> loss_fn(model(input), target).backward()
>>> optimizer.step()

提示:

带有动量/Nesterov的SGD的实现稍微不同于Sutskever等人以及其他框架中的实现。 考虑到Momentum的具体情况,更新可以写成 v=ρ∗v+g p=p−lr∗v 其中,p、g、v和ρ分别是参数、梯度、速度和动量。 这是在对比Sutskever et. al。和其他框架采用该形式的更新 v=ρ∗v+lr∗g p=p−v Nesterov版本被类似地修改。

step(closure) 

执行单个优化步骤。

参数:

  1. closure (callable,可选) – 重新评估模型并返回损失的闭包。

如何调整学习率

torch.optim.lr_scheduler 提供了几种方法来根据epoches的数量调整学习率。torch.optim.lr_scheduler.ReduceLROnPlateau允许基于一些验证测量来降低动态学习速率。

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

将每个参数组的学习速率设置为初始的lr乘以一个给定的函数。当last_epoch=-1时,将初始lr设置为lr。

参数:

  1. optimizer (Optimizer) – 包装的优化器。
  2. lr_lambda (function or list) – 一个函数来计算一个乘法因子给定一个整数参数的epoch,或列表等功能,为每个组optimizer.param_groups
  3. last_epoch (int) – 最后一个时期的索引。默认: -1.

例子:

>>> # Assuming optimizer has two groups.
>>> lambda1 = lambda epoch: epoch // 30
>>> lambda2 = lambda epoch: 0.95 ** epoch
>>> scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
>>> for epoch in range(100):
>>>     scheduler.step()
>>>     train(...)
>>>     validate(...)
class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)

将每个参数组的学习速率设置为每个step_size时间段由gamma衰减的初始lr。当last_epoch = -1时,将初始lr设置为lr。

  1. optimizer (Optimizer) – 包装的优化器。
  2. step_size (int) – 学习率衰减期。
  3. gamma (float) – 学习率衰减的乘积因子。默认值:-0.1。
  4. last_epoch (int) – 最后一个时代的指数。默认值:1。

例子:

>>> # Assuming optimizer uses lr = 0.5 for all groups
>>> # lr = 0.05     if epoch < 30
>>> # lr = 0.005    if 30 <= epoch < 60
>>> # lr = 0.0005   if 60 <= epoch < 90
>>> # ...
>>> scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
>>> for epoch in range(100):
>>>     scheduler.step()
>>>     train(...)
>>>     validate(...)
class torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)

一旦时间的数量达到一个里程碑,则将每个参数组的学习率设置为伽玛衰减的初始值。当last_epoch=-1时,将初始lr设置为lr。

参数:

  1. optimizer (Optimizer) – 包装的优化器。
  2. milestones (list) – 时期指标的列表。必须增加。
  3. gamma (float) – 学习率衰减的乘积因子。 默认: -0.1.
  4. last_epoch (int) – 最后一个时代的指数。 默认: -1.

例子:

>>> # Assuming optimizer uses lr = 0.5 for all groups
>>> # lr = 0.05     if epoch < 30
>>> # lr = 0.005    if 30 <= epoch < 80
>>> # lr = 0.0005   if epoch >= 80
>>> scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
>>> for epoch in range(100):
>>>     scheduler.step()
>>>     train(...)
>>>     validate(...)
class torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)

将每个参数组的学习速率设置为每一个时代的初始lr衰减。当last_epoch=-1时,将初始lr设置为lr。

  1. optimizer (Optimizer) – 包装的优化器。
  2. gamma (float) – 学习率衰减的乘积因子。
  3. last_epoch (int) – 最后一个指数。默认: -1.
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)

当指标停止改善时,降低学习率。当学习停滞不前时,模型往往会使学习速度降低2-10倍。这个调度程序读取一个指标量,如果没有提高epochs的数量,学习率就会降低。

  1. optimizer (Optimizer) – 包装的优化器。
  2. mode (str) – min, max中的一个. 在最小模式下,当监测量停止下降时,lr将减少; 在最大模式下,当监控量停止增加时,会减少。默认值:'min'。
  3. factor (float) – 使学习率降低的因素。 new_lr = lr * factor. 默认: 0.1.
  4. patience (int) –epochs没有改善后,学习率将降低。 默认: 10.
  5. verbose (bool) – 如果为True,则会向每个更新的stdout打印一条消息。 默认: False.
  6. threshold (float) – 测量新的最优值的阈值,只关注显着变化。 默认: 1e-4.
  7. threshold_mode (str) – rel, abs中的一个. 在rel模型, dynamic_threshold = best ( 1 + threshold ) in ‘max’ mode or best ( 1 - threshold ) 在最小模型. 在绝对值模型中, dynamic_threshold = best + threshold 在最大模式或最佳阈值最小模式. 默认: ‘rel’.
  8. cooldown (int) – 在lr减少后恢复正常运行之前等待的时期数。默认的: 0.
  9. min_lr (float or list) – 标量或标量的列表。对所有的组群或每组的学习速率的一个较低的限制。 默认: 0.
  10. eps (float) – 适用于lr的最小衰减。如果新旧lr之间的差异小于eps,则更新将被忽略。默认: 1e-8.
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> scheduler = torch.optim.ReduceLROnPlateau(optimizer, 'min')
>>> for epoch in range(10):
>>>     train(...)
>>>     val_loss = validate(...)
>>>     # Note that step should be called after validate()
>>>     scheduler.step(val_loss)
分享到:
评论

相关推荐

    Python_torchoptimizer Pytorch的优化器集合.zip

    在PyTorch中,优化器(Optimizer)是训练神经网络模型的关键...通过深入理解这些优化器的工作原理和适用场景,我们可以更有效地调参,优化模型训练过程。具体使用方法和功能细节,可以通过阅读`说明.txt`文件来获取。

    微软自动调参工具 NNI 使用事例教程源码,基于pytorch1.7.1

    本教程将基于NNI的源码,结合PyTorch 1.7.1这一深度学习框架,深入探讨如何利用NNI进行自动调参。 NNI的核心功能在于其强大的超参数优化能力。在机器学习和深度学习中,超参数调整对于模型性能至关重要,但手动调整...

    pytorch-retinanet-master_RetinaNet_pytorch_pytorchcnn_python_源码

    性能优化与调参** 在实际应用中,可能需要对模型进行进一步的优化,例如: - 调整学习率策略,如学习率衰减。 - 使用数据增强技术提高模型泛化能力。 - 针对GPU资源进行批处理大小和同步优化。 - 使用模型蒸馏或轻...

    pytorch资料.rar

    PyTorch是一款强大的深度学习框架,由Facebook...此外,还要掌握如何利用PyTorch进行数据预处理、模型训练、验证和测试,以及模型优化和调参。通过阅读这些资源,你将能够逐步掌握PyTorch并应用于实际的深度学习项目。

    Pytorch模型训练实用教程

    《PyTorch模型训练实用教程》是一份详细指导如何在PyTorch框架下进行深度学习模型训练的...此外,教程可能还涵盖了模型的调参技巧、模型融合以及如何利用PyTorch进行迁移学习等进阶主题,帮助开发者不断提升模型性能。

    dbn pytorch

    通过查看这些文件,可以更深入地理解作者如何在PyTorch中具体实现DBN,并从中学习到实际的编程技巧和模型调参方法。 在实际应用中,DBN可以用于各种任务,如图像分类、语音识别或自然语言处理。本例中,DBN被用于...

    PyTorch 激活函数、损失函数、优化器-谢TS的博客.pdf

    在深度学习领域,PyTorch 是一个非常流行的框架,它提供了丰富的工具来构建和...在训练过程中,通过调参和实验,可以选择最合适的组合以优化模型性能。了解并熟练掌握这些基本组件对于进行有效的深度学习实践至关重要。

    TransUNet pytorch实现

    7. **优化与调参** 在实际应用中,我们还需要关注模型的优化和参数调整,如学习率调度、正则化策略、批量大小的选择等。这些都会影响模型的训练速度和最终性能。 总之,TransUNet在PyTorch中的实现涉及深度学习...

    自然语言处理PyTorch.pdf.zip

    8. **模型优化与调参**: 在PyTorch中,我们可以选择各种优化器(如SGD、Adam、Adagrad等)来更新模型参数。此外,利用学习率调度策略和早停法可以进一步优化模型性能。 9. **模型评估与验证**: 为了评估模型...

    Pytorch-YOLOv3.zip

    3. **优化工具**:PyTorch提供了优化器如Adam、SGD等,以及数据加载器,便于模型训练和调参。 **PyTorch-YOLOv3的使用流程:** 1. **环境搭建**:确保安装了PyTorch库和其他依赖库,如OpenCV、NumPy等。 2. **数据...

    AI 书汇总-深度学习之PyTorch实战计算机视觉 - 2018

    8. **模型优化与调参**:学习模型的正则化策略、批量归一化、学习率调度等技巧,以及如何进行有效的超参数调优。 9. **实验与案例分析**:通过实际案例,深入理解每个概念和方法在实际项目中的应用。 通过阅读这...

    Python-FastAutoAugment的官方PyTorch实现

    Fast AutoAugment是数据增强领域的一个重要进展,通过自动化地搜索最优策略,减少了人工调参的工作量。PyTorch的官方实现使得这一方法更易于理解和应用。理解并掌握Fast AutoAugment,对于提升机器学习模型的性能...

    Python-包含手和身体姿势估计openpose的pytorch实现

    6. **模型优化与调参**:优化包括超参数调整、模型正则化、学习率调度等策略,以提高模型的准确性和泛化能力。对于OpenPose,可能需要考虑模型的复杂度、计算效率和内存占用,以适应不同的应用场景。 7. **实时性能...

    deeplabV3+_pytorch.zip

    训练与调参** 在训练 DeeplabV3+ 模型时,需要注意以下几点: - **数据集**:选择合适的图像分割数据集,如 PASCAL VOC、COCO 或 Cityscapes,确保数据的多样性和平衡性。 - **预训练模型**:可以使用预训练的 ...

    Python-YellowFin基于momentumSGD的自动调优优化器无需手动指定学习速率和动量

    这个优化器由Python开发,旨在简化深度学习模型的调参过程,提高模型的训练效率和准确性。 YellowFin的核心理念是利用二阶导数信息来动态调整学习速率和动量,这在传统的SGD或momentum SGD中通常是静态或需要手动...

    cycleGAN-使用Pytorch实现的CycleGAN+pix2pix算法-优质项目实战-附完整流程教程.zip

    2. **PyTorch框架**:掌握Tensor对象、自动求导、模型定义、损失函数和优化器的使用。 3. **数据预处理**:了解如何对图像数据进行归一化、缩放、裁剪等操作,以适应模型输入。 4. **模型结构**:分析CycleGAN和...

    Python-使用PyTorch在EgoGestureNvGesture和Jester上进行实时手势识别

    3. 调参:通过调整学习率、批次大小、正则化参数等超参数,找到最优模型配置。 六、实时预测 1. 集成OpenCV:使用OpenCV库捕获摄像头的实时视频流,对手势进行实时识别。 2. 推理加速:利用GPU进行推理,提高识别...

    【毕业设计】pytorch训练AI自动玩小游戏代码合辑(含游戏代码)-AIPong乒乓球

    9. **优化与调参**:训练AI玩家往往涉及到大量的参数调整,如学习率、经验回放缓冲区大小、ε-greedy策略的ε值、目标网络更新频率等。对这些参数的敏感性分析和调优将直接影响模型的性能。 10. **模型保存与加载**...

    利用pytorch搭建卷积神经网络(CNN)训练简单手写数字数据集(MNIST)

    7. 调参和优化:为了提高模型性能,可以尝试调整超参数,如学习率、滤波器数量、卷积核大小等。此外,正则化技术如Dropout和Batch Normalization也能帮助防止过拟合。 8. 模型保存与加载:使用`torch.save()`可以将...

    深度学习d2lzh_pytorch包.zip

    8. **模型训练与调参**:包中会讲解如何在PyTorch中训练模型、验证模型性能、调整超参数以及保存和加载模型。 9. **分布式训练**:对于大规模数据集和复杂模型,包可能包含如何使用多GPU进行分布式训练的示例。 10...

Global site tag (gtag.js) - Google Analytics