深度之眼Pytorch打卡(五):Pytorch计算图(动态图与静态图)与自动求导tensor.backgrad()

前言


   算法的实现过程就是张量进行各种运算的过程,而计算图(Computational Graph)就是记录这些运算过程的有向无环图,比如前向传播时输入张量经过加、减、乘、除得到输出张量,那么计算图就会记录输入输出张量、加减乘除运算和一些中间变量,这是进行反向传播的前提。自动求导是很重要的方法,有这样的机制,可以让我们在设计模型的时候避免去写繁琐的梯度计算代码。本笔记的框架主要来源于深度之眼,并作了一些相关的拓展,拓展内容主要源自对torch文档的翻译理解和一些介绍tensorflow和Pytorch的网站。


静态图与动态图


   计算图分为静态图和动态图。静态图,顾名思义就是图是确定的,即整个运算过程预先定义好了,然后再次运行的过程中只运算而不再搭建计算图,看起来就是数据在规定的图中流动。动态图,就是计算图是动态生成的,即边运算边生成计算图,是一个不断完成的过程,可能每运行一行代码都会拓展计算图。动态图便于调试、灵活,静态图速度要高效一些,但是不能改变数据流向。

   计算图是静态的深度学习框架,比较典型的就是Tensorflow。其也是因为张量在预先定义的图中流动而得名tensor flow,如图1所示(图片来自一介绍tensorflow的国外网站)。
在这里插入图片描述

图1.tensor在计算图中flow

   Pytorch的计算图就是动态的,如图2所示(图片来自github上的Pytorch),几乎每进行一次运算都会拓展原先的计算图。最后生成完成,进行反向传播,当反向传播完成,计算图默认会被清除,即进行前向传播时记录的计算过程会被释放掉。所以,默认情况下,进行一次前向传播后最多只能用生成的计算图进行一次反向传播。
在这里插入图片描述

图2.Pytorch动态生成计算图

自动求导


  • 张量属性

   回顾一下在笔记:​​深度之眼Pytorch打卡(二):Pytorch张量与张量的创建中梳理的张量的几个与自动求导有关的属性。所有属性如图3所示。
​​在这里插入图片描述

图3.tensor属性

   data: 用于存放tensor,是数据本体。

   grad: 存放data的梯度值。

   grad_fn: 记录生成该张量时所用的方法(函数——如乘法:grad_fn = < MulBackward0 >,加法:grad_fn = < AddBackward0 >),用于反向传播自动求梯度时选择求导方式。

   requires_grad: 指示该是否需要梯度,对于需要求导的tensor,其requires_grad属性必须为True,这样自动求导时才会对该张量求梯度。自己定义的tensor的requires_grad属性默认为False。神经网络层中的权值wtensorrequires_grad属性默认为True,求导对象与被求导对象之间的中间变量也默认True

   is_ leaf : 指示是否是叶子结点(张量),用户创建的结点称为叶子结点(张量)如XW,运算生成的则不是。梯度计算时的值来源于叶子节点,即求各节点的梯度值时,都要带入叶子结点的值进表达式,所以在一次反向传播完成前叶子结点的值不能在原地址上被修改(In-place operation)(修改会报错)is_leafTrue的时候是叶子节点。叶子节点在经过反向传播之后梯度值能够得以保留,非叶子节点的梯度值则为:None,中间虽然算过,但是最后默认都释放了。

   代码中的计算图(计算过程)是:x = a + b;y = x.w;z = 0.5*y^2;m = (z - 1)/2;n = m - 0.1;p = sin(n);

import torch

a = torch.eye(4, 3)
b = torch.full_like(a, 1)
x = torch.add(a, 1, b)
w = torch.randn(len(x[0]), 1, requires_grad=True)
y = torch.mm(x, w)
z = 0.5*y**2
m = (z - 1)/2
n = m - 0.1
p = torch.sin(n)
n.retain_grad
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值