网络中加入注意力机制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模块也可以嵌入到现在几乎所有的网络结构中。

### MobileNet SE模块详解 #### SE模块的作用 SE (Squeeze-and-Excitation) 模块旨在增强网络对于不同通道特征的重要性建模能力。该机制允许神经网络自适应地调整各个通道上的特征响应,从而提高模型表达能力和准确性[^2]。 #### 结构组成 具体来说,SE模块由三部分构成: 1. **挤压(Squeeze)** 对输入张量执行全局平均池化操作,将空间维度压缩成单一数值表示。这一步骤可以看作是对每个通道的信息进行了汇总统计,得到一个描述整个感受野内激活情况的一维向量。 2. **激励(Excitation)** 使用两个全连接层构建瓶颈结构来学习各通道间的依赖关系,并通过ReLU和Sigmoid函数分别实现非线性和归一化处理。最终输出的是与原始输入相同数量级的权重系数。 3. **重标度(Reweighing/Scale)** 将上述计算所得的权值乘回到原输入张量对应位置处,完成对重要性较低或冗余特征抑制以及显著特征强化的过程。 ```python import torch.nn as nn class SEModule(nn.Module): def __init__(self, channels, reduction=4): super(SEModule, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channels, channels // reduction), nn.ReLU(inplace=True), nn.Linear(channels // reduction, channels), 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) ``` 在MobileNetV3的设计中,SE模块被嵌入到Bottleneck单元内部,在深度可分离卷积之后立即应用此组件,随后再接上逐点卷积继续后续运算流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值