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读写文件操作示例程序
Dec 02 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
python交互式图形编程实例(一)
Nov 17 Python
python matplotlib画图实例代码分享
Dec 27 Python
Python面向对象实现一个对象调用另一个对象操作示例
Apr 08 Python
Python Excel处理库openpyxl使用详解
May 09 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
Sep 16 Python
Python collections模块的使用方法
Oct 09 Python
pytorch学习教程之自定义数据集
Nov 10 Python
python中scipy.stats产生随机数实例讲解
Feb 19 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
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
比较全面的PHP数组的使用方法小结
2010/09/23 PHP
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
百度留言本js 大家可以参考下
2009/10/13 Javascript
学习面向对象之面向对象的术语
2010/11/30 Javascript
QQ空间顶部折页撕开效果示例代码
2014/06/15 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
2017/06/03 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
2020/08/22 Javascript
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
详解Django框架中的视图级缓存
2015/07/23 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
在python 不同时区之间的差值与转换方法
2019/01/14 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
使用Pyhton 分析酒店针孔摄像头
2020/03/04 Python
python简单的三元一次方程求解实例
2020/04/02 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
法警的竞聘演讲稿
2014/01/02 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
新员工考核评语
2014/12/31 职场文书
家长通知书家长意见
2015/06/03 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书