我试图更好地理解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
答案 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
进行检查)有关。