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 11 Python
python正则表达式re模块详细介绍
May 29 Python
Python 26进制计算实现方法
May 28 Python
在Django的上下文中设置变量的方法
Jul 20 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
详解django.contirb.auth-认证
Jul 16 Python
对Python3 解析html的几种操作方式小结
Feb 16 Python
pandas 层次化索引的实现方法
Jul 06 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
Aug 18 Python
python 伯努利分布详解
Feb 25 Python
如何利用Python动态模拟太阳系运转
Sep 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
用Socket发送电子邮件
2006/10/09 PHP
PHP中uploaded_files函数使用方法详解
2011/03/09 PHP
php生成EAN_13标准条形码实例
2013/11/13 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
深入理解Javascript闭包 新手版
2010/12/28 Javascript
jquery 插件学习(二)
2012/08/06 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
JS定时器实例详细分析
2013/10/11 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
跟我学习javascript的undefined与null
2015/11/17 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
[48:30]LGD vs infamous Supermajor小组赛D组 BO3 第一场 6.3
2018/06/04 DOTA
用python删除java文件头上版权信息的方法
2014/07/31 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
Python字符串匹配之6种方法的使用详解
2019/04/08 Python
Python的pygame安装教程详解
2020/02/10 Python
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
财务会计应届生求职信
2013/11/24 职场文书
物业保安主管岗位职责
2013/12/25 职场文书
2013年军训通讯稿
2014/02/05 职场文书
培训通知
2015/04/17 职场文书
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
vue使用refs获取嵌套组件中的值过程
2022/03/31 Vue.js