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使用reportlab画图示例(含中文汉字)
Dec 03 Python
python开发中module模块用法实例分析
Nov 12 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
用Python写一段用户登录的程序代码
Apr 22 Python
python实现简单的单变量线性回归方法
Nov 08 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
Dec 17 Python
django2.0扩展用户字段示例
Feb 13 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 Python
pytest中文文档之编写断言
Sep 12 Python
pytorch实现从本地加载 .pth 格式模型
Feb 14 Python
用python批量下载apk
Dec 29 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
用PHP和ACCESS写聊天室(二)
2006/10/09 PHP
PHP SQLite类
2009/05/07 PHP
php常用Stream函数集介绍
2013/06/24 PHP
如何取得中文字符串中出现次数最多的子串
2013/08/08 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
PHP基于自增数据如何生成不重复的随机数示例
2017/05/19 PHP
在laravel5.2中实现点击用户头像更改头像的方法
2019/10/14 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
jQuery实现别踩白块儿网页版小游戏
2017/01/18 Javascript
Angular 4环境准备与Angular cli创建项目详解
2017/05/27 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
详解vue-cli3使用
2018/08/14 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
[01:03:47]VP vs NewBee Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
Python本地与全局命名空间用法实例
2015/06/16 Python
Python实现带百分比的进度条
2016/06/28 Python
简单了解Python中的几种函数
2017/11/03 Python
Python创建字典的八种方式
2019/02/27 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
amaze ui 的使用详细教程
2020/08/19 HTML / CSS
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
职称评定自我鉴定
2014/03/18 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
班主任寄语2015
2015/02/26 职场文书
教你nginx跳转配置的四种方式
2022/07/07 Servers