小编给大家分享一下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怎么如何自动计算梯度