首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火炬计划学习率

火炬计划学习率
EN

Stack Overflow用户
提问于 2020-07-27 03:04:16
回答 2查看 13.1K关注 0票数 5

我正试图重新实施一篇论文,其中建议调整学习率如下:

学习率下降的因子的回归值与耐心期10上的变化值为0.0001。

我应该使用torch.optim.lr_scheduler.ReduceLROnPlateau()吗?

我不确定应该将什么值传递给每个参数。

参数threshold表示的语句中的

  1. 更改值

  1. 是语句中表示参数
  2. 的因子。
EN

回答 2

Stack Overflow用户

发布于 2020-07-27 07:33:35

毕火炬有很多方法可以让你降低学习率。本文对此作了很好的解释:

https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate

@Antonino DiMaggio很好地解释了ReduceOnPlateau。我只想补充一下对@Yan的评论的答复:

是否可以将learning_rate减去一个常量值而不是一个因子?

首先,你应该非常小心,避免负值的lr!第二,减去学习率的值是不常见的做法。但无论如何..。

您必须首先制定一个定制的lr调度程序(我修改了LambdaLR https://pytorch.org/docs/stable/_modules/torch/optim/lr_scheduler.html#LambdaLR的代码):

代码语言:javascript
复制
torch.optim.lr_scheduler import _LRScheduler

class SubtractLR(_LRScheduler):
    def __init__(self, optimizer, lr_lambda, last_epoch=-1, min_lr=e-6):
        self.optimizer = optimizer
        self.min_lr = min_lr  # min learning rate > 0 

        if not isinstance(lr_lambda, list) and not isinstance(lr_lambda, tuple):
            self.lr_lambdas = [lr_lambda] * len(optimizer.param_groups)
        else:
            if len(lr_lambda) != len(optimizer.param_groups):
                raise ValueError("Expected {} lr_lambdas, but got {}".format(
                    len(optimizer.param_groups), len(lr_lambda)))
            self.lr_lambdas = list(lr_lambda)
        self.last_epoch = last_epoch
        super(LambdaLR, self).__init__(optimizer, last_epoch)

    def get_lr(self):
        if not self._get_lr_called_within_step:
            warnings.warn("To get the last learning rate computed by the scheduler, "
                          "please use `get_last_lr()`.")

        return [(max(base_lr - lmbda(self.last_epoch), self.min_lr)
                for lmbda, base_lr in zip(self.lr_lambdas, self.base_lrs)] # reduces the learning rate

比你在训练中能用的更多。

代码语言:javascript
复制
 lambda1 = lambda epoch: e-4 # constant to subtract from lr
 scheduler = SubtractLR(optimizer, lr_lambda=[lambda1])
 for epoch in range(100):
     train(...)
     validate(...)
     scheduler.step()
代码语言:javascript
复制
 lambda1 = lambda epoch: epoch * e-6 # increases the value to subtract lr proportionally to the epoch
 scheduler = SubtractLR(optimizer, lr_lambda=[lambda1])
 for epoch in range(100):
     train(...)
     validate(...)
     scheduler.step()

您还可以修改ReduceLROnPlateau的代码以减去学习速率,而不是修改它。您应该将这一行new_lr = max(old_lr * self.factor, self.min_lrs[i])更改为类似于new_lr = max(old_lr - self.factor, self.min_lrs[i])的内容。您可以亲自查看代码:https://pytorch.org/docs/stable/_modules/torch/optim/lr_scheduler.html#ReduceLROnPlateau

票数 4
EN

Stack Overflow用户

发布于 2021-02-25 23:15:26

作为对ReduceLROnPlateau的上述答案的补充,阈值在用于pytorch的lr调度程序中也有模式(rel\abs)(至少对于vesions>=1.6),默认为“rel”,这意味着如果损失为18,它将至少更改18*0.0001=0.0018以被认为是一种改进。所以,也要注意阈值模式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63108131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档