PyTorch之nn.ReLU与F.ReLU的区别介绍


Posted in Python onJune 27, 2020

我就废话不多说了,大家还是直接看代码吧~

import torch.nn as nn
import torch.nn.functional as F
import torch.nn as nn
 
class AlexNet_1(nn.Module):
 
  def __init__(self, num_classes=n):
    super(AlexNet, self).__init__()
    self.features = nn.Sequential(
      nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1),
      nn.BatchNorm2d(64),
      nn.ReLU(inplace=True),
     )
 
  def forward(self, x):
    x = self.features(x)
 
class AlexNet_2(nn.Module):
 
  def __init__(self, num_classes=n):
    super(AlexNet, self).__init__()
    self.features = nn.Sequential(
      nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1),
      nn.BatchNorm2d(64),
     )
 
  def forward(self, x):
    x = self.features(x)
    x = F.ReLU(x)

在如上网络中,AlexNet_1与AlexNet_2实现的结果是一致的,但是可以看到将ReLU层添加到网络有两种不同的实现,即nn.ReLU和F.ReLU两种实现方法。

其中nn.ReLU作为一个层结构,必须添加到nn.Module容器中才能使用,而F.ReLU则作为一个函数调用,看上去作为一个函数调用更方便更简洁。具体使用哪种方式,取决于编程风格。

在PyTorch中,nn.X都有对应的函数版本F.X,但是并不是所有的F.X均可以用于forward或其它代码段中,因为当网络模型训练完毕时,在存储model时,在forward中的F.X函数中的参数是无法保存的。

也就是说,在forward中,使用的F.X函数一般均没有状态参数,比如F.ReLU,F.avg_pool2d等,均没有参数,它们可以用在任何代码片段中。

补充知识:pytorch小知识点——in-place operation

一、什么是in-place

在pytorch的很多函数中经常看到in-place选项,具体是什么意思一直一知半解。这次专门来学习一下,in-place operation在pytorch中是指改变一个tensor的值的时候,不经过复制操作,而是直接在原来的内存上改变它的值。可以把它称为原地操作符。

在pytorch中经常加后缀“_”来代表原地in-place operation,比如说.add_() 或者.scatter()。我们可以将in_place操作简单的理解类似于python中的"+=","-="等操作。

举个例子,下面是正常的加操作,执行结束后x的值没有变化

import torch
x = torch.rand(2)
x
Out[3]: tensor([0.3486, 0.2924])  #<-----这是x初始值
 
y = torch.rand(2)
y
Out[5]: tensor([0.6301, 0.0101])  #<-----这是y初始值
x.add(y)
Out[6]: tensor([0.9788, 0.3026])   #<-----这是x+y的结果
x
Out[7]: tensor([0.3486, 0.2924])  #<-----这是执行操作之后x的值
y
Out[8]: tensor([0.6301, 0.0101])   #<-----这是执行操作之后y的值

我们可以发现,在正常操作之后原操作数的值不会发生变化。

下面我们来看看in_place操作

import torch
x = torch.rand(2)
x
Out[3]: tensor([0.3486, 0.2924])  #<-----这是x初始值
y = torch.rand(2)
y
Out[5]: tensor([0.6301, 0.0101])  #<-----这是y初始值
x.add_(y)
Out[9]: tensor([0.9788, 0.3026])  #<-----这是x+y结果
x
Out[10]: tensor([0.9788, 0.3026]) #<-----这是操作后x的值
y
Out[11]: tensor([0.6301, 0.0101])  #<-----这是操作后y的值

通过对比可以发现,in_place操作之后,原操作数等于表达式计算结果。也就是说将计算结果赋给了原操作数。

二、不能使用in-place的情况

对于 requires_grad=True 的 叶子张量(leaf tensor) 不能使用 inplace operation

对于在 求梯度阶段需要用到的张量 不能使用 inplace operation

以上这篇PyTorch之nn.ReLU与F.ReLU的区别介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python标准库defaultdict模块使用示例
Apr 28 Python
在Python中使用mechanize模块模拟浏览器功能
May 05 Python
浅谈对yield的初步理解
May 29 Python
深入理解Python中range和xrange的区别
Nov 26 Python
Python文本特征抽取与向量化算法学习
Dec 22 Python
Java与Python两大幸存者谁更胜一筹呢
Apr 12 Python
python如何以表格形式打印输出的方法示例
Jun 21 Python
Python字典推导式将cookie字符串转化为字典解析
Aug 10 Python
Jupyter Notebook的连接密码 token查询方式
Apr 21 Python
Python列表如何更新值
May 27 Python
简单介绍一下pyinstaller打包以及安全性的实现
Jun 02 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
Jan 08 Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 #Python
Pytorch 高效使用GPU的操作
Jun 27 #Python
Keras中的两种模型:Sequential和Model用法
Jun 27 #Python
keras输出预测值和真实值方式
Jun 27 #Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 #Python
浅谈keras 模型用于预测时的注意事项
Jun 27 #Python
python suds访问webservice服务实现
Jun 26 #Python
You might like
Laravel框架模板继承操作示例
2018/06/11 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
2020/12/30 PHP
JS OOP包机制,类创建的方法定义
2009/11/02 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
深入理解Promise.all
2018/08/08 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
Python实现从百度API获取天气的方法
2015/03/11 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
python使用SMTP发送qq或sina邮件
2017/10/21 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
2019/02/28 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
2020/07/03 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
学生党员批评与自我批评
2014/10/15 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
python使用shell脚本创建kafka连接器
2022/04/29 Python