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下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
Apr 27 Python
Python实现通过继承覆盖方法示例
Jul 02 Python
Python微医挂号网医生数据抓取
Jan 24 Python
django配置连接数据库及原生sql语句的使用方法
Mar 03 Python
matplotlib实现区域颜色填充
Mar 18 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
python 画出使用分类器得到的决策边界
Aug 21 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
Dec 04 Python
基于Python中random.sample()的替代方案
May 23 Python
详解Python利用configparser对配置文件进行读写操作
Nov 03 Python
python 爬取英雄联盟皮肤并下载的示例
Dec 04 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下关于中英数字混排的字符串分割问题
2010/04/06 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
javascript 内存回收机制理解
2011/01/17 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
微信小程序 wx:key详细介绍
2016/10/28 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
vue学习之mintui picker选择器实现省市二级联动示例
2017/10/12 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
Vue Autocomplete 自动完成功能简单示例
2019/05/25 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
js实现动态时钟
2020/03/12 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
python中根据字符串调用函数的实现方法
2016/06/12 Python
Python只用40行代码编写的计算器实例
2017/05/10 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
Python类反射机制使用实例解析
2019/12/30 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
品质标语大全
2014/06/21 职场文书
小学语文教研活动总结
2014/07/01 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
2015年度高中教师工作总结
2015/05/26 职场文书
话题作文之自信作文
2019/11/15 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
Python合并pdf文件的工具
2021/07/01 Python
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL
浅析python中特殊文件和特殊函数
2022/02/24 Python
vue使用watch监听属性变化
2022/04/30 Vue.js
mysql 排序失效
2022/05/20 MySQL
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS