pytorch - 具有多个学习率的循环学习率
问题描述
我正在尝试使用 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中提供的学习率和动量参数。所以我的问题是:
- 可能吗?
- 如果没有,有没有办法在训练时操纵动量,我可以自己为循环学习率编写一个函数。
- 是否可以使用优化器列表而不是一个优化器,如果是这样,那会更慢吗?
最小的例子:
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))
解决方案
推荐阅读
- deno - Deno 运行 - Uncaught PermissionDenied:对“0.0.0.0:8000”的网络访问,使用 --allow-read 标志再次运行
- mysql - 是否有一个很好的命令来替换 mysql 中的引用列?
- recursion - 使用序言的递归求和
- powerapps - 在不同用户之间使用 Microsoft Business One Drive Connector 许可证
- javascript - 无法使用繁琐的 Node.js 连接到 SQL Server
- angular - 如何在 *ngFor 中为特定项目设置参考变量?
- python - 如何选择特定行并将其重新写入单个文件?
- python - 可以在 jupyter notebook 中调用使用 concurrent.futures 的 python 类吗?
- hadoop - 从带有子目录的 HDFS 目录创建 Impala 表
- game-engine - Java游戏数据传输