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 14 Python
对于Python异常处理慎用“except:pass”建议
Apr 02 Python
python基于multiprocessing的多进程创建方法
Jun 04 Python
win与linux系统中python requests 安装
Dec 04 Python
TensorFlow实现创建分类器
Feb 06 Python
python实现批量图片格式转换
Jun 16 Python
Python 访问限制 private public的详细介绍
Oct 16 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
python3实现猜数字游戏
Dec 07 Python
python爬虫 urllib模块发起post请求过程解析
Aug 20 Python
python 6种方法实现单例模式
Dec 15 Python
Python趣味挑战之教你用pygame画进度条
May 31 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
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
PHP备份/还原MySQL数据库的代码
2011/01/06 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
基于Swoole实现PHP与websocket聊天室
2016/08/03 PHP
ExtJS[Desktop]实现图标换行示例代码
2013/11/17 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
2016/06/06 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
2016/12/18 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
angular-tree-component的使用详解
2018/07/30 Javascript
微信小程序http连接访问解决方案的示例
2018/11/05 Javascript
JS基于Location实现访问Url、重定向及刷新页面的方法分析
2018/12/03 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
[02:16]完美世界DOTA2联赛PWL S3 集锦第三期
2020/12/21 DOTA
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
selenium 安装与chromedriver安装的方法步骤
2019/06/12 Python
PyTorch的深度学习入门之PyTorch安装和配置
2019/06/27 Python
python 读取修改pcap包的例子
2019/07/23 Python
什么是python类属性
2020/06/10 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
python如何随机生成高强度密码
2020/08/19 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
巴西在线鞋店:Shoestock
2017/10/28 全球购物
财务简历的自我评价
2014/03/05 职场文书
五四青年节活动总结
2015/02/10 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP