PyTorch怎么如何自动计算梯度

  介绍

小编给大家分享一下PyTorch怎么如何自动计算梯度,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

在PyTorch中,torch.Tensor类是存储和变换数据的重要工具,相比于Numpy,张量提供GPU计算和自动求梯度等更多功能,在深度学习中,我们经常需要对函数求梯度(梯度)。

PyTorch提供的autograd包能够根据输入和前向传播过程自动构建计算图,并执行反向传播。

本篇将介绍和总结如何使用autograd包来进行自动求梯度的有关操作。

1。概念

张量是这个pytorch的自动求导部分的核心类,如果将其属性.requires_grad=True,它将开始追踪(跟踪)在该张量上的所有操作,从而实现利用链式法则进行的梯度传播,完成计算后,可以调用.backward()来完成所有梯度计算。此张量的梯度将累积到.grad属性中。

如果不想要被继续对张量进行追踪,可以调用.detach()将其从追踪记录中分离出来,接下来的梯度就传不过去了。此外,还可以用与torch.no_grad()将不想被追踪的操作代码块包裹起来,这种方法在评估模型的时候很常用,因为此时并不需要继续对梯度进行计算。

函数是另外一个很重要的类.Tensor和功能互相结合就可以构建一个记录有整个计算过程的有向无环图(DAG)。每个张量都有一个。grad_fn属性,该属性即创建该张量的函数,就是说该张量是不是通过某些运算得到的,若是,则grad_fn返回一个与这些运算相关的对象,否则是没有。

2。具体实现

2.1。创建可自动求导的张量

首先我们创建一个张量,同时设置requires_grad=True:

x =, torch.ones (2,, 2,, requires_grad=True)   打印(x)   打印(x.grad_fn)   & # 39;& # 39;& # 39;

输出:

张量([[1。,1。],

[1。1。]],requires_grad=True)

没有& # 39;& # 39;& # 39;

像x这种直接创建的张量称为叶子节点,叶子节点对应的grad_fn是没有。如果进行一次运算操作:

y =, x  + 1   打印(y)   打印(y.grad_fn)   & # 39;& # 39;& # 39;   张量([[2。,,2。]   ,,,,,,,[2。,,2。]],,grad_fn=& lt; AddBackward>)   & lt; AddBackward  object  at  0 x1100477b8>      & # 39;& # 39;& # 39;

而y是通过一个加法操作创建的,所以它有一个为操作的grad_fn。

尝试进行更复杂的操作:

z =, y  * *, 2   时间=out  z.mean ()   打印(z,,)   & # 39;& # 39;& # 39;   张量([[4。,,4。]   ,,,,,,,[4。,,4。]],,grad_fn=& lt; PowBackward0>),张量(4。,,grad_fn=& lt; MeanBackward0>)   & # 39;& # 39;& # 39;

上面出的是一个标量4,通常对于标量直接使用out.backward()进行求导,不需要指定求导变量,后面进行详细说明。

也可以通过.requires_grad_()改变requires_grad属性:

a =, torch.randn(3), 2), #,缺失情况下默认,requires_grad =False   a =, (* * a  2)   打印(a.requires_grad), #,假的      a.requires_grad_(真实),#使用就地操作,改变属性   打印(a.requires_grad), #,真的   b =, (a  *,) .sum ()   打印(b.grad_fn)   & # 39;& # 39;& # 39;   假   真正的   & lt; SumBackward0  object  at  0 x7fd8c16edd30>   & # 39;& # 39;& # 39;

2.2。梯度计算

torch.autograd实现梯度求导的链式法,则用来计算一些雅克比矩阵的乘积,即函数的一阶导数的乘积。

注意:毕业生在反向传播过程中是累加的(累积),每一次运行反向传播,梯度都会累加之前的梯度,所以一般在反向传播之前需把梯度清零x.grad.data.zero_ ()。

x =, torch.ones (2,, 2,, requires_grad=True)   时间=y  x  + 1   时间=z  y  * *, 2   时间=out  z.mean ()   打印(z,,)   out.backward ()   打印(x.grad)      #,注意研究生是累加的   时间=out2  x.sum ()   out2.backward ()   打印(out2)   打印(x.grad)      时间=out3  x.sum ()   x.grad.data.zero_ ()   out3.backward ()   打印(out3)   打印(x.grad)   & # 39;& # 39;& # 39;   张量([[4。,,4。]   ,,,,,,,[4。,,4。]],,grad_fn=& lt; PowBackward0>),张量(4。,,grad_fn=& lt; MeanBackward0>)   张量([[1。,1。]   ,,,,,,,[1。,1。]])   张量(4,grad_fn=& lt; SumBackward0>)   张量([[2。,,2。]   ,,,,,,,[2。,,2。]])   张量(4,grad_fn=& lt; SumBackward0>)   张量([[1。,1。]   ,,,,,,,[1。,1。]])   & # 39;& # 39;& # 39;

PyTorch怎么如何自动计算梯度