pytorch 中forward 的用法与解释说明


Posted in Python onFebruary 26, 2021

前言

最近在使用pytorch的时候,模型训练时,不需要使用forward,只要在实例化一个对象中传入对应的参数就可以自动调用 forward 函数

即:

forward 的使用

class Module(nn.Module):
 def __init__(self):
  super(Module, self).__init__()
  # ......
  
 def forward(self, x):
  # ......
  return x
data = ..... #输入数据
# 实例化一个对象
module = Module()
# 前向传播
module(data) 
# 而不是使用下面的
# module.forward(data)

实际上

module(data)

是等价于

module.forward(data)

forward 使用的解释

等价的原因是因为 python calss 中的__call__和__init__方法.

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

out:

i can be called like a function

__call__里调用其他的函数

class A():
 def __call__(self, param):
  
  print('i can called like a function')
  print('传入参数的类型是:{} 值为: {}'.format(type(param), param))
 
  res = self.forward(param)
  return res
 
 def forward(self, input_):
  print('forward 函数被调用了')
 
  print('in forward, 传入参数类型是:{} 值为: {}'.format( type(input_), input_))
  return input_ 
a = A() 
input_param = a('i')
print("对象a传入的参数是:", input_param)

out:

i can called like a function

传入参数的类型是:<class ‘str'> 值为: i

forward 函数被调用了

in forward, 传入参数类型是:<class ‘str'> 值为: i

对象a传入的参数是: i

补充:Pytorch 模型中nn.Model 中的forward() 前向传播不调用 解释

在pytorch 中没有调用模型的forward()前向传播,只实列化后把参数传入。

定义模型

class Module(nn.Module):
 def __init__(self):
  super(Module, self).__init__()
  # ......
 
 def forward(self, x):
  # ......
  return x
data = ..... #输入数据
# 实例化一个对象
module = Module()
# 前向传播 直接把输入传入实列化
module(data) 
#没有使用module.forward(data)

实际上module(data) 等价于module.forward(data)

等价的原因是因为 python calss 中的__call__ 可以让类像函数一样调用

当执行model(x)的时候,底层自动调用forward方法计算结果

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

在__call__ 里可调用其它的函数

class A():
 def __call__(self, param):
  
  print('我在__call__中,传入参数',param)
 
  res = self.forward(param)
  return res
 
 def forward(self, x):
  print('我在forward函数中,传入参数类型是值为: ',x)
  return x
 
a = A()
y = a('i')
 >>> 我在__call__中,传入参数 i
 >>>我在forward函数中,传入参数类型是值为: i
print("传入的参数是:", y)
 >>>传入的参数是: i

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
用python分割TXT文件成4K的TXT文件
May 23 Python
python 中文件输入输出及os模块对文件系统的操作方法
Aug 27 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
python实现简单加密解密机制
Mar 19 Python
python设置随机种子实例讲解
Sep 12 Python
python是否适合网页编程详解
Oct 04 Python
Python @property原理解析和用法实例
Feb 11 Python
python在不同条件下的输入与输出
Feb 13 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
Jun 03 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
python 实现控制鼠标键盘
Nov 27 Python
Python实现提取PDF简历信息并存入Excel
Apr 02 Python
浅谈Python xlwings 读取Excel文件的正确姿势
Feb 26 #Python
pycharm Tab键设置成4个空格的操作
Feb 26 #Python
解决pycharm 格式报错tabs和space不一致问题
Feb 26 #Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 #Python
Python爬取网站图片并保存的实现示例
Feb 26 #Python
python中使用asyncio实现异步IO实例分析
Feb 26 #Python
浅析Python模块之间的相互引用问题
Feb 26 #Python
You might like
PHP 高手之路(一)
2006/10/09 PHP
php面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
yii实现图片上传及缩略图生成的方法
2014/12/04 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
2016/06/13 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
Python如何为图片添加水印
2016/11/25 Python
Python编程判断这天是这一年第几天的方法示例
2017/04/18 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
Django框架请求生命周期实现原理
2020/11/13 Python
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
资深地理教师自我评价
2013/09/21 职场文书
感谢信的格式
2015/01/21 职场文书
初中班主任工作总结2015
2015/05/13 职场文书
运动员代表致辞
2015/07/29 职场文书
OpenCV-Python实现图像平滑处理操作
2021/06/08 Python
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB
教你nginx跳转配置的四种方式
2022/07/07 Servers