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写的服务监控程序实例
Jan 31 Python
Python使用scrapy抓取网站sitemap信息的方法
Apr 08 Python
Python实现ssh批量登录并执行命令
Oct 25 Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
PyQt5实现下载进度条效果
Apr 19 Python
将TensorFlow的模型网络导出为单个文件的方法
Apr 23 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
python 列表转为字典的两个小方法(小结)
Jun 28 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
Django的CVB实例详解
Feb 10 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 Python
python编写扎金花小程序的实例代码
Feb 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
提问的智慧
2006/10/09 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
php制作的简单验证码识别代码
2016/01/26 PHP
PHP的自定义模板引擎
2017/03/24 PHP
PHP基于自增数据如何生成不重复的随机数示例
2017/05/19 PHP
Yii2框架自定义验证规则操作示例
2019/02/08 PHP
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
详解数组Array.sort()排序的方法
2020/05/09 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
用原生JS实现简单的多选框功能
2017/06/12 Javascript
React中的render何时执行过程
2018/04/13 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
详解python方法之绑定方法与非绑定方法
2020/08/17 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
html5启动原生APP总结
2020/07/03 HTML / CSS
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
介绍一下Linux文件的记录形式
2012/04/18 面试题
教师绩效考核方案
2014/01/21 职场文书
出国留学经济担保书
2014/04/01 职场文书
关于环保的标语
2014/06/13 职场文书
学校安全责任书范本
2014/07/23 职场文书
关心下一代工作先进事迹
2014/08/15 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
使用Python拟合函数曲线
2022/04/14 Python
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技