一起来学PyTorch——Autograd反向传播

在计算机视觉的深度学习中,Tensor数据可以完成前向传播,想要完成整套的神经网络的训练,还需要反向传播和梯度更新,而PyTorch提供了自动求导机制autograd。可以将前向传播的计算记录成计算图,并自动完成求导。有了这些数据后,可以从根节点出发,自动进行反向传播与梯度计算,从而得到每一个变量的梯度,梯度计算遵循链式求导法则。本文主要讲述Pytorch的应用,如果大家对反向传播感兴趣,可以留言,之后再详细的讲述一下。

  1. Autograd

自动求导机制记录了Tensor的操作,以便自动求导和反向传播。这个自动求导机制默认是关闭的,需要在创建Tensor数据时,修改requires_grad参数,将它的参数值设为True。设置为True之后,依赖于该Tensor数据的所有节点都会进行求导。

Tensor数据有两个重要的属性,分别记录了该Tensor的梯度和进行过的操作。

  1. grad:该Tensor对应的梯度,类型为Tensor,并且和该Tensor数据同维度。

  1. grad_fn:指向function对象,表示对该Tensor数据进行过什么样的操作,可以用作反向传播的梯度计算。

  1. 计算图

计算图可以简单理解成节点和箭头,用来表示一个计算公式。

图中的x,a和b都是用户输入的变量,都为叶节点。在反向传播中要计算的就是这些点的梯度。输入a和x后,进行乘法运算,即y=ab,得到y。然后输入b,进行加法运算,即z=y+b,得到z。并且z成为根节点。这就是一个简单的前向计算,根据公式和输入的值,输出结果。

Autograd的工作原理就是在前向计算的过程中形成计算图,并将function【表示数学计算的函数】记录在Tensor数据的grad_fn属性里。完成前向计算后,只需要对根节点,进行backward函数操作,就可以从当前根节点自动进行反向传播和梯度计算,从而得到每一个叶子节点的梯度。【根节点指图中的z,叶子节点指输入的x,a,b】

# 生成3个tensor变量,并作为叶节点
>>> x = torch.randn(1)
>>> a = sorch.ones(1, requires_grad=True)
>>> b = torch.ones(1, requires_grad=True)
# 自己生成的Tensor都是叶子节点
>>> x.is_leaf, a.is_leaf, b.is_leaf
(True, True, True)
# 默认是不需要求导,关键字赋值为True后则需要求导
>>> x.requires_grad, a.requires_grad, b.requires_grad
(False, True, True)
# 进行前向计算,由计算生成的变量都不是叶子节点
>>> y = a*x
>>> z = y+b
>>> y.is_leaf, z.is_leaf
(False, False)
# grad_fn记录操作
>>> y.grad_fn
<MulBackward1 object at 0x7f4d4b49e208>
>>> z.grad_fn
<AddBackward1 object at 0x7f4d4b49e0f0>
# 对根节点调用backward()函数,进行反向传播
>>> z.backward(retain_graph = True)
>>> a.grad
tensor([-2.2474])
>>> b.grad
tensor([1])

  1. Autograd重点概念

  1. 动态图特征

PyTorch建立的计算图是动态的。也就是说,在程序运行时,随着前向传播的运行,构建计算图。

  1. backward()函数

如果根节点是向量,需要设置grad_variabels属性,代表了根节点的导数。因为PyTorch只允许标量对于Tensor求导。【关于这个函数,大家感兴趣的话,可以留言。我们详细的了解一下】

  1. 梯度累加

感谢大家的阅读,有任何的问题都可以在评论区留言,我们共同学习!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值