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实现类似ftp传输文件的网络程序示例
Apr 08 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
Python实现正则表达式匹配任意的邮箱方法
Dec 20 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
Jan 17 Python
深入浅析python 协程与go协程的区别
May 09 Python
使用Bazel编译TensorBoard教程
Feb 15 Python
Python递归实现打印多重列表代码
Feb 27 Python
解决Python图形界面中设置尺寸的问题
Mar 05 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
详解python 条件语句和while循环的实例代码
Dec 28 Python
Python matplotlib 利用随机函数生成变化图形
Apr 26 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数据库配置文件一般做法分享
2012/07/07 PHP
解析thinkphp的左右值无限分类
2013/06/20 PHP
php中多维数组按指定value排序的实现代码
2014/08/19 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
php使用pdo连接并查询sql数据库的方法
2014/12/24 PHP
Javascript实现CheckBox的全选与取消全选的代码
2010/07/20 Javascript
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
jQuery实现frame之间互通的方法
2017/06/26 jQuery
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
javascript实现摄像头拍照预览
2019/09/30 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
2020/05/13 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
[03:55]2014DOTA2国际邀请赛 Fnatic经理采访赢DK在情理之中
2014/07/10 DOTA
Python urls.py的三种配置写法实例详解
2017/04/28 Python
Python实现的密码强度检测器示例
2017/08/23 Python
python GUI实例学习
2017/11/21 Python
Python实现数据结构线性链表(单链表)算法示例
2019/05/04 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
Python pandas RFM模型应用实例详解
2019/11/20 Python
python返回数组的索引实例
2019/11/28 Python
html5 touch事件实现触屏页面上下滑动(二)
2016/03/10 HTML / CSS
HTML5标签小集
2011/08/02 HTML / CSS
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
护理职业应聘自荐书
2013/09/29 职场文书
机电一体化应届生求职信范文
2014/01/24 职场文书
经典婚礼主持词
2014/03/13 职场文书
2015社区爱国卫生工作总结
2015/04/21 职场文书
退休欢送会主持词
2015/07/01 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
JavaScript异步操作中串行和并行
2021/11/20 Javascript