[pytorch快速入门教程]Autograd自动求导
Pytorch中所有神经网络的中心部分是autograd包。我们首先浏览一下它,然后再构建我们的第一个神经网络。 autograd包为Tensor上的所有运算提供了自动求导功能。它是一个由运行定义的框架,即你的反向传播是由你的代码如何运行来决定的,而且每一轮迭代都可能是不同的。 让我们用几个简单的例子来了解几个简单的术语。 [quote] [b]Variable 变量[/b] [/quote] autograd.Variable是这个包的中心类。它包装一个Tensor,并且支持几乎所有定义在这个Tensor上的运算。一旦你完成了你的计算,你可以调用.backward()来自动地计算全部的梯度。 你可以通过.data属性来访问最原始的tensor,而梯度则相应地被累计到了.grad中。 [attach]12[/attach] autograd的实现中还有一个非常重要的类-Function。
Variable和Function是相互关联的并且构建了一个非循环图,其中编码了整个的计算历史。每一个变量都有一个.creator属性,它引用一个常见Variable的Function(除了用户创建的Variables-它们的creator是None)。
如果你想计算导数,可以在Variable上调用.backward()。如果Variable是个标量(一个单元素数据),那么你不用为backward()指定任何参数,然而如果它有多个元素,你需要指定一个grad_output参数,它是一个匹配尺寸的tensor。[code]import torch from torch.autograd import Variabl[/code] 创建一个变量: [code]x = Variable(torch.ones(2, 2), requires_grad=True) print(x)[/code]输出: [code]Variable containing: 1 1 1 1 [torch.FloatTensor of size 2x2][/code]对变量进行运算: [code]y = x + 2 print(y)[/code]输出:[code]Variable containing: 3 3 3 3 [torch.FloatTensor of size 2x2][/code] [b]y[/b]是作为一个运算操作的结果而创建的,因而它有一个 [code]print(y.creator)[/code] 输出: [code]<torch.autograd._functions.basic_ops.AddConstant object at 0x108ada4a8>[/code]在y上做更多的运算:[code]z = y y 3 out = z.mean()
print(z, out)[/code]输出:[code]Variable containing: 27 27 27 27 [torch.FloatTensor of size 2x2] Variable containing: 27 [torch.FloatTensor of size 1][/code] [quote] [b]Gradients 梯度[/b] [/quote]
让我们使用反向传播[b]out.backward()[/b],它等同于[b]out.backward(torch.Tensor([1.0]))[/b]。 [code]out.backward()[/code]打印梯度 [code]print(x.grad)[/code]输出:[code]Variable containing: 4.5000 4.5000 4.5000 4.5000 [torch.FloatTensor of size 2x2][/code]你应该会得到一个4.5的矩阵。让我们称out变量为o。我们有o=14∑izio=14∑izi,zi=3(xi+2)2zi=3(xi+2)2 以及 zi∣∣xi=1=27zi|xi=1=27 。因此,∂o∂xi=32(xi+2)∂o∂xi=32(xi+2),从而∂o∂xi∣∣xi=1=92=4.5∂o∂xi|xi=1=92=4.5。
你还可以使用autograd做一些疯狂的事情![code]x = torch.randn(3) x = Variable(x, requires_grad=True)
y = x 2 while y.data.norm() < 1000: y = y 2
print(y)[/code] 输出:[code]Variable containing: 596.2775 -807.4459 -550.6819 [torch.FloatTensor of size 3][/code][code]gradients = torch.FloatTensor([0.1, 1.0, 0.0001]) y.backward(gradients)
print(x.grad)[/code]输出:[code]Variable containing: 102.4000 1024.0000 0.1024 [torch.FloatTensor of size 3][/code]延伸阅读:
Variable和Function的文档:http://pytorch.org/docs/autograd
用户评论
更多相关好文
-
微信公众号文章/菜单添加小程序时路径如何获取? 2021-12-22
-
如何轻松获取微信小程序路径path? 2021-12-22
-
cannot import name 'CUDA_HOME' from 'mmcv.utils' 2021-12-05
-
vgg的loss一轮达到ln(1/n)阈值,如何解决 2021-11-21
-
如何下载使用utils库 2021-10-27
热门文章
-
cannot import name 'CUDA_HOME' from 'mmcv.utils' 2021-12-05
-
vgg的loss一轮达到ln(1/n)阈值,如何解决 2021-11-21
-
如何下载使用utils库 2021-10-27
-
pytorch调用geforce rtx 3060 2021-10-24
-
pytorch中如何实现多模型的并联 2021-09-15
栏目最新文章
公告提示
- pytorch中文文档
- pytorch官方文档
提交评论