欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[PyTorch] 笔记02:Autograd 自动求导

程序员文章站 2022-04-04 23:51:55
...

[PyTorch] 笔记02:Autograd 自动求导

源自 PyTorch 1.4教程

Outline

  • Tensor
  • torch.autograd.backward
    • 若结果节点为标量
    • 若结果节点为矢量

[PyTorch] 笔记02:Autograd 自动求导

PyTorch中,所有神经网络的核心是 autograd 包

1 Tensor

  • torch.Tensor 是这个autograd的核心类

  • 一个张量Tensor通常记录的属性如下:

    • data:存储的数据信息
    • requires_grad: 设置为True则表示该Tensor需要求导
    • grad: 该Tensor的梯度值,每次在计算backward时都需要将前一时刻的梯度归零,否则梯度值会一直累加
    • grad_fn: 叶子节点(即自变量)通常为None,只有结果节点(即因变量)的grad_fn才有效,用于指示梯度函数是哪种类型。
    • is_leaf: 用来指示该Tensor是否是叶子节点。

参见Pytorch autograd,backward详解

  • requires_grad=True
    • 追踪对应张量的所有操作
    • 默认requires_grad为Flase
    a = torch.randn(2, 2)
    a = ((a * 3) / (a - 1))
    print(a.requires_grad)
    a.requires_grad_(True)
    print(a.requires_grad)

    #输出
    False
    True
  • .detach() 方法
    • 阻止张量被追踪
    • 调用 .detach() 方法将其与计算历史分离,并阻止它未来的计算记录被跟踪
  • with torch.no_grad():
    • 为了防止跟踪历史记录(和使用内存),可以将代码块包装在 with torch.no_grad(): 中
  • grad_fn
    • 只有因变量有其属性
    x=torch.tensor(1.0,requires_grad=True)
    y=torch.tensor(2.0,requires_grad=True)
    z=x+y
    print(x,y,z)

    #输出
    tensor(1., requires_grad=True) tensor(2., requires_grad=True) tensor(3., grad_fn=<AddBackward0>)

2 torch.autograd.backward

源代码接口

    torch.autograd.backward(
                      tensors, 
                      grad_tensors=None, 
                      retain_graph=None, 
                      create_graph=False)
  • 参数含义
    • tensor: 用于计算梯度的tensor
      torch.autograd.backward(tensor) 与 tensor.backward()写法等价
    • grad_tensors: 在计算矩阵的梯度时会用到。他其实也是一个tensor,shape一般需要和前面的tensor保持一致
    • retain_graph: 通常在调用一次backward后,pytorch会自动把计算图销毁,所以要想对某个变量重复调用backward,则需要将该参数设置为True
    • create_graph: 当设置为True的时候可以用来计算更高阶的梯度

2.1 若结果节点为标量

  • 标量可理解为一维的
  • 直接应用backward即可
  • 参考示例如下:
    x=torch.tensor(3.0,requires_grad=True)
    y=torch.tensor(7.0,requires_grad=True)
    z=x+y
    z.backward()
    #返回x,y的梯度,z的值
    print(x.grad,y.grad,z)

    #输出
    tensor(1.) tensor(1.) tensor(10., grad_fn=<AddBackward0>)

2.2 若结果为矢量

  • 矢量可理解为高维,多维
  • 参考了pytorch中文文档和知乎的文章,感觉知乎的文章更好理解,但其本质上是一样的,即传入一个与前面张量tensor相同的一个张量
  • 参考示例如下:
    x=torch.ones(4,requires_grad=True)   #x=[x1,x2,x3,x4]
    #print(x.type())      torch.FloatTensor
    z=x+2   #z=[x1+2,x2+2,x3+2,x4+2]
    #若传入的都是1
    z.backward(torch.ones_like(z))
    #若传入的是自己设定的
    #z.backward(torch.Tensor([1,2,3,4]))  #z=[x1+2,2(x2+2),3(x3+2),4(x4+2)]  注意类型的匹配 Tensor默认为torch.FloatTensor型
    #z.backward(torch.tensor([1.,2.,3.,4.]))  #z=[x1+2,2(x2+2),3(x3+2),4(x4+2)]
    print(x.grad)

    #输出
    tensor([1., 1., 1., 1.])
    #tensor([1., 2., 3., 4.])

在写的过程中发现tensor和Tensor原来是不一样的

  • torch.Tensor
    • 默认的tensor类型(torch.FlaotTensor)的简称
  • torch.tensor
    • 根据后面的data创建Tensor,Tensor类型根据数据进行推断。

参见【PyTorch】Tensor和tensor的区别

下节写如何构建神经网络

欢迎批评指正,一起学习进步!!!

[PyTorch] 笔记02:Autograd 自动求导