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

基本原理

全局平均池化英文名为: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])

实际模型参数量对比

未使用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
----------------------------------------------------------------

使用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
----------------------------------------------------------------

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

  • 18
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
全连接层(Fully Connected Layer)是卷积神经网络(Convolutional Neural Network, CNN)中的一种常见的神经网络层,也被称为密集连接层(Dense Layer)或者全连接层。 在卷积神经网络中,前面的卷积层和池化层等层次的输出是一个三维张量,它们的维度通常被表示为(宽度,高度,通道数),也可以被称为特征图(Feature Map)。全连接层的输入是一个一维的向量,它将前面卷积层和池化层的输出“拉平”成一个向量。 全连接层的主要作用是将前面的卷积层和池化层的特征提取结果进行分类或者回归等任务。全连接层的输出通常是一个向量,其中每个元素对应着一个类别或者一个回归结果。在分类任务中,全连接层的输出经过一个softmax函数转化成概率值,表示每个类别的可能性。 全连接层的实现可以使用矩阵乘法运算,也可以使用矩阵乘法和偏置项(bias)的加法运算。假设前一层的输出为$X$,全连接层的权重矩阵为$W$,偏置项为$b$,则全连接层的计算可以表示为: $$Y = WX + b$$ 其中$Y$表示全连接层的输出,$X$表示前一层的输出,$W$表示全连接层的权重矩阵,$b$表示偏置项。$W$的大小为$(n, m)$,其中$n$表示输出的神经元个数,$m$表示输入的神经元个数。$b$的大小为$(n, 1)$,表示每个输出神经元的偏置项。 全连接层的训练过程和其他神经网络层类似,可以使用反向传播算法来计算梯度并更新权重。在反向传播算法中,全连接层的梯度计算可以使用矩阵乘法的性质进行优化,具体可以参考反向传播算法的相关文献。 需要注意的是,全连接层容易产生过拟合问题,因为它的参数数量很多。为了避免过拟合,可以使用正则化技术,例如L1正则化、L2正则化或者dropout等方法。此外,在一些任务中,可以使用全局平均池化层(Global Average Pooling)替代全连接层,可以有效减少参数数量和过拟合问题。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值