微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

require_grad =在我的情况下,False似乎不起作用

如何解决require_grad =在我的情况下,False似乎不起作用

我收到张量Cannot insert a Tensor that requires grad as a constant. Consider making it a parameter or input,or detaching the gradient的{​​{1}}错误

W的大小为W(10,10)错误发生在第二行

grad_fn=<DivBackward0>

其他变量,发生错误获取的值

  • def muy(self,x): V = torch.tensor(self.W - self.lambda_ * torch.eye(self.ENCODING_DIM),requires_grad=False) return -0.5 * V.inverse().mm(self.b + self.lambda_ * x[:,None]) self.lambda_
  • 1.0self.ENCODING_DIM
  • 10self.btorch.Size([10,1])
  • requires_grad=Truextorch.Size([3,1,10])

如何将grad_fn=<MulBackward0>的结果设置为叶节点的一个成分,因此需要通过muy进行渐变?

我尝试了这种怪物,但没有成功

V

为什么我关心这个JIT: 我想使用张量板来可视化我的模型,如果我正确理解错误消息,则可视化模型使用def muy(self,x): V_inv = np.linalg.inv(self.V.detach().numpy()) x_numpy = x[:,None].detach().numpy() temp= -0.5 * np.matmul(V_inv,self.b.detach().numpy() + self.lambda_ * x_numpy) return temp

编辑 这仍然会产生相同的错误TracerW

W.detach()

解决方法

V = torch.tensor(self.W - self.lambda_ * torch.eye(self.ENCODING_DIM),requires_grad=False)

您在此处尝试执行的操作没有多大意义。仅当torch.tensor(value)是标量时(例如Python的value),而您正试图在其中放置5时,才能创建torch.Tensor

您应该做的就是这样:

V = self.W - self.lambda_ * torch.eye(self.ENCODING_DIM)

如果出于某些原因要分离self.W,可以执行以下操作:

V = self.W.detach() - self.lambda_ * torch.eye(self.ENCODING_DIM)

这将复制self.W设置为requires_grad False)。

您还可以使用torch.no_grad()上下文管理器,这样该操作将不会记录在图形上,这将对图形产生相同的影响(但仅在这种情况下,通常不会,并且不会进行复制) self.W中的值,因此建议您这样做):

with torch.no_grad():
    V = self.W - self.lambda_ * torch.eye(self.ENCODING_DIM)

要复制的代码

无法根据您的代码描述重现此确切问题,请参见下文:

import torch

lambda_ = 1.0
W = torch.randn(10,10,requires_grad=True)

ENCODING_DIM = 10
b = torch.randn(10,1,requires_grad=True)
x = torch.randn(3,requires_grad=True)


with torch.no_grad():
    V = W - lambda_ * torch.eye(ENCODING_DIM)
    result = -0.5 * V.inverse().mm(b + lambda_ * x[:,None])

print(result)

此代码给出以下(不同!)错误:

回溯(最近一次通话最后一次):文件“ foo.py”,第13行,在 结果= -0.5 * V.inverse()。mm(b + lambda_ * x [:,None])RuntimeError:预期的矩阵,得到2D,4D张量 /pytorch/aten/src/TH/generic/THTensorMath.cpp:36

,

我认为问题在于矩阵的形状。

return -0.5 * V.inverse().mm(self.b + self.lambda_ * x[:,None])行中, V.inverse()的形状为[10,10]b的形状为[10,1]x[:,None]的形状为[3,10]。这些形状不利于计算所需的内容。尤其是x[:,None]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。