Pytorch requires_grad=False在我的情况下似乎不起作用

Pytorch requires_grad=False在我的情况下似乎不起作用,pytorch,Pytorch,我收到了一个无法插入需要grad作为常数的张量。考虑把它变成一个参数或输入,或者用张量 w < /代码>分离梯度< /代码>错误。 W的大小为(10,10)和grad\u fn=。错误发生在第二行 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

我收到了一个
无法插入需要grad作为常数的张量。考虑把它变成一个参数或输入,或者用张量<代码> w < /代码>分离梯度< /代码>错误。

W
的大小为
(10,10)
grad\u fn=
。错误发生在第二行

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\u DIM
    10
  • self.b
    torch.Size([10,1])
    要求_grad=True
  • x
    torch.Size([3,1,10])
    grad\u fn=
如何将
muy
的结果设置为叶节点的一个组成部分,因此需要通过
V
渐变

我试过这个怪物,但没用

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
为什么我关心这个JIT: 我想使用tensorboard来可视化我的模型,如果我正确理解错误消息,可视化模型使用
Tracer

编辑 这仍然会产生相同的错误,
W
W.detach()

你在这里试图做的没有多大意义<代码>torch.tensor(值)
只能在
为标量(例如Python的
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\u grad
设置为
False

您也可以使用
torch.no_grad()
context manager,这样该操作就不会记录在图形上,而这对图形也会产生相同的效果(但仅在这种情况下,一般不会,您不会复制
self.W
,因此建议这样做):

要复制的代码 无法根据您的代码描述重现此问题,请参阅以下内容:

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, 1, 10, 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)
此代码给出以下(不同!)错误:

回溯(最近一次调用last):文件“foo.py”,第13行,在 结果=-0.5*V.inverse().mm(b+lambda_*x[:,无])运行时错误:预期矩阵,在 /pytorch/aten/src/TH/generic/THTensorMath.cpp:36


我认为问题是关于矩阵的形状

在这一行中
返回-0.5*V.inverse().mm(self.b+self.lambda\ux[:,None])

V.inverse()
形状是
[10,10]
b
形状是
[10,1]
x[:,无]
形状是
[3,1,1,10]
。这些形状不适合计算你想要的东西。特别是
x[:,None]

你能试着用torch把整个函数体放到:
中吗。no_grad():
?@Mercury请看我的编辑:)经过一些调试,我可以说损失正在减少,网络似乎学到了一些东西。我修正了很多东西,但最重要的是不要把张量当作numpy数组,尽量尝试矢量化。谢谢大家说数据可以通过numpy数组too@MinhTriet无法复制,请参阅我测试过的最小代码示例。这是一个不同的错误,与之前的错误无关,之前的错误显然是从另一个
torch.Tensor
创建
torch.Tensor
。如果存在此错误,则会发生在不同的行中。还有你的PyTorch版本是什么<代码>1.6.0如果依赖项确实过时,请在此处更新它们。
V = self.W.detach() - self.lambda_ * torch.eye(self.ENCODING_DIM)
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, 1, 10, 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)