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线程池(threadpool)模块使用笔记详解
Nov 17 Python
Python使用re模块实现信息筛选的方法
Apr 29 Python
Python动态生成多维数组的方法示例
Aug 09 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
通过python实现随机交换礼物程序详解
Jul 10 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
Python实现朴素贝叶斯的学习与分类过程解析
Aug 24 Python
pytorch多GPU并行运算的实现
Sep 27 Python
Python文件路径名的操作方法
Oct 30 Python
tensorflow使用指定gpu的方法
Feb 04 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 Python
Pytest中skip和skipif的具体使用方法
Jun 30 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.MVC的模板标签系统(二)
2006/09/05 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
jquery动态添加option示例
2013/12/30 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
JS去除iframe滚动条的方法
2015/04/01 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
微信小程序登录态和检验注册过没的app.js写法
2019/05/22 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
python获取Linux下文件版本信息、公司名和产品名的方法
2014/10/05 Python
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
python机器学习之神经网络实现
2018/10/13 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
某公司C#程序员面试题笔试题
2014/05/26 面试题
元旦联欢会主持词
2014/03/26 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
保研推荐信
2014/05/09 职场文书
公司委托书格式
2014/08/01 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
学生检讨书怎么写
2014/10/09 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
死亡诗社观后感
2015/06/05 职场文书
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers