Pytorch学习笔记(2) Autograd(自动求导) —— PyTorch的核心

本文是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的结构:


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分钟教程

你可能感兴趣的:(Pytorch学习笔记(2) Autograd(自动求导) —— PyTorch的核心)