注意力之channel 注意力机制Squeeze-and-Excitation Networks

Squeeze-and-Excitation Networks

发布时间:2017

基本思想

通过精确的建模卷积特征各个通道之间的作用关系来改善网络模型的表达能力。
作者提出了一种能够让网络模型对特征进行校准的机制,使网络从全局信息出发来选择性的放大有价值的特征通道并且抑制无用的特征通道
在这里插入图片描述

步骤

在这里插入图片描述

  1. 首先是 Squeeze 操作,我们顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。
    即用global average pooling将 b a t c h s i z e ∗ C ∗ H ∗ W batch size* C*H*W batchsizeCHW压缩成 b a t c h s i z e ∗ C ∗ 1 ∗ 1 batch size* C*1*1 batchsizeC11

  2. 其次是 Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性。
    即将 b a t c h s i z e ∗ C ∗ 1 ∗ 1 batch size* C*1*1 batchsizeC11向量输入到两个 Fully Connected 层组成的 Bottleneck 结构去建模通道间的相关性,并输出和输入特征同样数目的权重。我们首先将特征维度降低到输入的 1/16,然后经过 ReLu 激活后再通过一个 Fully Connected 层升回到原来的维度。这样做比直接用一个 Fully Connected 层的好处在于:
    1)具有更多的非线性,可以更好地拟合通道间复杂的相关性;
    2)极大地减少了参数量和计算量。
    然后通过一个 Sigmoid 的门获得 0~1 之间归一化的权重

  3. 最后是一个 Reweight 的操作,我们将 Excitation 的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。
    即对原feature map按通道加权

from torch import nn


class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SELayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        return x * y.expand_as(x)

参考文章

猜你喜欢

转载自blog.csdn.net/weixin_42764932/article/details/112227689
今日推荐