pytorch - 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?
解决方案
torch.nn.Module.parameters()
给你torch.nn.parameter.Parameter
torch模块的参数(),它只包含模块中子模块的参数。
因此,因为self.T
只是一个张量,而不是nn.Module
,所以它不包含在model.parameters()
.
据我所知torch.nn.Module.parameters()
,除了返回参数之外并没有做太多事情。所以如果你的前向逻辑是正确的,我认为这会很好。
optimizer = torch.optim.Adam(model.T, lr=1e-5)
推荐阅读
- javascript - `string` 类型的无效道具`x` - 预期`object` + `string` 类型的'y' - 预期`array`
- mysql - 如果在 MySQL 中同时运行,我的 UPDATE 语句可以工作吗?
- javascript - 当 XSL 使用 xsl:include 时,如何将 XSL 与 Javascript 一起应用?
- python - tensorflow:reshape() 可以创建副本吗?
- wordpress - 我在 Facebook 期间遗漏了什么 - Auth0 设置不断给我一个列表错误
- excel - excel - VBA - 单元格刷新后我无法刷新链接到公式的形状条件格式
- bash - 提取文本文件中以 > 开头的行的方括号之间的信息
- php - 使用 Wordpress 自动完成 Jquery 时出现 JSON 错误中的意外令牌 <
- python - Pandas 按聚合函数分组 - 删除顶级标题
- javafx - 如何将线绑定到JavaFX中另一个节点内的圆圈?