【论文阅读】SENet和CBAM浅读(简介+代码)

最近阅读和自己研究方向比较相近的几篇论文时,其中均使用了SENet和CBAM中的模块,分别是Momenta与牛津大学的《Squeeze-and-Excitation Networks》和韩国科学技术院的《CBAM: Convolutional Block Attention Module》,这两篇工作的思路都比较清晰直观,并且后者是对前者的改进。这两项工作的核心都是一个“即插即用”的模块,因此笔者对两篇工作进行简单地总结和分析,尽可能在原论文的基础上加入自己的理解。

SENet

CNN中的卷积块提取特征时,融合了空间通道中的信息,是一种“局部感受野”。这篇工作中,作者更加关注不同通道之间的关系,因此设计了全新的网络块——Sequeeze-and-Excitation Block(压缩-激励块):将每个通道的信息压缩为一个数字,多个通道压缩后的数字输入全连接神经网络来显式建模通道之间的依赖关系,网络的输出作为激励与原始对应的通道相乘,从而激励网络关注更加重要的通道,本质是一种通道注意力。这个SE块的特点主要有:

  • 显式建模通道的依赖关系:将每个通道压缩、计算为一个数值,其数值直接反映该通道的重要程度;
  • 自适应校准通道响应:全连接神经网络中的参数可学习,因此通道响应可以不断更新;

作者在ILSVRC上进行实验,取得了当年的SOTA,在其他的任务上也实现了通过很小的额外计算成本带来显著的性能提升的效果。下面介绍一下SENet的核心结构——SE-block。

SE-Block

  • 特征图X首先经过卷积操作得到U;
  • 对U进行挤压squeeze操作,将每个通道的信息通过一个数值表示(也就是不同通道的权重),论文中使用全局平均池化实现;
  • 接着将C个通道的权重输入全连接神经网络,通过网络学习自适应调整权重,也就是让网络学习不同通道的贡献;关于全连接神经网络的设计放在下文讨论;
  • 得到的新的权重与U进行乘积计算(即对不同通道进行excitation),从而完成特征图通道维度的重标定;

从这个过程中看到SE-block作为“即插即用”的模块,可以灵活地添加到网络的不同阶段,并且在不同阶段的作用不同:前期特征图为低级特征,因此SE-Block学习更通用的特征;后期特征图为高级特征,因此SE-Block学习任务相关的特征,使得网络在分类决策时对关键通道更敏感。

作者在不同的任务和不同的模型上进行了实验,验证了SE-Block的有效性和灵活性。

细节1:学习通道权重的全连接神经网络

要求:

  • 可学习,捕获不同通道之间的非线性关系;
  • 非互斥关系:多个通道之间应该不是互斥关系,即防止出现one-hot使得其他通道的信息丢失;

因此作者设计了两层神经网络,输入和输出维度相同(为C),隐藏层维度为C/r(r是SE-Block中重要的超参数),sigmoid函数作为最终的激活函数。

s = s i g m o i d ( W 2 ∗ R e L U ( W 1 ∗ z ) ) s = sigmoid(W_{2} * ReLU(W_{1} * z)) s=sigmoid(W2ReLU(W1z))

代码实现

SE-Block的设计,实现还是比较简洁的。

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):
    	"""
		x: [B, C, W, H]
        	return: [B, C, W, H]
        	"""
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)     # [B, C, W, H] -> [B, C]
        y = self.fc(y).view(b, c
### SE (Squeeze-and-Excitation) CBAM (Convolutional Block Attention Module) 的原论文下载链接 #### 关于 SE (Squeeze-and-Excitation) 网络 SENet(Squeeze-and-Excitation Network)的概念首次被提出是在《Squeeze-and-Excitation Networks》这篇论文中,该论文由 Jie Hu, Li Shen, Samuel Albanie, Gang Sun, Enhua Wu 发表,并在 CVPR 2018 上获得了最佳论文奖。此方法通过引入通道间的依赖关系来增强模型的表现力[^2]。 SENet论文的下载链接如下: - **PDF 链接**: [https://arxiv.org/pdf/1709.01507.pdf](https://arxiv.org/pdf/1709.01507.pdf) #### 关于 CBAM (Convolutional Block Attention Module) CBAM 是一种卷积块注意模块,它结合了通道注意力空间注意力机制,能够显著提升 CNN 模型的效果。CBAM 被介绍在论文CBAM: Convolutional Block Attention Module》中,作者为 Sanghyun Woo, Jongchan Park, Joon Young Lee, In So Kweon。这项工作展示了如何高效地利用注意力机制改善视觉任务中的特征表示能力[^1]。 CBAM论文的下载链接如下: - **PDF 链接**: [https://arxiv.org/pdf/1807.06521.pdf](https://arxiv.org/pdf/1807.06521.pdf) --- ### 实现代码示例 以下是基于 PyTorch 的简单实现片段: ```python import torch 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) class CBAM(nn.Module): def __init__(self, gate_channels, reduction_ratio=16, pool_types=['avg', 'max']): super(CBAM, self).__init__() self.ChannelGate = ChannelGate(gate_channels, reduction_ratio, pool_types) selfSpatialGate = SpatialGate() def forward(self, x): x_out = self.ChannelGate(x) x_out = self.SpatialGate(x_out) return x_out def test_modules(): se_layer = SELayer(channel=64) cbam_module = CBAM(gate_channels=64) input_tensor = torch.randn((1, 64, 32, 32)) output_se = se_layer(input_tensor) output_cbam = cbam_module(input_tensor) print("Output Shape of SE Layer:", output_se.shape) print("Output Shape of CBAM Module:", output_cbam.shape) test_modules() ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值