我想为每个参数的最低级别设置特定的学习率。即核心权重和偏见中的每个值都应具有自己的学习率。

我可以指定类似过滤器的学习率:

optim = torch.optim.SGD([{'params': model.conv1.weight, 'lr': 0.1},], lr=0.01)


但是当我想降低水平时,像这样:

optim = torch.optim.SGD([{'params': model.conv1.weight[0, 0, 0, 0], 'lr': 0.1},], lr=0.01)


我收到错误消息:ValueError: can't optimize a non-leaf Tensor
我还尝试指定一种学习率,该学习率与'lr': torch.ones_like(model.conv1.weight)等过滤器具有相同的形状,但也无法解决。

有没有办法使用torch.optim来做到这一点?

最佳答案

我可能已经找到了解决方案。由于只能输入卷积层的全部权重和偏差,因此我们需要插入一个与权重/偏差张量具有相同形状的学习率。

这是使用torch.optim.Adam的示例:

torch.optim.CustomAdam([{'params': param, 'lr': torch.ones_like(param, requires_grad=False) * lr}
    for name, param in model.named_parameters()])


然后,我们必须在优化器本身中更改一行。为此,我创建了一个自定义优化器:

class CustomAdam(torch.optim.Adam):
   def step(self, closure=None):
       ...
       # change the last line: p.data.addcdiv_(-step_size, exp_avg, denom) to
       p.data.add_((-step_size * (exp_avg / denom)))

关于python - 我可以在PyTorch中指定特定于内核权重的学习率吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59018085/

10-12 18:36