PyTorch之nn.ReLU与F.ReLU的区别介绍
作者:鹊踏枝-码农 发布时间:2021-01-19 04:47:24
我就废话不多说了,大家还是直接看代码吧~
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
来源:https://blog.csdn.net/u011501388/article/details/86602275


猜你喜欢
- 最近在使用Python开发系统,需连接mysql数据库,我用的是Python3连接MySQL8.0,其中老是报错以下问题:网上给了各种各样的
- pytorch中基本的变量类型当属FloatTensor(以下都用floattensor),而Variable(以下都用variable)是
- 什么是 Python 中的 Lambda 函数今天我们来学习 Python 中的 lambda 函数,并探讨使用它的优点和局限性Let
- 首先明确为什么要使用分页查询,因为数据庞大,查询不可能全部显示在页面上,如果全部显示在页面上,也会造成查询速度慢的情况,所以分页查询解决了①
- 序言那个猥琐的家伙整天把个U盘藏着当宝,到睡觉了就拿出来插到电脑上。我决定想个办法看他U盘里都藏了什么,直接去抢U盘是不可能的,骗也是不可能
- python数据结构之 列表和元组序列:序列是一种数据结构,它包含的元素都进行了编号(从0开始)。典型的序列包括列表、字符串和元组。其中,列
- 当需要远程办公时,使用pycharm远程连接服务器时必要的。PyCharm提供两种远程调试(Remote Debugging)的方式:配置远
- 支持向量机常用于数据分类,也可以用于数据的回归预测1、Question?我们经常会遇到这样的问题,给你一些属于两个类别的数据(如子图1),需
- 问题:关于如何生成随机记录(二)如何从指定表中随机抽取一定量的记录?sql server 中 select top 10 * fr
- Matlab将矩阵保存到csv和txt文件语法:csvwrite(filename,M)csvwrite(filename,M,row,co
- 如果备份的数据库有2个文件,分别是.LDF 和 .MDF,打开企业管理器,在实例上右击---所有任务--附加数据库,然后选择那个.MDF文件
- Oracle数据库开发应用中经常对数据库管理员有这样的需求,对比两个不同实例间某模式下对象的差异或者对比两个不同实例某模式下表定义的差异性,
- 代码如下:from PIL import Image #图像处理模块import numpy as npa = np.asarr
- 前言说起这个事情吧也相对来说比较尴尬,对于一个技术来说忘记密码然后找回密码都是相当简单的一个事情,但是在生产环境中没有保存记录只能是自己的失
- Cookies的处理作用保存客户端的相关状态在爬虫中如果遇到了cookie的反爬如何处理?手动处理 在抓
- Win8.1下安装Python3.6提示0x80240017错误,如何解决?定位原因缺少Windows补丁KB2999226解决方法到Mic
- 今天我们继续向大家介绍一款翻页效果的制作。当鼠标移动到链接上时,翻页的链接区除了有悬停效果,还会放大。这样的效果具有很强烈的效果。大家适当美
- 一.图像灰度线性变换原理图像的灰度线性变换是通过建立灰度映射来调整原始图像的灰度,从而改善图像的质量,凸显图像的细节,提高图像的对比度。灰度
- 背景:实现用python的optimize库的fsolve对非线性方程组进行求解。可以看到这一个问题实际上还是一个优化问题,也可以用之前拟合
- python绘制横向水平柱状条形图Bar,供大家参考,具体内容如下import matplotlibimport randomimport