Daily Paper 02 - SoftPool
Tilden Ji 菜鸟Lv3

今天看的这篇是一篇改进卷积 Pooling 的文章,今年 5 月末发布在 Arxiv 上。作者也提供了封装好的可以直接使用的模块,非常良心。

昨天失眠了,本来上午看了一会儿论文看不下去就去摸鱼了,下午的时间又都用来写实验室项目了… 但想着 Daily Paper 计划总不能第二天就放弃吧,还是晚上开会时抽点时间看一篇好了。

更新 1:上网冲浪发现知乎的大佬指出这篇论文的基线给得很低,而且几乎就是 Local Importance-based Pooling(ICCV 2019) 的一个特例,那明天就看看 LIP ~

更新 2:这个仓库 给了在 CIFATR 100 上几个不同 Pooling 方式得到的训练精度对比的代码和结果,其中包含本文的 SoftPool

「」

编写记录

  1. 2021-06-10 | 初稿
  2. 2021-06-11 | 补充了 AvgPool 的快速实现

基本思想

一句话来总结,本文的工作就是提出了一个叫做 SoftPool 的 Pooling 方法,并且作者试图证明这个方法能够更好的保留信息,直接带来的结果就是分类精度的提升。并且,这个 SoftPool 方法计算开销还不太大,也没有额外的可学习参数,真正的「即插即用」。

Pooling 在 CNN 中广泛被使用,作用是对 CNN 中间层的特征图进行降采样,下图总结了常见的 Pooling 方法:

简单总结如下(由自媒体 翻译的,我懒得翻译了):

下采样池化方法:

  • Average Pooling:区域平均值。
  • Max Pooling:区域最大值。
  • Stochastic Pooling:它使用一个核区域内激活的概率加权抽样。
  • Mix Pooling:基于最大池化和平均池化的混合池化。
  • Power average Pooling:基于平均和最大化的结合,幂平均 (Lp) 池化利用一个学习参数 p 来确定这两种方法的相对重要性;当 p=1 时,使用局部求和,而 p 为无穷大时,对应 max-pooling。

网格采样池化方法:

  • S3 Pooling:对原始 Feature Map 网格中的行和列进行随机采样。
  • Preserving Pooling:使用平均池化,同时用高于平均值的值增强激活。
  • Local Importance Pooling:进一步评估了如何将学习到的权值作为一种基于子网络注意的机制来使用,该机制可用于汇集信息特征,同时丢弃无信息特征。

另外还有一些严重依赖于具体任务的方法:如:Spatial Pyramid Pooling、ROI-Pool 和 ROI-align。

不同于上述方法,本文提出的 softpool 采用 softmax 加权的方式保留了每个激活,然后与 max-pooling 不同,softpool 是可微的,不带来可学习参数且不依赖具体任务。

方法

非常简单,首先利用 local region 中的所有激活值,计算权重:

然后对于该 local region,softpool 的输出就是加权和…

方法介绍结束。然后作者还画了一个漂亮的计算流图:

另外论文中有提到在工程上为了避免一个算数下溢做了一些手脚,这个之后看代码的时候再瞅瞅吧。(估计就是修改的 Pytorch 自带的 Pooling 方法吧)。

用 Pytorch 的 AvgPool 实现 SoftPool

重读论文时发现,经过一些数学变换,SoftPool 可以转换成两个 AvgPool 按位相除:

这意味着我们可以直接拿 Pytorch 中内置的 torch.nn.AvgPoolingND 来实现高可用的 SoftPool!!:

1
2
3
4
5
6
7
class SoftPooling2D(torch.nn.Module):
def __init__(self,kernel_size,strides=None,padding=0,ceil_mode = False,count_include_pad = True,divisor_override = None):
super(SoftPooling2D, self).__init__()
self.avgpool = torch.nn.AvgPool2d(kernel_size,strides,padding,ceil_mode,count_include_pad,divisor_override)
def forward(self, x):
x_exp = torch.exp(x)
return self.avgpool(x_exp*x)/self.avgpool(x_exp)

测试了下,速度还行,耗时大概是 AvgPooling 两倍多一丢丢:

实验

作者做了大量的实验,展示了其实验室雄厚的人力和算力,但我感觉都不是很有意义… 就不全贴了。

首先是针对高清图像的一个 可视化展示:

不得不说,红龙果这个图选的真棒!看起来似乎真的保留了更多信息…

图像分类结果(注意作者都只替换了紧邻输入层的 Pooling 或者再额外加上数个 Pooling,详见论文):

查了下,表中 ResNet50 的 top1 的 76.15 确实有点低,这个就是 ResNet 原始版本在 15 年汇报的精度吧…

替换数量消融实验:替换的数量越多,效果越好。

总结

  1. Max-Pool 确实可能存在信息丢失的问题,而这种每个激活都参与前向计算和反向传播的方式应该能够保留更多输入信息。但感觉常规的 RGB 图像输入本来就比较冗余?那么信息的丢失量也没有作者描绘的那么夸张吧。
  2. 不过我最近在做的一个工作正好输入比较紧凑,或许这个方法能够更好的利用输入?之后试试。

Reference

[1]A. Stergiou, R. Poppe, and G. Kalliatakis, “Refining activation downsampling with SoftPool,” arXiv:2101.00440 [cs], Mar. 2021, Accessed: Jun. 10, 2021. [Online]. Available: http://arxiv.org/abs/2101.00440
[4]Z. Gao, L. Wang, and G. Wu, “LIP: Local Importance-based Pooling,” arXiv:1908.04156 [cs], Aug. 2019, Accessed: Jun. 10, 2021. [Online]. Available
  • 本文标题:Daily Paper 02 - SoftPool
  • 本文作者:Tilden Ji
  • 创建时间:2021-06-10 18:38:11
  • 本文链接:https://itiandong.com/2021/daily-paper-02/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论