【深度学习-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)

你可能感兴趣的:(pytorch,深度学习,python,机器学习,人工智能)