[pytorch快速入门教程]Autograd自动求导

Song362 次浏览0个评论2018年07月11日

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

提交评论

请登录后评论

用户评论

    当前暂无评价,快来发表您的观点吧...

更多相关好文

    当前暂无更多相关好文推荐...

    公告提示

    Pytorch是Facebook的AI研究团队发布了一个Python工具包,是Python优先的深度学习框架。作为numpy的替代品;使用强大的GPU能力,提供最大的灵活性和速度,实现了机器学习框架Torch在Python语言环境的执行,基于python且具备强大GPU加速的张量和动态神经网络。