论文原味: Global Second-order Pooling Convolutional Networks_2018 代码地址: GSop-Net codes

事实上对文中所说的:

To better characterize complex boundaries of thousands of classes in a very high dimensional space, one possible solution is to learn higher order representations for enhancing nonlinear modeling capability of ConvNets

不懂……他们看待深度学习的方式和自己可能存在比较大的差异,所以我们在掌握技术的时候也需要了解别人是如何看待CNN的(当然,他们的看法可能是从某一特定角度而言,不同的角度往往产生不同的灵感)。
在本文之前,事实上GSoP主要用在网络的最后一层可以替代全局平均池化(GAVP)。值得一提的是,SE-Net和CBAM模块在引入注意力机制时,同样是采用的全局池化的方式产生权重(本文亦是受SE-Net启发)!
与SE-Block,CBAM-Module类似,GSop也是一个模块,能够运用于网络中间层。其架构如下图所示:
image.png

ablation study: An ablation study typically refers to removing some “feature” of the model or algorithm, and seeing how that affects performance. ImageNet benchmark: ImageNet 数据集上达到的性能基准。

GAvP (1st–order) In-between Network

事实上GAvP即是一个平均操作,平均操作是一个一阶的统计特征。

一阶统计特征,GSoP-Net_2018 - 图2

GSoP (2nd–order) at Network Net

GSop进行二阶统计,利用高阶统计特征。本文设计了两个GSop-Net,分别叫做GSop-Net1和GSop-Net2,GSop-Net1在中间插入GSoP模块,GSop-Net2在末尾插入GSop模块。GSoP和SE-Block一样由squeeze module and excitation module组成,GSop操作如上图b所示:
挤压阶段:

  • 首先,利用GSoP-Net_2018 - 图3进行维度压缩:GSoP-Net_2018 - 图4
  • 然后,计算两两通道相关性,产生GSoP-Net_2018 - 图5的协方差矩阵;
    • 协方差公式:GSoP-Net_2018 - 图6(图像数据如何求相关性?)
    • 协方差GSoP-Net_2018 - 图7行表示了GSoP-Net_2018 - 图8通道和其它通道的相关性;
    • 由于协方差矩阵计算时,平方操作将数据进行了一次升阶操作,我们关于行进行标准化;(没有搞明白)
    • 值得注意的是,协方差矩阵的计算,综合了不同通道的全局信息;

激活阶段:

  • 两次关于行的卷积操作;(如何卷积?)
    • 就是把整行一下操作,见下面图片;
    • 第一次利用Leaky Relu作为激活函数,第二次利用Sigmoid作为激活函数;
      • 第一次使用4个filter,产生GSoP-Net_2018 - 图9
      • 第二次采样GSoP-Net_2018 - 图10个filter;
      • conv操作可以参考下文resnet GSop引入的图片(不是代码);
  • 最后,将权重向量和原通道数据进行点乘,从而在通道的维度上进行权重赋值,实现注意力机制;

以上是channelwise GSoP!

与SE-Block相比,本文的权重获取更偏向于自动化,获取的方式通过学习得到(卷积操作的参数)。 值得注意的是,我们在引入模块的时候,往往还需要考虑计算量的问题,当然有可能权重的获取可以直接用全连接类似的操作,但是那样会产生较大的计算量。

position-wise GSoP

和channelwise GSoP很相似。步骤如下:

  • 首先,为了减少计算量,通过GSoP-Net_2018 - 图11卷积进行维度压缩为GSoP-Net_2018 - 图12,下采样为GSoP-Net_2018 - 图13
  • 计算协方差矩阵,最终产生的协方差矩阵size GSoP-Net_2018 - 图14
  • 然后进行row-wise convolution+LReLU and convolution+sigmoid操作;
  • 再进行合适的reshape,产生GSoP-Net_2018 - 图15权重矩阵;
  • 最后进行上采样,得到GSoP-Net_2018 - 图16的权重,最后基于元素乘法乘到原数据;

    Mechanism of GSoP Block

    image.png
    如上图所示,经典的卷积网络无法获取全局的信息,当然随着网络深度的加深,其感受野变大,但是其仍旧很难从全局上来把握信息(Non-local neural networks)(论文中说的是long-range dependency)
    下面代码是resnet中引入GSop模块,主要是GSop_mode == 2处代码(原项目中有对应的文件) ```python

    https://github.com/ZilinGao/Global-Second-order-Pooling-Convolutional-Networks/blob/master/torchvision/models/resnet.py

    init

    针对resnet引入GSop block

    if GSoP_mode == 1: self.avgpool = nn.AvgPool2d(14, stride=1) self.fc = nn.Linear(512 block.expansion, num_classes) print(“GSoP-Net1 generating…”) else : self.isqrt_dim = 256 self.layer_reduce = nn.Conv2d(512 block.expansion, self.isqrt_dim, kernel_size=1, stride=1, padding=0, bias=False) self.layer_reduce_bn = nn.BatchNorm2d(self.isqrt_dim) self.layer_reduce_relu = nn.ReLU(inplace=True) self.fc = nn.Linear(int(self.isqrt_dim * (self.isqrt_dim + 1) / 2), num_classes) print(“GSoP-Net2 generating…”)

forward

if self.GSoP_mode == 1: x = self.avgpool(x) else : x = self.layer_reduce(x) x = self.layer_reduce_bn(x) x = self.layer_reduce_relu(x)

  1. # 下面三个模块,代码很复杂的样子,不知道是否分别对应:协方差求取、row-wise conv、第二个conv
  2. x = MPNCOV.CovpoolLayer(x)
  3. x = MPNCOV.SqrtmLayer(x, 3)
  4. x = MPNCOV.TriuvecLayer(x)

``` image.png

总结

提高网络性能的一个方式:构造合理的捕获全局信息的方式。很多论文都有提到,全局信息的获取能够提高忘了性能。

深度学习其它问题:计算量大、数据集、可解释性;

注意力机制其实就是一种加权方式,注意力模块的目的就是希望通过对原数据的分析,在channel维度,position维度进行权重的获取。