首页 > 解决方案 > 具有多个学习率的循环学习率

问题描述

我正在尝试使用 OneCycleLR 或至少在torch.optim.lr_scheduler.

假设我有以下内容:

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))

标签: pytorch

解决方案


推荐阅读