gpt4 book ai didi

PyTorch之nn.ReLU与F.ReLU的区别介绍

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章PyTorch之nn.ReLU与F.ReLU的区别介绍由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

我就废话不多说了,大家还是直接看代码吧~ 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 。

1、什么是in-place 。

在pytorch的很多函数中经常看到in-place选项,具体是什么意思一直一知半解。这次专门来学习一下,in-place operation在pytorch中是指改变一个tensor的值的时候,不经过复制操作,而是直接在原来的内存上改变它的值。可以把它称为原地操作符.

在pytorch中经常加后缀“_”来代表原地in-place operation,比如说.add_() 或者.scatter()。我们可以将in_place操作简单的理解类似于python中的"+=","-="等操作.

举个例子,下面是正常的加操作,执行结束后x的值没有变化 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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操作 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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操作之后,原操作数等于表达式计算结果。也就是说将计算结果赋给了原操作数.

2、不能使用in-place的情况 。

对于 requires_grad=True 的 叶子张量(leaf tensor) 不能使用 inplace operation 。

对于在 求梯度阶段需要用到的张量 不能使用 inplace operation 。

以上这篇PyTorch之nn.ReLU与F.ReLU的区别介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.

原文链接:https://blog.csdn.net/u011501388/article/details/86602275 。

最后此篇关于PyTorch之nn.ReLU与F.ReLU的区别介绍的文章就讲到这里了,如果你想了解更多关于PyTorch之nn.ReLU与F.ReLU的区别介绍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com