python - 如何为 Pytorch 中的每个参数设置单独的可学习学习率?
问题描述
我对 Pytorch 中每个参数的可学习学习率有点困惑。
我想为每个参数设置一个单独的可学习学习率。学习率和模型参数将在训练过程中一起优化。
我在stackoverFlow上找到了一些代码:</p>
optimizer = optim.Adam([
{'params': net.layer1.weight},
{'params': net.layer1.bias, 'lr': 0.01},
{'params': net.layer2.weight, 'lr': 0.001}
], lr=0.1, weight_decay=0.0001)
该方法解决了为每个参数设置固定学习率的问题,但不能让学习率与模型一起训练。
我试图定义一个具有可学习学习率的类:
class Learner(nn.Module):
def __init__(self, net, in_channels, num_classes):
super(Learner, self).__init__()
self.learner = net(in_channels, num_classes)
self.task_lr = OrderedDict()
def forward(self, X):
out = self.learner(X)
return out
def define_lr(self):
for key, val in self.named_parameters():
self.task_lr[key] = nn.Parameter(
1e-4 * torch.ones_like(val, requires_grad=True))
接着:
model_params = list(model.parameters()) + list(model.task_lr.values())
optimizer = optim.Adam(model_params, lr=args.lr)
adapted_state_dict = model.cloned_state_dict()
#####compute loss#####
#......
######################
model.zero_grads()
loss.backward()
for name, param in model.named_parameters():
if param.grad is not None:
adapted_state_dict[name] -= model.task_lr[name] * param.grad.data
model.load_state_dict(adapted_state_dict)
optimizer.step()
但是这种方法仍然无法训练学习率。
随意询问是否需要更多代码来解释问题。
解决方案
推荐阅读
- python - 我不知道为什么更改列表别名时原始列表会更改
- c++ - union int bits to float bits 有时解释错误
- javascript - 如何设置关闭菜单的事件监听器
- python - 如何在 Python 中使用 SOAP API(XML 格式)?
- c# - 如何从该项目引用的程序集中获取项目中引用的所有程序集?
- android - 未处理的异常:System.NullReferenceException:
发生了 - c++ - 如何使用 std::variant 保证复制省略?
- javascript - android移动浏览器中的html输入框打开并快速关闭触摸键盘
- css - 如何使用css均匀地布局多个动态出现的按钮?
- sql-server - SQL Server 用户无法查看/使用序列