在使用Pytorch自定义网络模型的时候,我们需要继承nn.Module这个类,然后定义forward方法来实现前向转播。如下图的一个自定义的网络模型

首先该网络模型的初始化方法__init__需要继承父类nn.Module的初始化方法,用语句super().init()实现。并在初始化方法里面,定义了卷积、BN、激活函数等。接下来定义forward方法,将整个网络连接起来。
   有了上面的定义,我们可以实例化一个对象,例如:
fire2 = Fire(96, 128,16,64,64)
实现前向传播,使用
y= fire2(x)
其中x是该网络的输入,y是输出,实现了forward方法的额功能。这里就会有人感到奇怪,forward作为Fire这个类的方法,使用的时候不应该是
y= fire2.forward(x)
吗。这里为什么一个类的实例可以当做方法直接使用?这是因为这个Fire类继承的父类nn.Module里面定义了__call__方法。一个类如果定义了__call__方法,则该类的实例就可以作为一个方法那样直接使用。例如下列代码[1]

class A():def __call__(self):print('i can be called like a function')a = A()
a()

就会执行print函数,打印其中搞的文字。这里需要区别的是,实例化的时候,类的名称后面括号可以传递参数,例如前面实例化Fire的时候,传递in_channel,out_channel等参数。但是要利用__call__的特性,是在实例名后面的括号中传递参数,例如上面的例子a(),这里虽然没有参数,但是也可以改变__call__的定义使之可以传递参数。
   回到网络模型的内容上来。翻看nn.Module的部分源码[2],可以发现,nn.Module里面果然定义了__call__,并且传递了参数*input。在__call__的定义中国,调用了self.forward。

这里其实还有一个点值得注意。其实nn.Module里面并没有定义forward,但他却调用self.forward,严格来说,他是“想要”调用self.forward。如果我们没有定义一个类,例如Fire,来继承nn.Module,并且在这个类里面定义forward,那么nn.Module中__call__下面的self.forward就是无效的。这意味着,父类中__call__下面调用的函数,可以在继承他的子类中定义。下面给出一个简单的例子。

class father():def __call__(self):self.forward()print('I''m the father!')class child(father):def forward(self):print('Forward!')
F=father()
C=child()

这里定义了父类father,并定义了继承他的一个子类child。此外还进行了他们的实例化。显然,在father的__call__方法下面,调用了self.forward,但是没有定义。child在继承了father之后,定义了forward。首先,这段代码不会报错,即使father的__call__下面的self.forward并没有定义,这也是前面我说的,虽然没有定义forward,但是可以理解为他“想要”调用self.forward。那么在child记成了father之后,进行了forward的定义,这使得child本身可以调用forward。
   在上面这段代码的基础上,如果我们执行F(),汇报下面这一段错误,这解释了forward没有定义,只是“想要”调用self.forward。

如果我们执行C(),则如下图输出。显然,在child中补充了forward的定义,就可以成功调用。

参考文献

[1] JY丫丫,pytorch 中的 forward 的使用与解释,2019-07-25。
[2] 墨氲,pytorch系列 ----暂时就叫5的番外吧: nn.Modlue及nn.Linear 源码理解,2019-10-09。

Pytorch forward方法调用原理相关推荐

  1. 趣谈iOS运行时的方法调用原理

    一个成熟的计算机语言必然有丰富的体系,复杂的容错机制,处理逻辑以及判断逻辑.但这些复杂的逻辑都是围绕一个主线丰富和展开的,所以在学习计算机语言的时候,先掌握核心,然后了解其原理,明白程序语言设计的实质 ...

  2. pytorch.forward()方法

    https://www.cnblogs.com/llfctt/p/10967651.html

  3. Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理

    Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理 1. 重载包括:普通方法的重载和构造方法的重载 1 1.1. 横向重载"和"纵向重载"1 1.2.  ...

  4. Java执行引擎工作原理:方法调用

    Java执行引擎工作原理:方法调用 方法调用如何实现 函数指针和指针函数 CallStub源码详解 Git链接(有HotSpot源码) 1 方法调用如何实现 计算机核心三大功能:方法调用.取指.运算 ...

  5. OC语言基础一:OC方法调用机制,new方法实现原理

    文章目录 OC方法调用机制 new方法实现原理 野指针 内存溢出 内存泄漏 alloc和init OC方法调用机制 OC有两种方法 Person *person=[Person new]; [pers ...

  6. 揭密 Java方法调用的底层原理

    关注公众号"java后端技术全栈" 回复"000"获取优质面试资料 大家好,我是老田,今天来和大家聊聊Java方法调用的底层原理. 我们在日常开发中,其实很少去 ...

  7. java方法调用之动态调用多态(重写override)的实现原理——方法表

    转自:http://blog.csdn.net/fan2012huan/article/details/51007517 上两篇篇博文讨论了java的重载(overload)与重写(override) ...

  8. Java JVM 动态方法调用指令 invokedynamic 实现分析(以 Lambda 表达式实现原理为例)...

    一.前言 对于 invokedynamic 指令的实现需要方法句柄作为前提知识点.可参考 Java JVM 动态方法调用之方法句柄 MethodHandle. 本文以 Lambda 表达式中运用 in ...

  9. Pytorch forward()的简单理解与用法

    1.基本用法 在pytorch中,使用torch.nn包来构建神经网络,我们定义的网络继承自nn.Module类.而一个nn.Module包含神经网络的各个层(放在__init__里面)和前向传播方式 ...

  10. 【forward方法--深度学习】

    1.基本用法 在pytorch中,使用torch.nn包来构建神经网络,我们定义的网络继承自nn.Module类.而一个nn.Module包含神经网络的各个层(放在__init__里面)和前向传播方式 ...

最新文章

  1. ASP.NET2.0中的ClientScriptManager 类用法—如何添加客户端事件!
  2. LoRa VS NB-IoT,一场物联网时代C位争夺战
  3. java 登录下线_java 实现 一个账号只能在一个地方登陆,其他地方被下线
  4. 验证码广告:站长增加收入新渠道
  5. 手起刀落-一起来写经典的贪吃蛇游戏
  6. 产品认知:说说产品经理的底层思维——用户思维
  7. 如何查找android emulator内核的精确版本
  8. 苹果mac文档处理工具:microsoftword
  9. 深入理解Intel Core Microarchitecture
  10. 目前计算机新技术应用领域,计算机的应用领域分为哪六个方面
  11. 开源项目9GAG源码解析与Material改造(一)
  12. 使用 163 邮箱接收 ASP.NET 用户反馈
  13. 什么是云数据库RDS
  14. ps、firewords在win78中无法直接拖入的问题解决方法
  15. jquery对文本赋值和取值_jQuery常用的取值或赋值的方法
  16. 数据驱动决策:如何用数据分析推动业务增长
  17. php读取文件使用redis的pipeline导入大批量数据
  18. Codeforces Educational Round#21 F(808F) Solution:网络流(最小割)
  19. 运维工程师需要具备哪些性格特质?
  20. AtCoder Beginner Contest 254 A~E 题解

热门文章

  1. html中的abbr有什么作用,HTML中abbr元素的使用介绍
  2. MYCNCART博客系统
  3. 计算机组成原理 / 反汇编实验(2)拆弹实验
  4. 热血传奇之资源文件与地图的读取分析
  5. 十四、数字图像处理之图像压缩
  6. 转神经网络压缩提升方法
  7. python微信抢票脚本_春节到了 教你使用python来抢票回家
  8. Swing Copters摇摇欲坠游戏再次风靡全球,再次虐心,摔手机
  9. java框架技术路线 2019.10.3
  10. 设计心理学2-与复杂共处【读书笔记】