本文是Pytorch快速入门第二部分,主要学习记录,主要翻译
Pytorch Autograd部分教程原文
autograd
包是PyTorch中神经网络的核心部分。
torch.autograd
提供了类和函数, 用来对任意标量函数进行求导。要想使用自动求导,只需要对已有的代码进行微小的改变。只需要将所有的tensor
包含进Variable
对象中即可。
一、Tensor(张量)
-
torch.Tensor
是程序包的中心类. - 如果将其属性设置
.requires_grad
(默认为Flase)为True,它将开始跟踪对其的所有操作. - 一旦你完成张量计算之后就可以调用
.backward()
函数,它会帮你把所有的梯度计算好. - 通过Variable的
.data
属性可以获取到张量. - 通过Variabe的
.grad
属性可以获取到梯度.
二、Variable类
-
autograd.Variable
封装了Tensor,支持几乎所有的tensor操作。一般情况下,将代码中的Tensor换成Variable,几乎能够正常工作。
Variable的结构:
Function类
- 对autograd的实现很重要的类就是
autograd.Function
- Variable跟Function一起构建无环图,完成了前向传播的计算
- 通过Function函数计算得到的变量都有一个.grad_fn属性
- 用户自定义变量(不是通过函数计算得到的)的.grad_fn值为空
- 调用.backward()函数计算梯度:
1.当变量out是标量的时候,out.backward()等效于out.backward(torch.tensor(1.))
2.当变量不是标量的时候,需要指定一个跟该变量同样大小的张量grad_output用来存放计算好的梯度.
以上官方实例 包含简单的证明。
- 导入包
import torch
from torch.autograd import Variable
- 创建一个张量并设置requires_grad=True,默认为False。
x = Variable(torch.ones(2, 2), requires_grad=True))
print(x)
# output
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
- 张量运算
y = x + 2
print(y)
# output
tensor([[3., 3.],
[3., 3.]], grad_fn=)
- y是通过Funciton计算所得,包含grad_fn属性
print (x.grad_fn)
print (y.grad_fn)
# output
None
- 在y上进行操作
z = y * y * 3
out = z.mean()
print(z, out)
# output
tensor([[27., 27.],
[27., 27.]], grad_fn=) tensor(27., grad_fn=)
-
requires_grad_( True)
改变Variable的requires_grad的属性,等同于Variable.requires_grad=True
, 默认的是False,如果没有指定的话。
a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)
# output
False
True
Gradients
现在开始进行 backprop。因为out包含一个标量,out. backwards()等价于out. backwards(电筒.张量(1.))。
out.backward()
- 输出
d(out)/dx
print(x.grad)
# output
tensor([[4.5000, 4.5000],
[4.5000, 4.5000]])
我们获得了2*2的值为4.5的矩阵,把 out 简化为 "o"。 , 同时 , 因此 ,最终.
- 这里的out为标量,所以直接调用backward()函数即可.
- 一定要注意当out为数组时,用先定义一样大小的Tensor例如grad_output执行
.backgrad(grad_output)
语句.
举个:
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
#output
tensor([ 1210.7769, -263.2759, -1356.7284], grad_fn=)
此时输出y不是标量,因此需要给一个和输出相同维度的向量。
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad)
#output
tensor([1.0240e+02, 1.0240e+03, 1.0240e-01])
三、更多
Document about autograd.Function
is at https://pytorch.org/docs/stable/autograd.html#function
四、参考
Pytorch 60分钟教程