我试图更好地理解Pythorch中的反向传播。我有一个代码片段,它成功地从输出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
编辑:
下面是对发生的事情的详细解释(“这本身不是一个bug,但它绝对是一个混淆的来源”):https://github.com/pytorch/pytorch/issues/19778
因此,一个解决方案是明确要求现在保留grad非叶
a
:老答案:
如果在整形之后移动
^{pr2}$a.requires_grad = True
,则可以:似乎是Pythorch中的一个bug,因为在此之后
a.requires_grad
仍然有效。在这似乎与这样一个事实有关,即
a
不再是“不工作”示例中的叶,但在其他情况下仍然是叶(打印a.is_leaf
以检查)。在相关问题 更多 >
编程相关推荐