网络中加入注意力机制SE模块

        SENet是由自动驾驶公司Momenta在2017年公布的一种全新的图像识别结构,它通过对特征通道间的相关性进行建模,把重要的特征进行强化来提升准确率。SENet 是2017 ILSVR竞赛的冠军。

论文:Squeeze-and-Excitation Networks

SE block的基本结构 

  1. 给定一个输入 ,其特征通道数为C ,通过一系列卷积等一般变换后得到一个特征通道数为C的特征。
  2. Squeeze:顺着空间维度进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。
  3. Excitation:基于特征通道间的相关性,每个特征通道生成一个权重,用来代表特征通道的重要程度。
  4. Reweight:将Excitation输出的权重看做每个特征通道的重要性,然后通过乘法逐通道加权到之前的特征上,完成在通道维度上的对原始特征的重标定。

代码:

import torch
import torch.nn as nn
import math
from torchvision import models
class se_block(nn.Module):
    def __init__(self, channel, ratio=16):
        super(se_block, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
                nn.Linear(channel, channel // ratio, bias=False),
                nn.ReLU(inplace=True),
                nn.Linear(channel // ratio, 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

class Mobilenet_v2(nn.Module):
    def __init__(self):
        super(Mobilenet_v2, self).__init__()
        model = models.mobilenet_v2(pretrained=True)
        # Remove linear and pool layers (since we're not doing classification)
        modules = list(model.children())[:-1]
        self.resnet = nn.Sequential(*modules)
        self.pool = nn.AvgPool2d(kernel_size=7)
        self.fc = nn.Linear(1280, 16)
        self.sigmoid = nn.Sigmoid()
        self.softmax = nn.Softmax(dim=-1)
        self.attention = se_block(1280) # 1280 为上层输出通道

    def forward(self, images):
        x = self.resnet(images)  # [N, 1280, 1, 1]
        x=self.attention(x)  # 此处加入se—block
        x = self.pool(x)
        x = x.view(-1, 1280)  # [N, 1280]
        x = self.fc(x)
        return x


if __name__=="__main__":
    input = torch.rand(2, 3, 224, 224)
    mode = Mobilenet_v2()
    out = mode(input)
    print(out.size())

小结: 

        1、SE网络可以通过堆叠SE模块得到。

        2、SE模块也可以嵌入到现在几乎所有的网络结构中。

### SE模块的优势与特点 SE模块的核心在于其引入了一种轻量级的通道注意力机制,能够显著提升卷积神经网络(CNN)模型的表现力。以下是SE模块的主要优点和特点: #### 1. 动态特征选择能力 SE模块通过学习不同通道的重要性权重,使网络具备动态调整各通道贡献的能力[^1]。这种特性使得模型可以更专注于对当前任务更重要的特征。 #### 2. 参数数量增加有限 尽管SE模块增强了模型性能,但它仅需少量额外参数即可实现上述功能。具体来说,假设输入特征图有 \( C \) 个通道,则SE模块新增加的参数仅为约 \( 2C/r \),其中 \( r \) 是可调节的压缩比[^1]。 #### 3. 易于集成至现有架构 由于设计简洁明了,SE模块非常容易嵌入到现有的各种主流深度学习框架之中,无论是ResNet还是Inception系列均能无缝衔接并取得一致性的改进效果[^1]。 #### 4. 广泛适用性 除了图像分类之外,在目标检测、语义分割等多个视觉领域均有成功案例表明采用SE结构有助于提高最终精度得分[^1]。 --- ### 使用场景分析 基于以上提到的特点,下面列举了一些适合运用该技术的实际应用场景: - **图像分类**:这是最基础也是最常见的应用之一,通过对全局信息建模来增强判别能力。 - **目标检测**:在两阶段方法如Faster R-CNN或者单阶段方式SSD/YOLOvX里加入SE组件可以帮助更好地捕捉前景物体及其背景之间的关系差异从而改善定位准确性以及类别预测质量。 - **视频理解**:当处理包含时间序列变化的数据集时(比如动作识别),可以通过扩展标准版成为三维版本即SE-3D形式进一步考虑时空关联因素的影响. - **医学影像诊断**:利用高分辨率CT扫描图片进行病灶区域自动标注过程中也发现融入此类注意力建构后确实有利于突出病变部位进而辅助医生做出更加精准判断结论。 ```python import torch.nn as 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) ``` 此代码片段展示了如何定义一个基本型别的Squeeze-and-Excitation层用于PyTorch环境下的项目开发工作流程当中去实际操作执行起来相对简便快捷很多哦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值