[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的区别

下节写如何构建神经网络

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

猜你喜欢

转载自blog.csdn.net/qq_38939991/article/details/108379012