关于 global average pooling

本文探讨了GolbalAveragePooling(GAP)与全连接(FC)层在卷积神经网络(CNN)中的作用与差异。GAP首次出现在NetworkinNetwork论文中,实验证明能提升CNN效果,通过将平均池化窗口大小设为featuremap尺寸,实现参数减少并防止过拟合。同时,对比了FC层在CNN分类中的传统角色及其可能导致的过拟合问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Golbal Average Pooling 第一次出现在论文Network in Network中,后来又很多工作延续使用了GAP,实验证明:Global Average Pooling确实可以提高CNN效果。


Fully Connected layer
很长一段时间以来,全连接网络一直是CNN分类网络的标配结构。一般在全连接后会有激活函数来做分类,假设这个激活函数是一个多分类softmax,那么全连接网络的作用就是将最后一层卷积得到的feature map stretch成向量,对这个向量做乘法,最终降低其维度,然后输入到softmax层中得到对应的每个类别的得分。

全连接层如此的重要,以至于全连接层过多的参数重要到会造成过拟合,所以也会有一些方法专门用来解决过拟合,比如dropout。

Golbal Average Pooling

global average pooling 与 average pooling 的差别就在 "global" 这一个字眼上。global 与 local 在字面上都是用来形容 pooling 窗口区域的。 local 是取 feature map 的一个子区域求平均值,然后滑动这个子区域; global 显然就是对整个 feature map 求平均值了。

因此,global average pooling 的最后输出结果仍然是 10 个 feature map,而不是一个,只不过每个 feature map 只剩下一个像素罢了。这个像素就是求得的平均值。
官方 prototxt 文件 里写了。网络进行到最后一个 average pooling 层的时候,feature map 就剩下了 10 个,每个大小是 8 * 8。顺其自然地作者就把 pooling 窗口设成了 8 个像素,意会为 global average pooling 。可见,global average pooling 就是窗口放大到整个 feature map 的 average pooling 。

每个讲到全局池化的都会说GAP就是把avg pooling的窗口大小设置成feature map的大小,这虽然是正确的,但这并不是GAP内涵的全部。GAP的意义是对整个网络从结构上做正则化防止过拟合。既要参数少避免全连接带来的过拟合风险,又要能达到全连接一样的转换功能,怎么做呢?直接从feature map的通道上下手,如果我们最终有1000类,那么最后一层卷积输出的feature map就只有1000个channel,然后对这个feature map应用全局池化,输出长度为1000的向量,这就相当于剔除了全连接层黑箱子操作的特征,直接赋予了每个channel实际的类别意义。
--------------------- 
作者:默一鸣 
来源:优快云 
原文:https://blog.youkuaiyun.com/yimingsilence/article/details/79227668 
版权声明:本文为博主原创文章,转载请附上博文链接!

### GlobalAveragePooling2D 和 MaxPooling2D 的区别 在神经网络中,池化层用于减少特征图的空间尺寸并控制过拟合。两种常见的池化方法分别是全局平均池化(`GlobalAveragePooling2D`)和最大池化(`MaxPooling2D`)。这两种方法的主要差异在于它们如何聚合输入张量的信息。 #### 全局平均池化 `GlobalAveragePooling2D` 全局平均池化通过计算整个特征图上的每个通道的均值来进行降维操作。这会使得输出维度仅依赖于输入张量的通道数而不再受其高度宽度的影响。对于形状为 `(batch_size, height, width, channels)` 的输入张量来说,经过此层后的输出将是 `(batch_size, channels)` 形状的数据[^1]。 ```python from tensorflow.keras.layers import Input, Conv2D, GlobalAveragePooling2D input_layer = Input(shape=(None, None, 3)) conv_layer = Conv2D(filters=64, kernel_size=(3, 3), padding='same')(input_layer) gap_output = GlobalAveragePooling2D()(conv_layer) print(gap_output.shape) # 输出: (?, 64),其中 ? 表示 batch size ``` #### 最大池化 `MaxPooling2D` 相比之下,最大池化则是在指定窗口内选取最大值作为该区域的新表示形式。通常情况下,还会伴随步幅参数来决定滑动窗口移动的距离。这种方式保留了局部最显著特征的同时降低了空间分辨率[^2]。 ```python from tensorflow.keras.layers import MaxPooling2D mp_output = MaxPooling2D(pool_size=(2, 2))(conv_layer) print(mp_output.shape) # 假设原始大小为 (H,W,C),那么这里将会变成大约 (H//2, W//2, C) ``` #### 使用场景对比 - **当希望获得更抽象级别的信息时**,可以选择使用 `GlobalAveragePooling2D` 层代替全连接层,因为这样不仅可以防止过拟合还能提高模型泛化能力。 - 如果目的是提取图像中最突出的部分,则更适合采用 `MaxPooling2D` 来实现这一点;它有助于捕捉边缘和其他重要视觉特性,在某些应用领域表现更好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值