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格式的简单方法(推荐)
Dec 30 Python
Python中生成Epoch的方法
Apr 26 Python
python xlsxwriter库生成图表的应用示例
Mar 16 Python
python 获取list特定元素下标的实例讲解
Apr 09 Python
Pandas DataFrame 取一行数据会得到Series的方法
Nov 10 Python
用Python解决x的n次方问题
Feb 08 Python
Python魔法方法详解
Feb 13 Python
python实现批量处理将图片粘贴到另一张图片上并保存
Dec 12 Python
python输入中文的实例方法
Sep 14 Python
运行Python编写的程序方法实例
Oct 21 Python
基于python的matplotlib制作双Y轴图
Apr 20 Python
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
Jun 08 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函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
简单实用的js调试logger组件实现代码
2010/11/20 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
2019/05/15 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
ES11新增的这9个新特性,你都掌握了吗
2020/10/15 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
使用python在本地电脑上快速处理数据
2017/06/22 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
使用python爬虫获取黄金价格的核心代码
2018/06/13 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
python实现在列表中查找某个元素的下标示例
2020/11/16 Python
武汉东之林科技有限公司机试
2013/09/17 面试题
百度JavaScript笔试题
2015/01/15 面试题
开工仪式主持词
2014/03/20 职场文书
安全生产大检查方案
2014/05/07 职场文书
旅游投诉信范文
2015/07/02 职场文书
python关于集合的知识案例详解
2021/05/30 Python