pytorch __init__、forward与__call__的用法小结


Posted in Python onFebruary 27, 2021

1.介绍

当我们使用pytorch来构建网络框架的时候,也会遇到和tensorflow(tensorflow __init__、build 和call小结)类似的情况,即经常会遇到__init__、forward和call这三个互相搭配着使用,那么它们的主要区别又在哪里呢?

1)__init__主要用来做参数初始化用,比如我们要初始化卷积的一些参数,就可以放到这里面,这点和tf里面的用法是一样的

2)forward是表示一个前向传播,构建网络层的先后运算步骤

3)__call__的功能其实和forward类似,所以很多时候,我们构建网络的时候,可以用__call__替代forward函数,但它们两个的区别又在哪里呢?

当网络构建完之后,调__call__的时候,会去先调forward,即__call__其实是包了一层forward,所以会导致两者的功能类似。

在pytorch在nn.Module中,实现了__call__方法,而在__call__方法中调用了forward函数:

https://github.com/pytorch/pytorch/blob/master/torch/nn/modules/module.py

pytorch __init__、forward与__call__的用法小结

2.代码

import torch
import torch.nn as nn
import torch.nn.functional as F
 
class Net(nn.Module):
 def __init__(self, in_channels, mid_channels, out_channels):
 super(Net, self).__init__()
 self.conv0 = torch.nn.Sequential(
 torch.nn.Conv2d(in_channels, mid_channels, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)),
 torch.nn.LeakyReLU())
 self.conv1 = torch.nn.Sequential(
 torch.nn.Conv2d(mid_channels, out_channels * 2, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))
 
 def forward(self, x):
 x = self.conv0(x)
 x = self.conv1(x)
 return x
 
class Net(nn.Module):
 def __init__(self, in_channels, mid_channels, out_channels):
 super(Net, self).__init__()
 self.conv0 = torch.nn.Sequential(
 torch.nn.Conv2d(in_channels, mid_channels, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)),
 torch.nn.LeakyReLU())
 self.conv1 = torch.nn.Sequential(
 torch.nn.Conv2d(mid_channels, out_channels * 2, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))
 
 def __call__(self, x):
 x = self.conv0(x)
 x = self.conv1(x)
 return x

补充:torch/nn目录结构以及__init__.py

torch/nn目录结构以及init.py

pytorch __init__、forward与__call__的用法小结

torch/nn目录结构

__init__.py:

from .modules import *
#nn.modules  导入modules目录下内容 定义容器modules
from .parameter import Parameter
#nn.Parameter 导入parameter.py  定义parameter
from .parallel import DataParallel
#导入parallel目录下data_parallel.py中的DataParallel类
from . import init
#nn.init   导入init.py   参数初始化
from . import utils
#nn.utils  导入utils目录下内容 官网api下nn.utils下api

对于backends, functional.py, _functions 需要在代码前重新Import

例如我们常用的

import torch.nn.functional as F 就是导入了functional.py

backends和_functions是functional.py实现各种函数时所用到的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
python调用cmd复制文件代码分享
Dec 27 Python
Python编程之属性和方法实例详解
May 19 Python
使用Python对MySQL数据操作
Apr 06 Python
Python基于递归算法实现的走迷宫问题
Aug 04 Python
python中requests和https使用简单示例
Jan 18 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
python如何爬取个性签名
Jun 19 Python
Python/ArcPy遍历指定目录中的MDB文件方法
Oct 27 Python
Django CBV类的用法详解
Jul 26 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
Aug 17 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
Dec 26 Python
Python基于Tkinter编写crc校验工具
May 06 Python
python 实现有道翻译功能
Feb 26 #Python
Python爬取酷狗MP3音频的步骤
Feb 26 #Python
python利用xpath爬取网上数据并存储到django模型中
Feb 26 #Python
用python 绘制茎叶图和复合饼图
Feb 26 #Python
python lambda的使用详解
Feb 26 #Python
python爬虫scrapy框架之增量式爬虫的示例代码
Feb 26 #Python
详解Python openpyxl库的基本应用
Feb 26 #Python
You might like
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
Yii 2.0在Grid中格式化时间方法示例
2017/06/06 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
PHP日期和时间函数的使用示例详解
2020/08/06 PHP
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
Python、Javascript中的闭包比较
2015/02/04 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
python如何删除文件中重复的字段
2019/07/16 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
Pytorch之contiguous的用法
2019/12/31 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
伦敦的高级牛仔布专家:Trilogy
2018/08/06 全球购物
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
纬创Java面试题笔试题
2014/10/02 面试题
商学院大学生求职的自我评价
2014/03/12 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
公司优秀员工获奖感言
2014/08/14 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
MSSQL基本语法操作
2022/04/11 SQL Server