赞
踩
全局平均池化英文名为:global average pooling简称为GAP
其具体实现过程在原文 << Network In Network >> 中为:
可以看出其是将矩阵中的 [w,h] ,进行平均池化变为一个单元。也即进行Flattrn和FC。其详细原理的图形示例可参考下图:
其实也就是通过池化层将原有的输入为 [b,c,h,w] 减少成 [b,c,1,1] 的尺寸也即上文提到的将 [w,h] 进行平均池化变为一个单元。
在常见的卷积神经网络中,全连接层之前的卷积层负责对图像进行特征提取,在获取特征后,传统的方法是接上全连接层之后再进行激活分类,而GAP的思路是使用GAP来替代该全连接层(即使用池化层的方式来降维),更重要的一点是保留了前面各个卷积层和池化层提取到的空间信息\语义信息,所以在实际应用中效果提升也较为明显!,另外,GAP去除了对输入大小的限制!,而且在卷积可视化Grad-CAM中也有重要的应用.(来源于原文)
用一张图来进行形象的原理上的描述即为:
由原理介绍我们可以明白GAP主要还是进行池化来缩减参数量,但是假如你想在FC层得到一个特定大小的特征图这是GAP层所不能做到的(仅限于个人理解,如有错位还请指出)。而FC层又是如何实现能得到特定大小特征图输出的呢,下图可以解释:
可以看到FC层参数两巨大的原因就在于faltten的时候需要将每一个单元整形,那么我们如何利用GAP层来输出我们想要的特征图呢,具体如下图所示:
由此可见参数量缩小巨大。具体计算公式为:
全FC = n × w × h × 2014 + 2014 × 1000
GAP = n × 1000
由于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的情况下我的模型参数缩小有百倍,从原来的九亿多参量直接缩小为九百多万。而总的参数量缩小大概是九十倍。参量缩小很可观,很适合显存不够的同时需要跑比较大的模型的用户。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。