PyTorch的Tensor有个grad属性,默认情况下,该属性为None,当第一次调用backward()计算梯度时,此属性被赋值,其值为计算的梯度。并且,将来对backward的多次调用之后,还会累积梯度,所以大家要记得清空梯度。
(1)默认情况下,该属性是什么?
None
(2)在什么情况下该属性会被赋值?
当执行backward,该属性被赋值。需要注意的是:每次在计算backward时都需要将前一时刻的梯度归零,否则梯度值会一直累加。
代码举例如下所示:
import torch
x = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True)
print("初始情况下,梯度值为:", x.grad)
out = x.pow(2).sum()
# 计算图需要保存,否则第二执行backward则会报错
out.backward(retain_graph=True)
print("第1次执行backward后的梯度值为:", x.grad)
out.backward()
print("第2次执行backward后的梯度值为:", x.grad)
执行结果为:
None
tensor([[ 2., -2.],
[ 2., 2.]])
tensor([[ 4., -4.],
[ 4., 4.]])