import torch
#自动计算倒数,即自动微分 系统会自动构建计算图 随后反向传播填充每个参数的偏导数
x = torch.arange(4.0,requires_grad=True)
print(x,x.grad)
y = 2 * torch.dot(x,x)
print(y)
y.backward();
print(x.grad)
x.grad.zero_();
y = x.sum()
y.backward()
print(x.grad)
#非标量变量的反向传播
x.grad.zero_()
y = x*x
y.sum().backward()
print(x.grad)
# 分离计算
x.grad.zero_()
y = x * x
u = y.detach()
z = u * x
#直接计算z-u 并不是z-x
z.sum().backward()
x.grad == u
#进一步u-x
x.grad.zero_()
y.sum().backward()
x.grad == 2 * x
#python控制流的梯度计算
def f(a):
b = a * 2
while b.norm() < 1000:
b = b * 2
if b.sum() > 0:
c = b
else:
c = 100 * b
return c
a = torch.randn(size=(), requires_grad=True)
d = f(a)
d.backward()
print(a.grad == d / a)
#它在其输入a中是分段线性的。 换言之,对于任何a,存在某个常量标量k,
# 使得f(a)=k*a,其中k的值取决于输入a。
# 因此,我们可以用d/a验证梯度是否正确
自动梯度计算
最新推荐文章于 2024-11-22 20:23:40 发布