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 示例分享---逻辑推理编程解决八皇后
Jul 20 Python
python抽象基类用法实例分析
Jun 04 Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
python追加元素到列表的方法
Jul 28 Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 Python
学Python 3的理由和必要性
Nov 19 Python
python matplotlib imshow热图坐标替换/映射实例
Mar 14 Python
Python 改变数组类型为uint8的实现
Apr 09 Python
python 追踪except信息方式
Apr 25 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
Jun 15 Python
在Keras中CNN联合LSTM进行分类实例
Jun 29 Python
用python画城市轮播地图
May 28 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制作简单的内容采集器的代码
2007/11/28 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
JavaScript null和undefined区别分析
2009/10/14 Javascript
php与js的区别是什么
2013/08/05 Javascript
使用js对select动态添加和删除OPTION示例代码
2013/08/12 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
Javascript基于OOP实实现探测器功能代码实例
2020/08/26 Javascript
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
讲解python参数和作用域的使用
2013/11/01 Python
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
Python用Try语句捕获异常的实例方法
2019/06/26 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
python 爬取马蜂窝景点翻页文字评论的实现
2020/01/20 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
Python如何将模块打包并发布
2020/08/30 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
学生处主任岗位职责
2013/12/01 职场文书
计算机学生的自我评价分享
2014/02/18 职场文书
医药销售自荐书
2014/05/29 职场文书
四查四看整改措施
2014/09/19 职场文书
展览会邀请函
2015/02/02 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
大学生入党自传2015
2015/06/26 职场文书
公司安全管理制度范本
2015/08/05 职场文书
vue引入Excel表格插件的方法
2021/04/28 Vue.js
不要在HTML中滥用div
2021/05/08 HTML / CSS