pyTorch可以向后两次,而无需设置retain_graph=True

pyTorch可以向后两次,而无需设置retain_graph=True,pytorch,autograd,Pytorch,Autograd,如中所述 如果你想在图的某个部分做两次倒向, 在第一次传递过程中,需要传入retain_graph=True 然而,我发现下面的代码片段实际上没有这样做。我用的是pyTorch-0.4 x = torch.ones(2, 2, requires_grad=True) y = x + 2 y.backward(torch.ones(2, 2)) # Note I do not set retain_graph=True y.backward(torch.ones(2, 2)) # But it c

如中所述

如果你想在图的某个部分做两次倒向, 在第一次传递过程中,需要传入retain_graph=True

然而,我发现下面的代码片段实际上没有这样做。我用的是pyTorch-0.4

x = torch.ones(2, 2, requires_grad=True)
y = x + 2
y.backward(torch.ones(2, 2)) # Note I do not set retain_graph=True
y.backward(torch.ones(2, 2)) # But it can still work!
print x.grad
输出:

tensor([[ 2.,  2.], 
        [ 2.,  2.]]) 
有人能解释一下吗?提前谢谢

在您的例子中,它之所以能在不使用
retain\u graph=True
的情况下工作,是因为您有一个非常简单的图,它可能没有内部中间缓冲区,反过来也不会释放缓冲区,因此无需使用
retain\u graph=True

但在向图形中添加一个额外的计算时,一切都在发生变化:

代码:

x=torch.ones(2,2,需要_grad=True)
v=x.pow(3)
y=v+2
y、 向后(火炬一号(2,2))
打印('第一次向后,不保留')
打印('x.grad:',x.grad)
打印('向后第二次,不保留')
尝试:
y、 向后(火炬一号(2,2))
除RuntimeError作为错误外:
打印(错误)
打印('x.grad:',x.grad)
输出:

向后第一次,不保留
x、 梯度:张量([3,3.],
[3., 3.]])
向后第二次,不保留
第二次尝试向后遍历图形,但缓冲区已被释放。第一次向后调用时指定retain_graph=True。
x、 梯度:张量([3,3.],
[3., 3.]]).
在这种情况下,将计算额外的内部
v.grad
,但
torch
不存储中间值(中间梯度等),并且使用
retain\u graph=False
v.grad
将在第一次
向后
后释放

因此,如果您想第二次返回,您需要指定
retain\u graph=True
来“保留”图形

代码:

x=torch.ones(2,2,需要_grad=True)
v=x.pow(3)
y=v+2
y、 向后(torch.ones(2,2),保留图=真)
打印('第一次向后,带保留')
打印('x.grad:',x.grad)
打印('向后第二次带保留')
尝试:
y、 向后(火炬一号(2,2))
除RuntimeError作为错误外:
打印(错误)
打印('x.grad:',x.grad)
输出:

向后第一次带/保留
x、 梯度:张量([3,3.],
[3., 3.]])
向后第二次带/保留
x、 梯度:张量([6,6.],
[6., 6.]])