新手教程
- 60分钟快速入门Pytorch
- Pytorch是什么?
- Autograd:自动分化
- 神经网络
- 训练分类器
60分钟快速入门Pytorch
- 张量
- Autograd求导
- nn 包
- 多GPU示例
PyTorch使用Torch模型
- 学习PyTorch与实例
学习PyTorch与实例
Autograd:自动分化
autograd包是PyTorch
所有神经网络的核心。我们先来简要的介绍一下,然后我们去训练我们的第一个神经网络。
autograd
包为Tensors
上的所有操作提供了自动区分。它是一个逐个运行的框架,这意味着您的backprop
由您的代码运行定义,每一次迭代都可以不同。
让我们用更简单的术语来看这个例子。
变量
autograd.Variable
是包的中央类。它包含一个Tensor
,并支持几乎所有定义的操作。完成计算后,您可以调用.backward()
并自动计算所有梯度。
您可以通过.dat
a属性访问原始张量,而将此变量的梯度累加到.grad
。
还有一个类对于autograd
实现非常重要 - a Function
。
Variable
并被Function
互连并建立一个非循环图,编码完整的计算历史。每个变量都有一个.creator
引用Function
已创建的属性的属性Variable
(除了用户创建的变量代替creator is None
)
如果你想计算导数,你可以在一个Variable
中使用.backward()
。如果Variable
是标量(即它保存一个元素数据),则不需要指定任何参数backward()
,但是如果它具有更多元素,则需要指定一个grad_output
作为匹配形状的张量的参数。
import torch
from torch.autograd import Variable
创建一个变量:
x = Variable(torch.ones(2, 2), requires_grad=True)
print(x)
输出:
Variable containing:
1 1
1 1
[torch.FloatTensor of size 2x2]
做一个变量的操作:
y = x + 2
print(y)
输出:
Variable containing:
3 3
3 3
[torch.FloatTensor of size 2x2]
y
是由于操作造成的,所以它有一个创造者。
print(y.creator)
输出:
<torch.autograd._functions.basic_ops.AddConstant object at 0x1005eaed0>
对y进行更多的操作
z = y * y * 3
out = z.mean()
print(z, out)
输出:
Variable containing:
27 27
27 27
[torch.FloatTensor of size 2x2]
Variable containing:
27
[torch.FloatTensor of size 1]
梯度
现在我们的backprop out.backward()
就等于做了out.backward(torch.Tensor([1.0]))
out.backward()
打印梯度d(out)/dx
print(x.grad)
输出:
Variable containing:
4.5000 4.5000
4.5000 4.5000
[torch.FloatTensor of size 2x2]
你应该有一个矩阵4.5
。我们来调用out
变量 “(o)”.我们得到\(o = \frac{1}{4}\sum_i z_i\), \(z_i = 3(x_i+2)^2\)
和\(z_i\bigr\rvert_{x_i=1} = 27\)
,因此,\(\frac{\partial o}{\partial x_i} = \frac{3}{2}(x_i+2)\)
,因此\(\frac{\partial o}{\partial x_i}\bigr\rvert_{x_i=1} = \frac{9}{2} = 4.5\)
你可以做许多疯狂的事情与autograd
!
x = torch.randn(3)
x = Variable(x, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
输出:
Variable containing:
-336.2719
-714.8715
-710.7238
[torch.FloatTensor of size 3]
gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)
print(x.grad)
输出:
Variable containing:
51.2000
512.0000
0.0512
[torch.FloatTensor of size 3]
稍后阅读: Variable 和 Function 的文档可以参考 http://pytorch.org/docs/autograd
脚本总运行时间:(0分0.074秒)