计算机视觉注意力网络(四)——GSoP-Net [CVPR 2019]

Paper: Global Second-Order Pooling Convolutional Networks
Code:GitHub - ZilinGao/Global-Second-order-Pooling-Convolutional-Networks: Global Second-order Pooling Convolutional Networks (cvpr2019 GSoP)
计算机视觉注意力网络(四)——GSoP-Net [CVPR 2019]_第1张图片
给定一个输入张量,降维后,GSoP块先进行协方差矩阵计算,然后进行线性卷积和非线性激活的两个连续运算,得到输出张量,输出张量沿通道维数对原始输入进行缩放,一定程度上也是一种通道注意力的体现,但与SEnet不同的是该模块提出了2维平均池化,通过协方差的形式体现了通道与通道之间的关系。
与SEnet中的一阶注意力机制最大的区别为这里统计了协方差矩阵,再进行pooling。

论文主要贡献有三方面

  1. 与现有的只能利用网络端二阶统计量的方法不同,最早将该模型引入到中间层,以便在深度卷积网早期利用整体图像信息的人。通过对整体张量之间的相关性建模,所提出的块可以捕获长期统计相关性[35],充分利用图像中的上下文信息。
  2. 设计了一个简单有效的GSoP块,模块化程度高,内存低,计算复杂度低。GSoP块能够沿着通道维度或位置维度捕获全局二阶统计信息,可以方便地插入到现有的网络架构中,在较小的开销下进一步提高其性能。
  3. 在ImageNet基准测试上,我们对所提出的网络进行了深入的烧蚀研究,分析了所提出的GSoP块的特性和行为。与其他竞争对手的广泛比较显示,我们的网络具有竞争力。

GAvP一阶间网络。
在网络[25]末端插入的全局平均池,它汇总了一阶统计信息(即作为图像表示,广泛应用于ResNet[11]、Inception[31]和DenseNet[17]等深卷积网络中。第一次,SE-Net[15]引入了GAvP中间网络,在早期阶段利用整体图像上下文,报告明显改善了其网络端对应。SE-Net由两个模块组成:压缩模块完成全局平均池化,然后卷积和非线性激活以捕获信道依赖性;激励模块缩放通道用于数据重校。CBAM[38]除了沿信道维度的GAvP外,还扩展了SE-Net的思想,将沿信道维度的GAvP与空间维度相结合,实现自关注。与只使用整体图像的一阶统计量(平均值)的SE-Net和CBAM相比,我们的GSoPNet利用了二阶统计量(相关性)网络具有更好的适用性。
GSoP(二阶)网络
在网络端插入、可端到端训练的全局二级池技术受到了极大的关注,其性能得到了显著提高[3,23,22]。一些研究人员[7,3,1]已经证明了高阶池与内核机之间的密切联系,他们基于此提出了显式映射函数作为协方差表示紧性的核逼近。Wang等人[34]提出了一种全局高斯分布嵌入网络(G2DeNet),其中在网络端插入一个多元高斯,识别为协方差矩阵和均值向量[21]的对称正定矩阵。莫奈[39]提出了一个子矩阵方根层,使G2DeNet具有紧凑的表示。在[4]中,一阶信息与二阶信息相结合,在纹理识别方面取得了比标准双线性网络一致的改进。在上述工作中,二阶建模只在深度网络的末端进行了开发。

在这里插入图片描述

如上图所示,通过GSop模块的不同位置,作者提供了两个模型称为GSopNet1和GSopNet2。GSopNet2中还涉及到修改和推进(平方根和带参数)涉及到一些统计和线代上的知识。
我们在图1a中演示了提议的GSoP-Net。注意,我们设计的二级池块可以方便地插入到任何卷积层之后。通过在中间层中引入该块,可以在早期对整体图像进行高阶统计建模,增强了深卷积网的非线性建模能力。在实践中,我们构建了两个网络架构。通过GSoP块在网络之间和网络末端,我们也可以使用GSoP块,然后是公共的全局平均池,产生的平均向量作为紧凑的图像表示,我们称之为GSoPNet1。在网络末端,我们也可以采用矩阵功率归一化协方差矩阵来表示图像[23],
计算机视觉注意力网络(四)——GSoP-Net [CVPR 2019]_第2张图片

GSoP-Net的实现代码如下:

# https://github.com/ZilinGao/Global-Second-order-Pooling-Convolutional-Networks/blob/master/torchvision/models/resnet.py
# init
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)

    x = MPNCOV.CovpoolLayer(x)
    x = MPNCOV.SqrtmLayer(x, 3)
    x = MPNCOV.TriuvecLayer(x)

你可能感兴趣的:(注意力机制,注意力机制)