
动手学习深度学习-自动求导
作者使用的IDE:VSCodePython版本:python3.8.8本文适用学习阶段:入门小白。
·
作者使用的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])
更多推荐
所有评论(0)