首页 > 解决方案 > Pytorch:将 Adam Optimizer 用于带有 requires_grad 的自定义变量/模型?

问题描述

有如下模型:

import torch.nn as nn
class DefaultModel(nn.Module):
    def __init__(self, guess, K):
        super(DefaultModel, self).__init__()

        #guess = [-0.7541, -0.044,  0.0916,  1.5914, -0.0017,  1.4991]
        self.T = torch.tensor(guess).unsqueeze(0)
        self.T.requires_grad = True

        self.K = K

    def forward(self, datapoints, draw):
        Mat = pose_vec2mat(self.T).squeeze(0)
        loss = stuff(datapoints)
        return loss

通常使用手动编码的梯度下降,我会做这样的事情:

model = DefaultModel(guess, K)
gamma = torch.tensor([5e-5, 5e-5, 5e-5, 2e-5, 2e-5, 2e-5])
for i in range(0, 10000):
    
    loss = model(datapoints, draw=[1, 0,5,6])
    loss.backward()

    with torch.no_grad():
        model.T = model.T - gamma * model.T.grad
    model.T.requires_grad = True

但是,如果我想使用 Adam Optimizer 执行此操作:

model = DefaultModel(guess, K)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)

它崩溃了ValueError: optimizer got an empty parameter list如何获取参数列表中需要 grad 的变量 T?

标签: pytorch

解决方案


torch.nn.Module.parameters()给你torch.nn.parameter.Parametertorch模块的参数(),它只包含模块中子模块的参数。
因此,因为self.T只是一个张量,而不是nn.Module,所以它不包含在model.parameters().

据我所知torch.nn.Module.parameters(),除了返回参数之外并没有做太多事情。所以如果你的前向逻辑是正确的,我认为这会很好。

optimizer = torch.optim.Adam(model.T, lr=1e-5)

推荐阅读