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 相关文章推荐
php使用递归与迭代实现快速排序示例
Jan 23 Python
深入理解Javascript中的this关键字
Mar 27 Python
快速了解Python中的装饰器
Jan 11 Python
Python PyQt4实现QQ抽屉效果
Apr 20 Python
Linux系统(CentOS)下python2.7.10安装
Sep 26 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
Jan 21 Python
python os模块在系统管理中的应用
Jun 22 Python
python用opencv 图像傅里叶变换
Jan 04 Python
基于Python实现射击小游戏的制作
Apr 06 Python
python单向链表实例详解
May 25 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
《一拳超人》埼玉一拳下去,他们存在了800年毫无意义!
2020/03/02 日漫
php分页思路以及在ZF中的使用
2012/05/30 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
PHP面向对象多态性实现方法简单示例
2017/09/27 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
arcgis for js 修改infowindow样式的方法
2016/11/02 Javascript
jquery二级目录选中当前页的css样式
2016/12/08 Javascript
React应用中使用Bootstrap的方法
2017/08/15 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
了解前端理论:rscss和rsjs
2019/05/23 Javascript
Python中有趣在__call__函数
2015/06/21 Python
Python读取word文本操作详解
2018/01/22 Python
Python Django Cookie 简单用法解析
2019/08/13 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
python的列表List求均值和中位数实例
2020/03/03 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
.net软件工程师应聘上机试题
2015/03/10 面试题
车工岗位职责
2013/11/26 职场文书
就业协议书的作用
2014/04/11 职场文书
校庆活动策划方案
2014/06/05 职场文书
2014和解协议书范文
2014/09/15 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
优秀员工事迹材料
2014/12/20 职场文书
HTML5 语义化标签(移动端必备)
2021/08/23 HTML / CSS
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle