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处理Excel文件实例代码
Jun 20 Python
python验证码识别的示例代码
Sep 21 Python
Python Flask基础教程示例代码
Feb 07 Python
对numpy和pandas中数组的合并和拆分详解
Apr 11 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
python3.4 将16进制转成字符串的实例
Jun 12 Python
python Django编写接口并用Jmeter测试的方法
Jul 31 Python
Python实现Singleton模式的方式详解
Aug 08 Python
python二进制读写及特殊码同步实现详解
Oct 11 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
Feb 29 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
解决c++调用python中文乱码问题
Jul 29 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+MSSQL分页的例子
2006/10/09 PHP
php教程 插件机制在PHP中实现方案
2012/11/02 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
PHP实现的敏感词过滤方法示例
2019/03/06 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
javascript 定义新对象方法
2010/02/20 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
2014/08/11 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
小程序实现单选多选功能
2018/11/04 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
python实现批量转换图片为黑白
2020/06/16 Python
Python Merge函数原理及用法解析
2020/09/16 Python
scrapy实践之翻页爬取的实现
2021/01/05 Python
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
大学生学年自我鉴定
2014/02/10 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
佛光寺导游词
2015/02/10 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
Python中tqdm的使用和例子
2022/09/23 Python