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 专题二 条件语句和循环语句的基础知识
Mar 19 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 Python
Sanic框架请求与响应实例分析
Jul 16 Python
Python math库 ln(x)运算的实现及原理
Jul 17 Python
深入了解Django View(视图系统)
Jul 23 Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 Python
Pytorch之view及view_as使用详解
Dec 31 Python
Pycharm debug调试时带参数过程解析
Feb 03 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
Feb 27 Python
使用Python项目生成所有依赖包的清单方式
Jul 13 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
详解matplotlib绘图样式(style)初探
Feb 03 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+dbfile开发小型留言本
2006/10/09 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
PHP解耦的三重境界(浅谈服务容器)
2017/03/13 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
php从数据库读取数据,并以json格式返回数据的方法
2018/08/21 PHP
php实现小程序支付完整版
2018/10/09 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
js弹出div并显示遮罩层
2014/02/12 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
JQuery对表单元素的基本操作使用总结
2014/07/18 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
PHP 502bad gateway原因及解决方案
2020/11/13 Javascript
Python 连连看连接算法
2008/11/22 Python
Python Web开发模板引擎优缺点总结
2014/05/06 Python
Python Pillow Image Invert
2019/01/22 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
Python实现i人事自动打卡的示例代码
2020/01/09 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
英语专业个人求职自荐信
2013/09/21 职场文书
写自荐信的七个技巧
2013/10/15 职场文书
汽车销售顾问求职自荐信
2014/01/01 职场文书
车辆工程专业求职信
2014/06/14 职场文书
教师党员整改措施
2014/10/24 职场文书
前台接待员岗位职责
2015/04/15 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
Redis如何实现分布式锁
2021/08/23 Redis
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电