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中yield生成器的用法
Aug 05 Python
Python基础中所出现的异常报错总结
Nov 19 Python
老生常谈Python序列化和反序列化
Jun 28 Python
Python正则表达式非贪婪、多行匹配功能示例
Aug 08 Python
基于python3实现socket文件传输和校验
Jul 28 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
Mar 18 Python
python图像和办公文档处理总结
May 28 Python
pandas.cut具体使用总结
Jun 24 Python
python同时替换多个字符串方法示例
Sep 17 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
Python try except finally资源回收的实现
Jan 25 Python
Python竟然能剪辑视频
May 25 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游戏编程25个脚本代码
2011/02/08 PHP
php生成图片缩略图的方法
2015/04/07 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
laravel-admin的多级联动方法
2019/09/30 PHP
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
JQuery与JSon实现的无刷新分页代码
2011/09/13 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
2013/08/23 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
JavaScript数组的定义及数字操作技巧
2016/06/06 Javascript
easyui form validate总是返回false的原因及解决方法
2016/11/07 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
three.js 将图片马赛克化的示例代码
2020/07/31 Javascript
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
python 3.7.0 下pillow安装方法
2018/08/27 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
《蜗牛》教学反思
2014/02/18 职场文书
根叔历年演讲稿
2014/05/20 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
个人简历自我评价怎么写
2015/03/10 职场文书
七年级思品教学反思
2016/02/20 职场文书
《迟到》教学反思
2016/02/24 职场文书