经典网络模型-SENet注意力机制

 简介

SENet是由 Momenta 和 牛津大学 的 胡杰等人 提出的一种新的网络结构,目标是通过显式的建模 卷积特征通道 之间的 相互依赖关系 来提高网络的表示能力。在2017年最后一届 ImageNet 比赛 classification 任务上获得 第一名。

SENet网络的创新点在于关注channel之间的关系,希望模型可以自动学习到不同channel特征的重要程度。为此,SENet提出了Squeeze-and-Excitation (SE)模块。

SE模块首先对卷积得到的特征图进行Squeeze操作,得到channel级的全局特征,然后对全局特征进行Excitation操作,学习各个channel间的关系,也得到不同channel的权重,最后乘以原来的特征图得到最终特征。本质上,SE模块是在channel维度上做attention或者gating操作,这种注意力机制让模型可以更加关注信息量最大的channel特征,而抑制那些不重要的channel特征。另外一点是SE模块是通用的,这意味着其可以嵌入到现有的网络架构中。

模型结构

Squeeze操作

特征U通过 squeeze 压缩操作,将跨空间维度H × W的特征映射进行聚合,生成一个通道描述符,HxWxC → 1x1xC ;将 全局空间信息 压缩到上述 通道描述符 中,使来这些 通道描述符 可以被 其输入的层 利用,这里采用的是 global average pooling实现

Excitation操作

为了降低模型复杂度以及提升泛化能力,这里采用包含两个全连接层的bottleneck结构。其中第一个FC层起到降维的作用,降维系数为r是个超参数,然后采用ReLU激活;最后的FC层恢复原始的维度,将学习到的各个channel的激活值(sigmoid激活,值0~1)乘以U上的原始特征。

整个操作可以看成学习到了各个channel的权重系数,从而使得模型对各个channel的特征更有辨别能力,是一种attention机制

应用于 非残差网络 Inception network 当中,形成 SE-Inception module:

应用于 残差网络 Residual network 当中,形成 SE-ResNet module

SE模块是一个即插即用的模块

SE模块实现代码

import torch.nn as nn

class SEModel(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SEModel, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(),
            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)

 参考链接:[ 注意力机制 ] 经典网络模型1——SENet 详解与复现_Horizon Max的博客-CSDN博客_senet网络

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值