pyTorch可以向后两次,而无需设置retain_graph=True
如中所述 如果你想在图的某个部分做两次倒向, 在第一次传递过程中,需要传入retain_graph=True 然而,我发现下面的代码片段实际上没有这样做。我用的是pyTorch-0.4pyTorch可以向后两次,而无需设置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
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.]])