Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >torch.autograd.Function

torch.autograd.Function

作者头像
狼啸风云
修改于 2022-09-02 14:33:09
修改于 2022-09-02 14:33:09
1.4K00
代码可运行
举报
运行总次数:0
代码可运行
  1. 对Function的直观理解
  2. Function与Module的差异与应用场景
  3. 写一个简单的ReLU Function

1.对Function的直观理解

  • 在之前的介绍中,我们知道,Pytorch是利用Variable与Function来构建计算图的。回顾下Variable,Variable就像是计算图中的节点,保存计算结果(包括前向传播的激活值,反向传播的梯度),而Function就像计算图中的边,实现Variable的计算,并输出新的Variable。
  • Function简单说就是对Variable的运算,如加减乘除,relu,pool等。
  • 但它不仅仅是简单的运算。与普通Python或者numpy的运算不同,Function是针对计算图,需要计算反向传播的梯度。因此他不仅需要进行该运算(forward过程),还需要保留前向传播的输入(为计算梯度),并支持反向传播计算梯度。
  • 在之前Variable的学习中,我们知道进行一次运算后,输出的Variable对应的creator就是其运行的计算,如y = relu(x), y.creator,就是relu这个Function。
  • 我们可以对Function进行拓展,使其满足我们自己的需要,而拓展就需要自定义Function的forward运算,已经对应的backward运算,同时在forward中需要通过保存输入值用于backward。
  • 总结,Function与Variable构成了pytorch的自动求导机制,它定义的是各个Variable之间的计算关系。

2. Function与Module的差异与应用场景

  • Function一般只定义一个操作,因为其无法保存参数,因此适用于激活函数、pooling等操作;Module是保存了参数,因此适合于定义一层,如线性层,卷积层,也适用于定义一个网络。
  • Function需要定义三个方法:__init__, forward, backward(需要自己写求导公式);Module:只需定义__init__和forward,而backward的计算由自动求导机制构成。
  • 可以不严谨的认为,Module是由一系列Function组成,因此其在forward的过程中,Function和Variable组成了计算图,在backward时,只需调用Function的backward就得到结果,因此Module不需要再定义backward。
  • Module不仅包括了Function,还包括了对应的参数,以及其他函数与变量,这是Function所不具备的。

3. 一个ReLU Function

  1. 首先我们定义一个继承Function的ReLU类。
  2. 然后我们来看Variable在进行运算时,其creator是否是对应的Function。
  3. 最后我们为方便使用这个ReLU类,将其wrap成一个函数,方便调用,不必每次显式都创建一个新对象

3.1 定义一个ReLU类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
from torch.autograd import Variable

class MyReLU(torch.autograd.Function):

    def forward(self, input_):
        # 在forward中,需要定义MyReLU这个运算的forward计算过程
        # 同时可以保存任何在后向传播中需要使用的变量值
        self.save_for_backward(input_)         # 将输入保存起来,在backward时使用
        output = input_.clamp(min=0)           # relu就是截断负数,让所有负数等于0
        return output

    def backward(self, grad_output):
        # 根据BP算法的推导(链式法则),dloss / dx = (dloss / doutput) * (doutput / dx)
        # dloss / doutput就是输入的参数grad_output、
        # 因此只需求relu的导数,在乘以grad_outpu    
        input_, = self.saved_tensors
        grad_input = grad_output.clone()
        grad_input[input < 0] = 0       # 上述计算的结果就是左式。即ReLU在反向传播中可以看做一个通道选择函数,所有未达到阈值(激活值<0)的单元的梯度都为0
        return grad_input

3.2 验证Variable与Function的关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from torch.autograd import Variable
input_ = Variable(torch.randn(1))
relu = MyReLU()
output_ = relu(input_)

# 这个relu对象,就是output_.creator,即这个relu对象将output与input连接起来,形成一个计算图
print relu
print output_.creator


Output:
<__main__.MyReLU object at 0x7fd0b2d08b30>
<__main__.MyReLU object at 0x7fd0b2d08b30>

可见,Function连接了Variable与Variable并实现不同计算.

3.3 Wrap一个ReLU函数

可以直接把刚才自定义的ReLU类封装成一个函数,方便直接调用,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def relu(input_):
    # MyReLU()是创建一个MyReLU对象,
    # Function类利用了Python __call__操作,使得可以直接使用对象调用__call__制定的方法
    # __call__指定的方法是forward,因此下面这句MyReLU()(input_)相当于
    # return MyReLU().forward(input_)
    return MyReLU()(input_)
input_ = Variable(torch.linspace(-3, 3, steps=5))
print input_
print relu(input_) 


Output:
Variable containing:
-3.0000
-1.5000
 0.0000
 1.5000
 3.0000
[torch.FloatTensor of size 5]

Variable containing:
 0.0000
 0.0000
 0.0000
 1.5000
 3.0000
[torch.FloatTensor of size 5]
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PyTorch 源码解读之 torch.autograd
来源 | https://zhuanlan.zhihu.com/p/321449610
磐创AI
2021/02/23
1.9K0
PyTorch 源码解读之 torch.autograd
pytorch 学习笔记之编写 C 扩展
该文介绍了如何使用 PyTorch 实现 LeNet-5 模型,包括模型结构、训练过程、使用方法等。同时,还提供了一些示例代码和注释,方便读者理解和实践。
丁科
2017/05/05
2.4K0
Pytorch 学习笔记之自定义 Module
本文介绍了如何使用 PyTorch 实现自定义循环神经网络(RNN)。首先介绍了如何定义一个自定义的 RNN 模块,然后通过一个简单的例子展示了如何使用自定义的 RNN 模块构建一个循环神经网络。在例子中,使用 PyTorch 提供的类实现了一个基本的 RNN,该类可以自动求导,并能够处理任意长度的序列。最后,介绍了如何使用 PyTorch 构建更复杂的循环神经网络。
丁科
2017/05/05
7.3K1
Pytorch 学习笔记之自定义 Module
torch.autograd.Function 用法及注意事项
众所周知,作为深度学习框架之一的 PyTorch 和其他深度学习框架原理几乎完全一致,都有着自动求导机制,当然也可以说成是自动微分机制。有些时候,我们不想要它自带的求导机制,需要在它的基础之上做些扩展,这个时候我们只需借用 PyTorch 框架中的 Function 类就可以实现了。
不可言诉的深渊
2022/11/11
1.4K0
torch.autograd.Function 用法及注意事项
pytorch学习笔记(七):pytorch hook 和 关于pytorch backward过程的理解
ke1th
2018/01/02
3.6K0
pytorch中autograd以及hook函数详解
有些公式为图片,如果这个页面加载不出来,请看这里:https://oldpan.me/archives/pytorch-autograd-hook
老潘
2018/05/14
3.4K4
pytorch中autograd以及hook函数详解
探讨pytorch中nn.Module与nn.autograd.Function的backward()函数
本文讲解基于pytorch0.4.0版本,如不清楚版本信息请看这里。backward()在pytorch中是一个经常出现的函数,我们一般会在更新loss的时候使用它,比如loss.backward()。通过对loss进行backward来实现从输出到输入的自动求梯度运算。但是这里的backward()如果追根溯源一下,或者说Go to definition一下,我们会发现,其实这个backward是来源于torch.autograd.backward。
老潘
2018/05/23
5.3K0
探讨pytorch中nn.Module与nn.autograd.Function的backward()函数
pytorch 学习笔记(一)
pytorch是一个动态的建图的工具。不像Tensorflow那样,先建图,然后通过feed和run重复执行建好的图。相对来说,pytorch具有更好的灵活性。 编写一个深度网络需要关注的地方是:
ke1th
2018/01/02
1.7K0
动态计算图
Pytorch是一个基于Python的机器学习库。它广泛应用于计算机视觉,自然语言处理等深度学习领域。是目前和TensorFlow分庭抗礼的深度学习框架,在学术圈颇受欢迎。
lyhue1991
2020/07/20
2.1K0
动态计算图
深度解析 PyTorch Autograd:从原理到实践
自动微分(Automatic Differentiation,简称 Autograd)是深度学习和科学计算领域的核心技术之一。它不仅在神经网络的训练过程中发挥着至关重要的作用,还在各种工程和科学问题的数值解法中扮演着关键角色。
TechLead
2023/12/13
2.7K0
深度解析 PyTorch Autograd:从原理到实践
【他山之石】适合PyTorch小白的官网教程:Learning PyTorch With Examples
“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。
马上科普尚尚
2020/12/03
5970
【他山之石】适合PyTorch小白的官网教程:Learning PyTorch With Examples
[源码解析] 深度学习流水线并行 GPipe(3) ----重计算
GPipe是一个基于 Lingvo (Lingvo 是 Google 基于 TensorFlow 二次开发的重点针对序列模型的框架)开发的,支持超大规模模型的神经网络训练并行库,本文介绍其重计算功能,同时可以和其他实现一起印证。
罗西的思考
2021/09/08
1.2K0
pytorch学习笔记(十七):python 端扩展 pytorch
本文介绍了如何通过继承PyTorch中的`Function`类来实现自定义算子的前向传播和反向传播。通过继承`Function`,可以自定义一个算子,该算子可以接收一个张量作为输入,然后输出一个张量。在自定义算子的前向传播过程中,需要调用`forward`方法,并传入一个上下文对象,以便在反向传播过程中获取梯度。在自定义算子的反向传播过程中,需要调用`backward`方法,并传入一个梯度对象,以便计算梯度。最后,通过调用`gradcheck`方法来检查梯度是否正确计算。
ke1th
2018/01/02
1.3K0
PyTorch专栏(四):小试牛刀
【磐创AI 导读】:本篇文章讲解了PyTorch专栏的第三章中的PyTorch小试牛刀。查看专栏历史文章,请点击下方蓝色字体进入相应链接阅读。查看关于本专栏的介绍:PyTorch专栏开篇。想要更多电子杂志的机器学习,深度学习资源,大家欢迎点击上方蓝字关注我们的公众号:磐创AI。
磐创AI
2019/09/09
1.4K0
PyTorch专栏(四):小试牛刀
半小时学会 PyTorch Hook
提到 hook,我首先想起的是动画《小飞侠》里滑稽的 captain hook,满满童年的回忆促使我 P 了张题图:虎克船长勾着 PyTorch 的 logo。同时想起的还有大名鼎鼎的胡克定律:Hooke's law(虽然不是一个 hook),当年上物理实验课,看着弹簧测力计下面的钩子,联想到胡克被牛顿爵士打压的悲惨一生,不由发出既生胡何生牛的唏嘘……然而本文将介绍的是 PyTorch 中的 hook。
SIGAI学习与实践平台
2019/07/30
4.1K1
半小时学会 PyTorch Hook
with torch.autograd.set_detect_anomaly(True)
在深度学习中,自动微分是训练神经网络的关键技术之一。PyTorch作为一个广泛使用的深度学习框架,提供了强大的自动微分功能。然而,在处理复杂的模型或计算图时,可能会出现梯度计算错误或其他异常。为了帮助调试这些问题,PyTorch提供了torch.autograd.set_detect_anomaly(True)函数,用于启用自动微分异常检测。
大盘鸡拌面
2023/11/25
1.5K0
pytorch说明
假设我们有一个简单的神经网络模型,我们想要训练它。在这个过程中,我们会使用 requires_grad 来控制梯度的计算。
用户11315985
2024/10/16
2060
pytorch说明
Automatic differentiation package - torch.autograd
torch.autograd提供实现任意标量值函数的自动微分的类和函数。它只需要对现有代码进行最小的更改—您只需要声明张量s,对于该张量,应该使用requires_grad=True关键字计算梯度。
狼啸风云
2019/09/25
1.6K0
pytorch学习笔记(十八):C 语言扩展 pytorch
本文介绍了如何通过Cffi扩展PyTorch,使得可以在C++中调用PyTorch的API。作者通过一个简单的示例,展示了如何通过继承PyTorch的Function和Module,在C++中实现自定义的PyTorch操作,并提供了相应的代码示例。此外,作者还讨论了使用Cffi扩展PyTorch的优缺点,并提醒读者需要注意PyTorch的ABI问题。
ke1th
2018/01/02
1.5K0
干货 | PyTorch相比TensorFlow,存在哪些自身优势?
1、 PyTorch 课替代NumPy 使用:PyTorch 本身主要构件是张量——和 NumPy 看起来差不多。使得 PyTorch 可支持大量相同的 API,有时候可以把它用作是 NumPy 的替代品。PyTorch 的开发者们这么做的原因是希望这种框架可以完全获得 GPU 加速带来的便利,以便你可以快速进行数据预处理,或其他任何机器学习任务。将张量从 NumPy 转换至 PyTorch 非常容易,反之亦然。看看如下代码: import torch import numpy as np numpy_t
IT派
2018/03/28
3.5K0
干货 | PyTorch相比TensorFlow,存在哪些自身优势?
相关推荐
PyTorch 源码解读之 torch.autograd
更多 >
加入讨论
的问答专区 >
后端开发擅长3个领域
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    本文部分代码块支持一键运行,欢迎体验
    本文部分代码块支持一键运行,欢迎体验