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高效编程技巧
Jan 07 Python
Python自动连接ssh的方法
Mar 07 Python
Python中正则表达式的用法总结
Feb 22 Python
python使用PyQt5的简单方法
Feb 27 Python
python装饰器练习题及答案
Nov 01 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
Feb 06 Python
PyTorch笔记之scatter()函数的使用
Feb 12 Python
python日期与时间戳的各种转换示例
Feb 12 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 Python
python上下文管理的使用场景实例讲解
Mar 03 Python
python opencv人脸识别考勤系统的完整源码
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
实现树状结构的两种方法
2006/10/09 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
PHP实现邮件群发的源码
2013/06/18 PHP
php使用curl访问https示例分享
2014/01/17 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
2013/11/07 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
深入分析js的冒泡事件
2014/12/05 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
微信小程序CSS3动画下拉菜单效果
2018/11/04 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
python中黄金分割法实现方法
2015/05/06 Python
python 远程统计文件代码分享
2015/05/14 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
临床医学专业个人的自我评价
2013/09/27 职场文书
精细化工应届生求职信
2013/11/17 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
作文批改评语
2014/12/25 职场文书
升职自荐信范文
2015/03/27 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
MySQL创建定时任务
2022/01/22 MySQL