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 相关文章推荐
使用Python3 编写简单信用卡管理程序
Dec 21 Python
浅谈python中copy和deepcopy中的区别
Oct 23 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
使用python进行波形及频谱绘制的方法
Jun 17 Python
python常用库之NumPy和sklearn入门
Jul 11 Python
Python使用指定端口进行http请求的例子
Jul 25 Python
python中设置超时跳过,超时退出的方式
Dec 13 Python
Django集成celery发送异步邮件实例
Dec 17 Python
pandas 中对特征进行硬编码和onehot编码的实现
Dec 20 Python
django迁移文件migrations的实现
Mar 31 Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 Python
python 制作磁力搜索工具
Mar 04 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学习之字符串比较和查找
2011/04/17 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
Laravel5.1框架路由分组用法实例分析
2020/01/04 PHP
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
JavaScript DOM 学习第九章 选取范围的介绍
2010/02/19 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
2017/12/29 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
layui 表单标签的校验方法
2019/09/04 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
python设置检查点简单实现代码
2014/07/01 Python
利用Python生成文件md5校验值函数的方法
2017/01/10 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
Python 中的函数装饰器和闭包详解
2021/02/06 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
关于HTML5语义标签的实践(blog页面)
2016/07/12 HTML / CSS
Ellos丹麦:时尚和服装在线
2016/09/19 全球购物
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
中职生自荐信
2013/10/13 职场文书
大学军训感言200字
2014/02/26 职场文书
六个一活动实施方案
2014/03/21 职场文书
石油工程专业毕业生求职信
2014/04/13 职场文书
应聘英语教师求职信
2014/04/24 职场文书
网站出售协议书范文
2014/10/10 职场文书
三年级学生期末评语
2014/12/26 职场文书