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系列之数据处理编程实例(二)
May 22 Python
python中list循环语句用法实例
Nov 10 Python
解决python3在anaconda下安装caffe失败的问题
Jun 15 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
Python学习笔记之自定义函数用法详解
Jun 08 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
Python pickle模块实现对象序列化
Nov 22 Python
Python列表list操作相关知识小结
Jan 29 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
Jun 03 Python
python 操作excel表格的方法
Dec 05 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
Mar 04 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
解析左右值无限分类的实现算法
2013/06/20 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
2014/12/25 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
php禁用cookie后session设置方法分析
2016/10/19 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
javascript 词法作用域和闭包分析说明
2010/08/12 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
js的2种继承方式详解
2014/03/04 Javascript
JS获取URL中参数值(QueryString)的4种方法分享
2014/04/12 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
jQuery使用cookie与json简单实现购物车功能
2016/04/15 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
微信小程序实现左右联动的实战记录
2018/07/05 Javascript
[38:30]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场2
2014/05/24 DOTA
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
Python中的map、reduce和filter浅析
2014/04/26 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
Python实现程序的单一实例用法分析
2015/06/03 Python
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
Python基础教程之异常详解
2019/01/10 Python
Python 内置函数globals()和locals()对比详解
2019/12/23 Python
pygame实现弹球游戏
2020/04/14 Python
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
八项规定个人对照检查材料思想汇报
2014/09/25 职场文书
社区端午节活动总结
2015/02/11 职场文书