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)