如何解决Pytorch:使用Adam Optimizer进行带有require_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,2e-5,2e-5])
for i in range(0,10000):
loss = model(datapoints,draw=[1,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?
解决方法
torch.nn.Module.parameters()
为您提供割炬模块的参数(torch.nn.parameter.Parameter
),该模块仅包含模块中子模块的参数。
因此,由于self.T
只是张量,而不是nn.Module
,因此它不包含在model.parameters()
中。
据我所知torch.nn.Module.parameters()
除了返回参数外没有做太多事情。因此,如果您的前向逻辑正确,我认为这会很好。
optimizer = torch.optim.Adam(model.T,lr=1e-5)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。