首页 > 解决方案 > 如何为 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()

但是这种方法仍然无法训练学习率。

随意询问是否需要更多代码来解释问题。

标签: pythondeep-learningneural-networkpytorchconv-neural-network

解决方案


推荐阅读