SE:通道注意力模块【附Pytorch实现】

论文地址:https://arxiv.org/pdf/1709.01507.pdf

1、动机

CNN中的核心操作就是卷积,早期大多研究都在探索如何增强空间编码能力,以提升CNN的性能。这篇文章探索了通道上的注意力,明确地建模通道间的依赖关系,并提出了一个新颖的模块,称为SE-block。

2、方法

SE的架构如上图所示,简单描述为:

  • 对于一个输入X,其经过卷积之后得到一个feature map(U),对于该feature map即可接上一个SE块,来附加上通道注意力;
  • 对于U,先将其每个通道的空间信息压缩到一个单值,也即从H*W*C大小的U得到了1*1*C大小的向量;
  • 然后,对该向量应用一组FC层进行权重调整,得到一个1*1*C的通道注意力向量;
  • 最后,将通道注意力向量加权到U,形成一个加权后的feature map。

可以看出,SE的原理还是非常简单,总的来说,SE就是对每个通道上的权重进行了显式建模,然后再对原feature map加权,使其每个通道具有不同的重要程度,也即有了通道注意力机制。

3、Pytorch实现

下面给出SE模块的Pytorch实现,可以将下面的代码作为插件用于任意feature map之后,以增强其通道注意力。

import torch
from torch import nn


class SE_Block(nn.Module):
    def __init__(self, ch_in, reduction=16):
        super(SE_Block, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)  # 全局自适应池化
        self.fc = nn.Sequential(
            nn.Linear(ch_in, ch_in // reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(ch_in // reduction, ch_in, bias=False),
            nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c) # squeeze操作
        y = self.fc(y).view(b, c, 1, 1) # FC获取通道注意力权重,是具有全局信息的
        return x * y.expand_as(x) # 注意力作用每一个通道上

### SE通道注意力机制工作原理 SE (Squeeze-and-Excitation) 通道注意力机制通过引入一种新的网络结构来增强模型对于不同输入图像的关注度差异处理能力。具体来说,这种机制分为三个主要阶段: #### 挤压(Squeeze) 在这个过程中,全局平均池化被应用于特征图上的每一个通道,从而将每个二维特征图压缩成一个单一数值表示。这一步骤有效地捕捉到了整个空间维度的信息,并减少了计算复杂度。 ```python def squeeze_excite_block(input_tensor, ratio=16): filters = input_tensor.shape[-1] se_shape = (1, 1, filters) # Global average pooling across channels se = tf.keras.layers.GlobalAveragePooling2D()(input_tensor) ``` [^1] #### 激励(Excitation) 接着,在得到的一维向量基础上构建了一个小型全连接神经网络,用来建模各个通道间的关系并生成相应权重系数。这些权重反映了各通道的重要性程度,进而实现了自适应调整的目的。 ```python # Reshape into a tensor of shape `(batch_size, 1, 1, num_channels)` se = tf.keras.layers.Reshape(se_shape)(se) # Fully connected layer with ReLU activation function se = tf.keras.layers.Dense(filters // ratio, activation='relu', kernel_initializer='he_normal', use_bias=False)(se) # Another fully connected layer followed by sigmoid activation se = tf.keras.layers.Dense(filters, activation='sigmoid')(se) ``` #### Scale (Attention) 最后,将上述获得的权值乘回到原始特征映射上去,以此实现对重要性的重新分配。经过这一过程之后,那些更具代表性和区分力的特性将会得到加强,而无关紧要的部分则会被抑制下来。 ```python output_tensor = tf.keras.layers.Multiply()([input_tensor, se]) return output_tensor ``` ### 应用场景 SE模块可以广泛应用于各种计算机视觉任务当中,尤其是在需要提高分类准确性或者检测精度的情况下表现尤为突出。由于其能够动态地根据实际数据样本来调节内部参数设置,因此非常适合用于解决多变环境下的目标识别难题。此外,该方法还特别适用于资源受限设备上的高效部署,因为所增加的额外开销相对较小却能带来显著性能提升效果[^3]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AICVHub

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值