构建CNN框架的主流block(一)——SE和CBAM

SENET是2017年的世界冠军,CBAM是2018年的分类冠军,它和SE一样也是一个模型,现在任何流行网络都可以嵌入这个模块。

博主只是简单的赘述一下这些模块的思想,写一个笔记,做一个 state-of-art 的搬运工, 如有错误请各位大佬指点批评!!!

SE
SE全称Squeeze-and-Excitation,它注重通道信息。
在这里插入图片描述
SE的出现是为了解决在卷积池化过程中feature map的不同通道所占的重要性不同带来的损失问题。在传统的卷积池化过程中,默认feature map的每个通道是同等重要的,而在实际的问题中,不同通道的重要性是有差异的,具体问题具体看待。
如上图所示,SE的结构较为清晰,具体的卷积池化过程如下图所示,下图是一个残差块中加入了SE模块的结构。
假设输入的是一个 h * w * c 的 feature map,首先对它进行一个 global average pooling ,由全局池化(池化大小为 h * w)的操作我们可以得到一个 1 * 1 * c 的 feature map ,然后就是两个全连接层,第一个全连接层的神经元个数为 c/16(作者给的参数),这就是一个降维的方法,第二个全连接层又升维到了 C 个神经元个数,这样做的好处是增加了更多的非线性处理过程,可以拟合通道之间复杂的相关性。然后再接一个sigmod层,得到 1 * 1 * c 的 feature mapÿ

### 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() ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值