Pytorch:对自定义变量/模型使用Adam Optimizer时需要\u grad?

Pytorch:对自定义变量/模型使用Adam Optimizer时需要\u grad?,pytorch,Pytorch,具有以下模型,如下所示: 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(gue

具有以下模型,如下所示:

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一起崩溃:优化器获得了一个空参数列表
如何获取参数列表中需要grad的变量T?

torch.nn.Module.parameters()
提供torch模块的参数(
torch.nn.parameter.parameter
),仅包含模块中子模块的参数。
因此,由于
self.T
只是一个张量,而不是
nn.Module
,因此它不包含在
model.parameters()中

据我所知,
torch.nn.Module.parameters()
除了返回参数外,没有什么作用。因此,如果你的正向逻辑是正确的,我认为这将很好地工作

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