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中的元祖(Tuple)和字典(Dict)
Apr 21 Python
Python常用内置模块之xml模块(详解)
May 23 Python
python中模块的__all__属性详解
Oct 26 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
Python实现带参数的用户验证功能装饰器示例
Dec 14 Python
Python设计模式之抽象工厂模式原理与用法详解
Jan 15 Python
python 获取微信好友列表的方法(微信web)
Feb 21 Python
python openpyxl使用方法详解
Jul 18 Python
python 将视频 通过视频帧转换成时间实例
Apr 23 Python
python如何提升爬虫效率
Sep 27 Python
如何正确理解python装饰器
Jun 15 Python
使用python生成大量数据写入es数据库并查询操作(2)
Sep 23 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
用Flash图形化数据(一)
2006/10/09 PHP
解决php中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
一步一步学习PHP(4) php 函数 补充2
2010/02/15 PHP
php 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
php检测图片主要颜色的方法
2015/07/01 PHP
详解PHP中的Traits
2015/07/29 PHP
PHP自定义错误用法示例
2016/09/28 PHP
thinkPHP事务操作简单案例分析
2019/10/17 PHP
基于Jquery的动态添加控件并取值的实现代码
2010/09/24 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
js实现随机点名功能
2020/12/23 Javascript
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
python中的set实现不重复的排序原理
2018/01/24 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
Win系统PyQt5安装和使用教程
2019/12/25 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
女方婚礼新郎答谢词
2014/01/11 职场文书
倡议书范文格式
2014/05/12 职场文书
2014年酒店服务员工作总结
2014/12/08 职场文书
2015入党自传书范文
2015/06/26 职场文书
2016年父亲节寄语
2015/12/04 职场文书
python tqdm用法及实例详解
2021/06/16 Python
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB