【深度学习-pytorch】自动求导实现

import torch

x=torch.arange(4.0)

print(x)

x.requires_grad_(True)#把梯度放在哪个地方

print(x.grad)

y=2*torch.dot(x,x)#内积×2

print(y)

# 通过调用反向传播函数来自动计算y关于x每个分量的梯度

y.backward()#求导

x.grad

print(x.grad==4*x)

#在默认情况下,pytorch会累计梯度,我们需要清楚之前的值

x.grad.zero_()#_表示重写

y=x.sum()#引入另一个函数,求向量的sum,梯度等于全1

y.backward()#

print(x.grad)

#对非标量调用‘backward’需要传入一个‘gradient’参数

x.grad.zero_()

y=x*x

#等价于y.backward(torch.ones(len(x))

y.sum().backward()

print(x.grad)

#把某些计算移动到记录的计算图以外

x.grad.zero_()

y=x*x

u=y.detach()#把y看作一个常数

z=u*x

z.sum().backward()

print(x.grad==u)

x.grad.zero_()

y.sum().backward()

print(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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值