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通过正则查找微博@(at)用户的方法
Mar 13 Python
python实现在windows下操作word的方法
Apr 28 Python
Python3实现简单可学习的手写体识别(实例讲解)
Oct 21 Python
在python里从协程返回一个值的示例
Feb 19 Python
Python爬虫学习之获取指定网页源码
Jul 30 Python
Python拼接字符串的7种方式详解
Mar 19 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
python MultipartEncoder传输zip文件实例
Apr 07 Python
django rest framework 过滤时间操作
Jul 12 Python
Selenium 安装和简单使用的实现
Dec 04 Python
python 实现有道翻译功能
Feb 26 Python
Python实战之大鱼吃小鱼游戏的实现
Apr 01 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
php抓即时股票信息
2006/10/09 PHP
php数组键值用法实例分析
2015/02/27 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
Yii2语言国际化自动配置详解
2018/08/22 PHP
JavaScript入门之基本函数详解
2011/10/21 Javascript
查找iframe里元素的方法可传参
2013/09/11 Javascript
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
jquery使用hide方法隐藏指定id的元素
2015/03/30 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
js中对函数设置默认参数值的3种方法
2015/10/23 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
python基础教程之数字处理(math)模块详解
2014/03/25 Python
python实现简单神经网络算法
2018/03/10 Python
python 检查文件mime类型的方法
2018/12/08 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
Python 分发包中添加额外文件的方法
2019/08/16 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
tornado+celery的简单使用详解
2019/12/21 Python
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
荷兰最大的儿童服装店:The Kids Republic
2019/04/13 全球购物
行政部主管岗位职责
2013/12/28 职场文书
毕业生的自我评价范文
2013/12/31 职场文书
行政专员的岗位职责
2014/03/10 职场文书
环保小标语
2014/06/13 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
消防验收申请报告
2015/05/15 职场文书
2016年最美孝心少年事迹材料
2016/02/26 职场文书