简介
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模块是通用的,这意味着其可以嵌入到现有的网络架构中。
模型结构
特征U通过 squeeze 压缩操作,将跨空间维度H × W的特征映射进行聚合,生成一个通道描述符,HxWxC → 1x1xC ;将 全局空间信息 压缩到上述 通道描述符 中,使来这些 通道描述符 可以被 其输入的层 利用,这里采用的是 global average pooling实现
为了降低模型复杂度以及提升泛化能力,这里采用包含两个全连接层的bottleneck结构。其中第一个FC层起到降维的作用,降维系数为r是个超参数,然后采用ReLU激活;最后的FC层恢复原始的维度,将学习到的各个channel的激活值(sigmoid激活,值0~1)乘以U上的原始特征。
整个操作可以看成学习到了各个channel的权重系数,从而使得模型对各个channel的特征更有辨别能力,是一种attention机制
应用于 非残差网络 Inception network 当中,形成 SE-Inception module:
应用于 残差网络 Residual network 当中,形成 SE-ResNet module
:
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网络