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函数的笔记整理
Apr 07 Python
python查看微信好友是否删除自己
Dec 19 Python
python实现12306抢票及自动邮件发送提醒付款功能
Mar 08 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
python中从str中提取元素到list以及将list转换为str的方法
Jun 26 Python
python实现简单的单变量线性回归方法
Nov 08 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
Jan 23 Python
python getpass模块用法及实例详解
Oct 07 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
Dec 27 Python
在脚本中单独使用django的ORM模型详解
Apr 01 Python
教你用python控制安卓手机
May 13 Python
Python实现双向链表
May 25 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
phpwind中的数据库操作类
2007/01/02 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
php计算年龄精准到年月日
2015/11/17 PHP
PHP+redis实现的购物车单例类示例
2019/02/02 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
jQuery 获取URL参数的插件
2010/03/04 Javascript
javascript delete 使用示例代码
2010/03/29 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
javascript获取web应用根目录的方法
2014/02/12 Javascript
js性能优化技巧
2015/11/29 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
jquery实现数字输入框
2017/02/22 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
2020/08/06 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
Python中的ConfigParser模块使用详解
2015/05/04 Python
Python自定义简单图轴简单实例
2018/01/08 Python
tensorflow 1.0用CNN进行图像分类
2018/04/15 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
使用python批量修改文件名的方法(视频合并时)
2020/03/24 Python
Python中的上下文管理器相关知识详解
2019/09/19 Python
NumPy统计函数的实现方法
2020/01/21 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
营销总经理的岗位职责
2013/12/15 职场文书
大学生学业生涯规划
2014/01/05 职场文书
工作会议欢迎词
2014/01/16 职场文书
《在家里》教后反思
2014/03/01 职场文书
读书活动总结
2014/04/28 职场文书
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers