作者使用的IDE:VSCode

Python版本:python3.8.8

本文适用学习阶段:入门小白

自动求导 

import torch

x = torch.arange(4.0)
x

tensor([0., 1., 2., 3.]) 

在计算y关于x的梯度前,我们需要一个地方来存储梯度

x.requires_grad_(True)   #等价于 x = torch.arange(4.0,requires_grad = True)
x.grad    #后期可通过这个命令访问y关于x的梯度

现在我们来计算y,就是2*x^2      

y = 2*x^2  所以dy/dx = 2*(2x)=4x

y = 2 * torch.dot(x,x)
y      

tensor(28., grad_fn=<MulBackward0>)

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

y.backward()
x.grad

 tensor([ 0., 4., 8., 12.])

x.grad == 4*x   #x.grad用来查看y对x的导数,咱们已知 y = 2x^2 所以dy/dx = 4x , 把x=1,2,3,4分别代入得到结果

 tensor([True, True, True, True])

 

因为PyTorch默认梯度会累积到.grad属性中,所以需要清除它

x.grad.zero_()  #清除梯度

x.grad.zero_()   #x.grad是查看导数,zero是零,下划线代表重写入,就是相当于梯度清零

tensor([0., 0., 0., 0.])

 现在来计算x的另一个函数

y = x.sum()   #x1~x4分别为0~3,所以y等于6
y.backward()  #常数求导为1
x.grad

tensor([1., 1., 1., 1.])

 接下来第二个部分和前面的无关,所以需要先清除梯度

x.grad.zero_()

y = pow(x,2)
u = y.detach()  #detach意思是将y看作一个常数写入u中
z = u * x       #经过上面那一步操作z=(常数)*x

z.sum().backward()
x.grad == u

tensor([True, True, True, True])

 

Logo

更多推荐