【模型解读】pooling去哪儿了?

文章首发于微信公众号《与有三学AI》

【模型解读】pooling去哪儿了?

这是深度学习模型解读第5篇,本篇我们将介绍深度学习模型中的pooling。

作者&编辑 | 言有三

 

01 概述

相信大家都记得,LeNet5,AlexNet,Vgg系列的核心思想,是convolution+pooling的核心结构。

 

但是,不知道从何时开始,pooling没了,对,就是没了。这是mobilenet【1】可视化后的部分结构图,懒得去画block图了。

 

如今大部分情况下,pooling就出现在网络的最后,或者一些需要concat/add不同通道的block里面,为何?本文从3个方面来说说。

 

02 pooling是什么

pooling,小名池化。

 

上图就是一个池化的示意图,用了一个10*10的卷积核,对20*20的图像分块不重叠的进行了池化,池化之后featuremap为2*2的大小。

pooling有什么用呢?或者说为什么需要pooling呢?

原因有几个:

(1) 增大感受野

所谓感受野,即一个像素对应回原图的区域大小,假如没有pooling,一个3*3,步长为1的卷积,那么输出的一个像素的感受野就是3*3的区域,再加一个stride=1的3*3卷积,则感受野为5*5,我们看左上角像素的传播就明白了。

 

依次,再多一个卷积,则为7*7,如果想看到224*224的全图,大家可以算算需要多少卷积层。

假如我们在每一个卷积中间加上3*3的pooling呢?很明显感受野迅速增大,这就是pooling的一大用处。感受野的增加对于模型的能力的提升是必要的,正所谓“一叶障目则不见泰山也”。

(2) 平移不变性

我们希望目标的些许位置的移动,能得到相同的结果。因为pooling不断地抽象了区域的特征而不关心位置,所以pooling一定程度上增加了平移不变性。

(3) 容易优化,pooling是每个featuremap单独做降采样,与基于卷积的降采样相比,不需要参数,更容易优化。

 

03 如何去除pooling

那pooling是必要的吗?答案已经很明了了,不需要。文【2】做了详细的实验,在cifar,imagenet等多个数据集上实验结果表明,完全没有必要。因为我们可以用步长大于1的卷积来替代。

当步长不为1时,降采样的速度将变快。

当stride,也就是步长等于2,上面的5*5一次卷积后就为2*2了。这其实还减轻了重叠的卷积操作,通过卷积来学习了降采样,看起来好处还是不少的。

实验结果也佐证了这一点。

 

 

上面就是作者的实验结果,all-cnn-c相比convpool-cnn-c,就是在同等卷积层的基础上,去掉了pooling,结果B和C系列模型效果都是提升的,关于A,B,C系列具体细节大家可以参考文章。

总之,不管是文献的研究结果,以及大家的实际使用经验,都已经完全使用带步长的卷积替换掉了pooling这一降采用的操作。

 

04pooling没用了吗?

答案是有,因为pooling相对于带步长的卷积操作,毕竟减少了计算量,所以对于很多需要concat/add featuremap通道的小模型,pooling仍然可以以小搏大。比如下面的shufflenet的block。

 

不过总的来说,pooling,走好。

 

参考文献

【1】Howard A G, Zhu M, Chen B, et al. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications[J]. 2017.

【2】Springenberg J T, Dosovitskiy A, Brox T, et al. Striving for Simplicity: The All Convolutional Net[J]. Eprint Arxiv, 2014.

【3】Zhang X, Zhou X, Lin M, et al. ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices[J]. 2017.

 

同时,在我的知乎专栏也会开始同步更新这个模块,欢迎来交流

https://zhuanlan.zhihu.com/c_151876233

注:部分图片来自网络

—END—

转载请留言,侵权必究

本系列的完整目录:

【模型解读】从LeNet到VGG,看卷积+池化串联的网络结构

【模型解读】network in network中的1*1卷积,你懂了吗

【模型解读】GoogLeNet中的inception结构,你看懂了吗

【模型解读】说说移动端基准模型MobileNets

【模型解读】pooling去哪儿了?

【模型解读】resnet中的残差连接,你确定真的看懂了?

【模型解读】“不正经”的卷积神经网络

【模型解读】“全连接”的卷积网络,有什么好?

【模型解读】从“局部连接”回到“全连接”的神经网络

【模型解读】深度学习网络只能有一个输入吗

【模型解读】从2D卷积到3D卷积,都有什么不一样

【模型解读】浅析RNN到LSTM

感谢各位看官的耐心阅读,不足之处希望多多指教。后续内容将会不定期奉上,欢迎大家关注有三公众号 有三AI

 

 

### RoI Pooling 的概念 RoI Pooling 是一种用于计算机视觉领域目标检测任务的技术,旨在解决不同尺寸区域映射到固定大小特征向量的问题。在深度学习框架中,尤其是基于区域的目标检测模型(如 Faster R-CNN),输入图像被划分为多个感兴趣区域 (Region of Interest, RoI),这些区域可能具有不同的形状和比例。然而,后续的全连接层通常需要固定的输入维度,因此引入了 RoI Pooling 技术来统一输出大小。 具体来说,RoI Pooling 将任意大小的输入区域转换为固定大小的空间表示。这一过程通过将每个 RoI 划分成相同数量的小块并执行最大池化操作完成。例如,在给定的一个 RoI 中,将其分割成 \( H \times W \) 个小格子,并对每个小格子应用 max-pooling 操作以提取最具代表性的特征[^2]。 以下是 RoI Pooling 的核心计算逻辑: #### 输入参数 - **input**: 特征图张量,通常是卷积神经网络的最后一层输出。 - **rois**: 表示感兴趣区域的一组坐标集合,形式为 [batch_index, x1, y1, x2, y2]。 - **pooled_height 和 pooled_width**: 输出空间的高度和宽度。 #### 实现细节 假设我们有一个 RoI 定义如下: \[ \text{roi} = [\text{batch\_index}, x_1, y_1, x_2, y_2], \] 其中 \( (x_1, y_1) \) 和 \( (x_2, y_2) \) 分别是该区域左上角和右下角的坐标,则可以按照以下方式划分网格并进行池化处理[^4]: ```python import numpy as np def roi_pooling(input_data, rois, output_size=(7, 7)): """ Simulate the basic idea behind RoI Pooling. :param input_data: Feature map tensor from CNN layers. :param rois: List of regions of interest with format [batch_index, x1, y1, x2, y2]. :param output_size: Desired height and width after pooling operation. :return: Pooled feature maps corresponding to each ROI. """ pooled_features = [] for roi in rois: batch_idx, x_start, y_start, x_end, y_end = list(map(int, roi)) region = input_data[batch_idx, y_start:y_end, x_start:x_end] h_ratio = float(region.shape[0]) / output_size[0] w_ratio = float(region.shape[1]) / output_size[1] pooled_region = np.zeros(output_size) for i in range(output_size[0]): start_h = int(np.floor(i * h_ratio)) end_h = int(np.ceil((i + 1) * h_ratio)) for j in range(output_size[1]): start_w = int(np.floor(j * w_ratio)) end_w = int(np.ceil((j + 1) * w_ratio)) subregion = region[start_h:end_h, start_w:end_w] pooled_region[i][j] = np.max(subregion) pooled_features.append(pooled_region.flatten()) return np.array(pooled_features) ``` 上述代码展示了如何手动模拟 RoI Pooling 过程中的分块与最大池化步骤。对于每一个 RoI,它会依据指定的比例因子重新调整其内部结构,并最终返回标准化后的特征表达[^3]。 ### 总结 RoI Pooling 提供了一种有效的方法使得无论原始候选框有多大或多宽广,都能转化为一致的形式送入下游分类器或回归模块进一步分析。这种方法极大地简化了传统滑动窗口方法所带来的复杂度问题,同时也提高了整体系统的运行效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值