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实现基于SVM手写数字识别功能
May 27 Python
详解python使用Nginx和uWSGI来运行Python应用
Jan 09 Python
PyQt5实现下载进度条效果
Apr 19 Python
python最长回文串算法
Jun 04 Python
python抓取京东小米8手机配置信息
Nov 13 Python
python3中利用filter函数输出小于某个数的所有回文数实例
Nov 24 Python
使用Pandas的Series方法绘制图像教程
Dec 04 Python
python 函数中的参数类型
Feb 11 Python
如何用tempfile库创建python进程中的临时文件
Jan 28 Python
Python使用pyenv实现多环境管理
Feb 05 Python
Python如何使用神经网络进行简单文本分类
Feb 25 Python
python 实现图与图之间的间距调整subplots_adjust
May 21 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
Smarty模板快速入门
2007/01/04 PHP
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
JQuery autocomplete 使用手册
2010/04/01 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
Jquery操作Ajax方法小结
2015/11/29 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
input框中的name和id的区别
2016/11/16 Javascript
使用 Node.js 实现图片的动态裁切及算法实例代码详解
2018/09/29 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
用python实现刷点击率的示例代码
2019/02/21 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
使用python求解二次规划的问题
2020/02/29 Python
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
大学校园生活自我鉴定
2014/01/13 职场文书
大课间活动制度
2014/01/18 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
数学教研活动总结
2014/07/02 职场文书
环卫工人慰问信
2015/02/15 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
Python matplotlib多个子图绘制整合
2022/04/13 Python
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android