我正在尝试使用以下代码来了解PyTorch反向传播的工作原理。
import torch
import numpy
x = torch.tensor(numpy.e, requires_grad=True)
y = torch.log(x)
y.backward()
print(x.grad)
如预期,结果为tensor(0.3679)
,即1 / x
,它是log(x)
w.r.t.的导数。 x
和x = numpy.e
。但是,如果我再次运行最后3行而没有重新分配x
,即do
y = torch.log(x)
y.backward()
print(x.grad)
然后我将得到tensor(0.7358)
,这是先前结果的两倍。为什么会这样?
累积渐变直到清除。从the docs(强调我的):
此函数在树叶中累积渐变-在调用之前,您可能需要将其归零。
可以通过x.grad.zero_()
进行此调零,对于torch.optim.Optimizer
,可以通过optim.zero_grad()
。