具有多种学习率的循环学习率

时间:2020-07-26 08:18:17

标签: pytorch

我正在尝试使用torch.optim.lr_scheduler中的OneCycleLR或至少cyclicLR。

假设我有以下内容:

param_list = []
for lr, block in zip(lrs, blocks):
    param_list.extend([{'params':p ,'lr':lr} for n,p in model.named_parameters() if n.startswith(block)])
optimizer = torch.optim.Adam(param_list)

其中blocks = ["base", "fc"](在我的用例中有20个区块)和lrs=[1e-4, 1e-3]

通过使用以下功能来手动控制学习率非常容易:

lr_sched = lambda batch: 1.1**batch
scheduler = LambdaLR(optimizer, lr_lambda=[lr_sched]*len(param_list))

以上示例提高了学习速度。

但是,我想做的是更改OneCycleLR中提供的学习速度以及动量参数。所以我的问题是:

  1. 有可能吗?
  2. 如果没有的话,有没有一种方法可以在训练时操纵动量,我可以自己编写一个用于周期性学习率的函数。
  3. 是否可以使用一系列优化器而不是一个?

最小示例:

import torch
import torch.nn as nn
from torch.optim.lr_scheduler import LambdaLR

class Model(nn.Module):
    def __init__(self):
        self.base = nn.Linear(10, 5)
        self.fc = nn.Linear(5, 1)
        self.relu = nn.ReLU()
        
    def forward(self, x):
        return self.fc(self.relu(self.base(x)))

model = Model()

param_list = []
for lr, block in zip(lrs, blocks):
    param_list.extend([{'params':p ,'lr':lr} for n,p in model.named_parameters() if n.startswith(block)])
optimizer = torch.optim.Adam(param_list)

lr_sched = lambda batch: 1.1**batch
scheduler = LambdaLR(optimizer, lr_lambda=[lr_sched]*len(param_list))

0 个答案:

没有答案