如何解决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.0
:self.ENCODING_DIM
-
10
:self.b
,torch.Size([10,1])
-
requires_grad=True
:x
,torch.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
编辑
这仍然会产生相同的错误,Tracer
或W
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 举报,一经查实,本站将立刻删除。