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之多进程和进程池(Processing库)
Jun 09 Python
python简单线程和协程学习心得(分享)
Jun 14 Python
Python数据类型之Dict字典实例详解
May 07 Python
Python实现中值滤波去噪方式
Dec 18 Python
python 实现将list转成字符串,中间用空格隔开
Dec 25 Python
Python实现新型冠状病毒传播模型及预测代码实例
Feb 05 Python
python 项目目录结构设置
Feb 14 Python
什么是python的id函数
Jun 11 Python
Python datetime 如何处理时区信息
Sep 02 Python
Pycharm安装第三方库失败解决方案
Nov 17 Python
手把手教你配置JupyterLab 环境的实现
Feb 02 Python
用Python实现Newton插值法
Apr 17 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
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
2018/07/31 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
JMenuTab简单使用说明
2008/03/13 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
toggle()隐藏问题的解决方法
2014/02/17 Javascript
javascript监听鼠标滚轮事件浅析
2014/06/05 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
Python3多线程操作简单示例
2018/05/22 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
家庭教育先进个人事迹材料
2014/01/24 职场文书
2014年母亲节寄语
2014/05/07 职场文书
巾帼志愿者活动方案
2014/08/17 职场文书
银行会计主管岗位职责
2014/10/01 职场文书
趣味运动会口号
2015/12/24 职场文书
JavaScript获取URL参数的方法分享
2022/04/07 Javascript
分享node.js实现简单登录注册的具体代码
2022/04/26 NodeJs