当前位置:   article > 正文

神经网络改进方案:全局平均池化替代全连接层_全局平均池化代替全连接层

全局平均池化代替全连接层

基本原理

全局平均池化英文名为:global average pooling简称为GAP
其具体实现过程在原文 << Network In Network >> 中为:
在这里插入图片描述
可以看出其是将矩阵中的 [w,h] ,进行平均池化变为一个单元。也即进行Flattrn和FC。其详细原理的图形示例可参考下图:
在这里插入图片描述
其实也就是通过池化层将原有的输入为 [b,c,h,w] 减少成 [b,c,1,1] 的尺寸也即上文提到的将 [w,h] 进行平均池化变为一个单元。

与FC层区别

在常见的卷积神经网络中,全连接层之前的卷积层负责对图像进行特征提取,在获取特征后,传统的方法是接上全连接层之后再进行激活分类,而GAP的思路是使用GAP来替代该全连接层(即使用池化层的方式来降维),更重要的一点是保留了前面各个卷积层和池化层提取到的空间信息\语义信息,所以在实际应用中效果提升也较为明显!,另外,GAP去除了对输入大小的限制!,而且在卷积可视化Grad-CAM中也有重要的应用.(来源于原文)

用一张图来进行形象的原理上的描述即为:
在这里插入图片描述

GAP替代FC层具体方案

由原理介绍我们可以明白GAP主要还是进行池化来缩减参数量,但是假如你想在FC层得到一个特定大小的特征图这是GAP层所不能做到的(仅限于个人理解,如有错位还请指出)。而FC层又是如何实现能得到特定大小特征图输出的呢,下图可以解释:
在这里插入图片描述
可以看到FC层参数两巨大的原因就在于faltten的时候需要将每一个单元整形,那么我们如何利用GAP层来输出我们想要的特征图呢,具体如下图所示:
在这里插入图片描述
由此可见参数量缩小巨大。具体计算公式为:

全FC = n × w × h × 2014 + 2014 × 1000

GAP = n × 1000

具体pytorch代码实现(仅为实现GAP)

由于pytorch中并没有GAP封装好的API,所以我们需要借用其他API来实现GAP:

In [1]: import torch

In [2]: a = torch.rand([4,3,4,4])

In [3]: a.size()
Out[3]: torch.Size([4, 3, 4, 4])

In [4]: b = torch.nn.functional.adaptive_avg_pool2d(a, (1,1))  # 自适应池化,指定池化输出尺寸为 1 * 1

In [5]: b.size()
Out[5]: torch.Size([4, 3, 1, 1])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

实际模型参数量对比

未使用GAP:

orch.Size([2, 400, 190])
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 384, 160]           1,216
         MaxPool2d-2          [-1, 64, 192, 80]               0
            Conv2d-3         [-1, 128, 192, 80]          73,856
         MaxPool2d-4          [-1, 128, 96, 40]               0
            Conv2d-5          [-1, 256, 96, 40]         295,168
            Conv2d-6          [-1, 256, 96, 40]         590,080
         MaxPool2d-7          [-1, 256, 48, 20]               0
            Conv2d-8          [-1, 512, 48, 20]       1,180,160
            Conv2d-9          [-1, 512, 48, 20]       2,359,808
        MaxPool2d-10          [-1, 512, 24, 10]               0
           Conv2d-11          [-1, 512, 24, 10]       2,359,808
           Conv2d-12          [-1, 512, 24, 10]       2,359,808
        MaxPool2d-13           [-1, 512, 12, 5]               0
        Dropout2d-14           [-1, 512, 12, 5]               0
           Linear-15                [-1, 19000]     583,699,000
           Linear-16                [-1, 19000]     361,019,000
           Conv2d-17          [-1, 64, 200, 95]             640
           Conv2d-18          [-1, 64, 200, 95]          36,928
             ReLU-19          [-1, 64, 200, 95]               0
           Conv2d-20          [-1, 64, 200, 95]          36,928
================================================================
Total params: 954,714,609
Trainable params: 954,714,609
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.47
Forward/backward pass size (MB): 474.42
Params size (MB): 3641.95
Estimated Total Size (MB): 4116.84
----------------------------------------------------------------
  • 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
  • 30
  • 31
  • 32
  • 33
  • 34

使用GAP层:

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 384, 160]           1,216
         MaxPool2d-2          [-1, 64, 192, 80]               0
            Conv2d-3         [-1, 128, 192, 80]          73,856
         MaxPool2d-4          [-1, 128, 96, 40]               0
            Conv2d-5          [-1, 256, 96, 40]         295,168
            Conv2d-6          [-1, 256, 96, 40]         590,080
         MaxPool2d-7          [-1, 256, 48, 20]               0
            Conv2d-8          [-1, 512, 48, 20]       1,180,160
            Conv2d-9          [-1, 512, 48, 20]       2,359,808
        MaxPool2d-10          [-1, 512, 24, 10]               0
           Conv2d-11          [-1, 512, 24, 10]       2,359,808
           Conv2d-12          [-1, 512, 24, 10]       2,359,808
        MaxPool2d-13           [-1, 512, 12, 5]               0
        Dropout2d-14           [-1, 512, 12, 5]               0
AdaptiveAvgPool2d-15            [-1, 512, 1, 1]               0
           Linear-16                [-1, 19000]       9,747,000
           Conv2d-17          [-1, 64, 200, 95]             640
           Conv2d-18          [-1, 64, 200, 95]          36,928
             ReLU-19          [-1, 64, 200, 95]               0
           Conv2d-20          [-1, 64, 200, 95]          36,928
    ResidualBlock-21          [-1, 64, 200, 95]               0
================================================================
Total params: 19,743,609
Trainable params: 19,743,609
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.47
Forward/backward pass size (MB): 474.28
Params size (MB): 75.32
Estimated Total Size (MB): 550.07
----------------------------------------------------------------
  • 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
  • 30
  • 31
  • 32
  • 33
  • 34

差距主要在liner层也就是全连接层,可以看出使用GAP的情况下我的模型参数缩小有百倍,从原来的九亿多参量直接缩小为九百多万。而总的参数量缩小大概是九十倍。参量缩小很可观,很适合显存不够的同时需要跑比较大的模型的用户。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/92450
推荐阅读
  

闽ICP备14008679号