我们不会在每次对一个参数求导时都分配新的内存。 因为我们经常会成千上万次地更新相同的参数,每次都分配新的内存可能很快就会将内存耗尽。注意,一个标量函数关于向量𝐱的梯度是向量,并且与𝐱具有相同的形状。
x.requires_grad_(True) # 等价于x=torch.arange(4.0,requires_grad=True),即需要保留grad
x.grad # 默认值是None
y = 2*x.sum()
想使用反向传播函数,那么一定要先给出表达式的结果,然后再去backward
x.grad.zero_()
y = x * x
# 等价于y.backward(torch.ones(len(x)))
y.sum().backward()
x.grad
等价于
x.grad.zero_()
y = torch.dot(x,x)
y.backward()
x.grad
不太会
x.grad.zero_()
y = x * x
u = y.detach()#不计算grad
z = u * x
z.sum().backward()
print(x,y,u,z)
x.grad
输出为tensor([0., 1., 4., 9.])