Pytorch:从矩阵元素的和向后传播到叶子变量

时间:2019-05-01 20:36:29

标签: python pytorch autograd

我试图更好地理解pytorch中的反向传播。我有一个代码段,可以成功地将输出d反向传播到叶子变量a,但是如果我添加了整形步骤,则反向传播将不再为输入提供渐变。

我知道重塑是不适当的,但是我仍然不确定如何将其上下文化。

有什么想法吗?

谢谢。

#Works
a = torch.tensor([1.])
a.requires_grad = True
b = torch.tensor([1.])
c = torch.cat([a,b])
d = torch.sum(c)
d.backward()

print('a gradient is')
print(a.grad) #=> Tensor([1.])

#Doesn't work
a = torch.tensor([1.])
a.requires_grad = True
a = a.reshape(a.shape)
b = torch.tensor([1.])
c = torch.cat([a,b])
d = torch.sum(c)
d.backward()

print('a gradient is')
print(a.grad) #=> None

1 个答案:

答案 0 :(得分:2)

编辑:

以下是发生的情况的详细说明(“这本身不是错误,但绝对是造成混乱的原因”):https://github.com/pytorch/pytorch/issues/19778

因此,一种解决方案是专门要求为现在的无叶a保留毕业文凭:

a = torch.tensor([1.])
a.requires_grad = True
a = a.reshape(a.shape)
a.retain_grad()
b = torch.tensor([1.])
c = torch.cat([a,b])
d = torch.sum(c)
d.backward()

旧答案:

如果在整形后移动a.requires_grad = True,它将起作用:

a = torch.tensor([1.])
a = a.reshape(a.shape)
a.requires_grad = True
b = torch.tensor([1.])
c = torch.cat([a,b])
d = torch.sum(c)
d.backward()

似乎像是PyTorch中的错误,因为在此之后a.requires_grad仍然是正确的。

a = torch.tensor([1.])
a.requires_grad = True
a = a.reshape(a.shape)

这似乎与a不再是您的“不工作”示例中的叶子,但在其他情况下仍是叶子(打印a.is_leaf进行检查)有关。