自动梯度计算

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验证梯度是否正确
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值