论文研读2018:卷积中的注意力和keras实现。CBAM: Convolutional Block Attention Module


论文原版下载

Abstract

提出了Convolutional Block Attention Module (CBAM),
轻量级,能嵌入任何CNN之间。
在通道和空间中增减了注意力机制。

模块在MS COCO,imagenet-1k,VOC2007目标检测数据集上测试,测试结果表明加上我们的模块有巨大的提升。

1 Introduction

深度,宽度,基数,注意力
影响CNN的三个重要因素:深度,宽度,基数(即更多的分支)。

基数增加影响模型效果如:Xception and ResNeXt。它们的经验表明,基数不仅节省了参数的总数,而且比其他两个因素:深度和宽度具有更强的表示能力。

除了前面的这些点,我们探究了注意力机制对卷积的影响。

参数量

参数量确实不太大,但我不知道为什么我自己直接套用的时候为什么会出现模型收敛慢的情况,建议大家多尝试。
下图是我在训练时加上的本论文提出来的模块。
在这里插入图片描述

2 Related Work

Residual Attention Network
与我们类似的工作是Residual Attention Network ,他用了编码器解码器的风格来构造注意力。通过细化特征映射,网络不仅性能良好,而且对噪声输入具有鲁棒性。
我们不直接对三维特征图做计算,而是分别分解学习信道注意和空间注意的过程。这种做法将减少参数计算量,并且我们的模块返回的维度与输入维度相同,这将能够使得其能够完成即插即用特点(感觉这是现在很多注意力机制都怎么做,即最低需求就是对输入维度的重分配权重)。

** Squeeze-and-Excitation**
介绍了一种紧凑的模块利用信道间的关系。
用全局平均池化特征去计算通道的注意力机制。
然而,我们发现这些都是次优特征,以推断精细的信道注意,我们建议也使用最大池特征。
我们的工作是不仅仅考虑了通道间的信息,还考虑了空间信息。【其实感觉也没什么大的创新的】

3 Convolutional Block Attention Module

spatial attention:
channel attention
在这里插入图片描述
在这里插入图片描述

Channel attention module

意义
顾名思义是关注各个通道的信息,通道注意力机制关注输入的图像“什么”是有意义的。
为了有效计算通用的注意力机制,会压缩输入的特征维度。

使用模块
**平均池化:**用于聚集空间信息,这在一些论文中被表面他能有效的学习空间信息。
**最大池化:**为了有更丰富的信息,我们还多使用了最大池化。
作者实验证明了这两种池化合用比单个使用更好。
如下图空间子模块利用类似的两个输出,它们沿着信道轴汇集并转发到卷积层
在这里插入图片描述

共享网络:由一个隐藏层组成。为了降低参数开销,隐藏层的激活函数设置为了C/r,r代表降低率。然后再将两个网络进行相加
在这里插入图片描述
注意W0和W1是共享输入的,它后面跟了一个relu。


图有个错误:dense_2没有接relu层,但我太懒得再修改图了,这个修改要重头画,其他注解地方都是正确的。
红圈起来的就是共享了权重的部分

代码

def channel_attention(input_feature, ratio=8):
    channel_axis = 1 if K.image_data_format() == "channels_first" else -1
    channel = input_feature._keras_shape[channel_axis]

#     折扣率,用来节省开销
    shared_layer_one = Dense(channel // ratio,
                             activation='relu',
                             kernel_initializer='he_normal',
                             use_bias=True,
                             bias_initializer='zeros')
    shared_layer_two = Dense(channel,
                             kernel_initializer='he_normal',
                             use_bias=True,
                             bias_initializer='zeros')

    avg_pool = GlobalAveragePooling2D()(input_feature)
    avg_pool = Reshape((1, 1, channel))(avg_pool)
    assert avg_pool._keras_shape[1:] == (1, 1, channel)
    avg_pool = shared_layer_one(avg_pool)
    assert avg_pool._keras_shape[1:] == (1, 1, channel // ratio)
    avg_pool = shared_layer_two(avg_pool)
    assert avg_pool._keras_shape[1:] == (1, 1, channel)

    max_pool = GlobalMaxPooling2D()(input_feature)
    max_pool = Reshape((1, 1, channel))(max_pool)
    assert max_pool._keras_shape[1:] == (1, 1, channel)
    max_pool = shared_layer_one(max_pool)
    assert max_pool._keras_shape[1:] == (1, 1, channel // ratio)
    max_pool = shared_layer_two(max_pool)
    assert max_pool._keras_shape[1:] == (1, 1, channel)

    cbam_feature = Add()([avg_pool, max_pool])
    cbam_feature = Activation('sigmoid')(cbam_feature)

    if K.image_data_format() == "channels_first":
        cbam_feature = Permute((3, 1, 2))(cbam_feature)

    return multiply([input_feature, cbam_feature])

Spatial attention module

做了什么
与通道注意力不同,空间注意力机制关注的是“哪里”,这是对通道注意力机制的补充。

在这里插入图片描述
模块
**卷积层:**模块的开头接了一个卷积层是为了生成一个注意力映射空间。
在这里插入图片描述
这与通道的不同最明显的就是映射的维度不同。
在这里插入图片描述

代码

def spatial_attention(input_feature):
    kernel_size = 7

    if K.image_data_format() == "channels_first":
        channel = input_feature._keras_shape[1]
        cbam_feature = Permute((2, 3, 1))(input_feature)
    else:
        channel = input_feature._keras_shape[-1]
        cbam_feature = input_feature

    avg_pool = Lambda(lambda x: K.mean(x, axis=3, keepdims=True))(cbam_feature)
    assert avg_pool._keras_shape[-1] == 1
    max_pool = Lambda(lambda x: K.max(x, axis=3, keepdims=True))(cbam_feature)
    assert max_pool._keras_shape[-1] == 1
    concat = Concatenate(axis=3)([avg_pool, max_pool])
    assert concat._keras_shape[-1] == 2
    cbam_feature = Conv2D(filters=1,
                          kernel_size=kernel_size,
                          strides=1,
                          padding='same',
                          activation='sigmoid',
                          kernel_initializer='he_normal',
                          use_bias=False)(concat)
    assert cbam_feature._keras_shape[-1] == 1

    if K.image_data_format() == "channels_first":
        cbam_feature = Permute((3, 1, 2))(cbam_feature)

    return multiply([input_feature, cbam_feature])

Arrangement of attention modules

我们发现,顺序排列比平行排列提供了更好的结果。
并且实验表明先关注通道再关注空间比顺序反过来效果会好一点。

4 Experiments

实验给出了CBAM嵌入resblock的图。

4.1 Ablation studies

实验部分,常规操作,所以我只贴截图了
在这里插入图片描述

Channel attention

实验目的
两个池联合使用有没有用?还是单个更有用?

实验设置
我们比较了信道注意的3个变量:平均池、最大池和两个池的联合使用
请注意,具有平均池的信道注意模块与se模块相同。 此外,当使用这两个池时,我们使用共享的MLP进行注意推理以保存参数,因为聚合的信道特征都位于相同的语义嵌入空间中。 **在本实验中,我们只使用通道注意模块,**并将 reduction ratio固定为16。

结果
下表表明联合使用的效果更好,联合使用最大池化的效果会好点儿。
在这里插入图片描述

Spatial attention

实验目的
信道池使用平均和最大池跨越信道轴和标准1×1的卷积,将信道维数减少到1。

实验结果
在这里插入图片描述

Arrangement of the channel and spatial attention

在这里插入图片描述

Final module design.

证明CBAM可以很好地推广到大规模数据集中的各种模型上。
在这里插入图片描述

We also find that the overall overhead of CBAM is quite small in terms of both
parameters and computation.
在这里插入图片描述

4.3 Network Visualization with Grad-CAM

为了证明它效果好,还用了可视化。
Grad-CAM是最近提出的一种利用梯度来计算卷积层空间位置重要性的可视化方法。
The softmax scores for a target class are also shown in the figure
在这里插入图片描述
p denotes the softmax score of each network for the ground-truth class.

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
### 回答1: CBAM卷积注意力模块的缩写,是一种用于交替堆叠到深度卷积神经网络(CNNs)的模块。它包含两个子模块:通道注意力模块和空间注意力模块。通道注意力模块用来对每个通道进行加权,确定哪些通道最重要。空间注意力模块在每个通道对所有空间位置进行加权,可以捕捉不同位置的重要性,从而更好地定位物体。 CBAM的优点在于,它能够提高CNNs的性能,减少了过度拟合的情况。CBAM结构的输入任意大小、任意通道数、任意深度,因此可以适用于各种计算机视觉任务,包括图像分类,物体检测和语义分割等。 总之,CBAM是一种具有高灵活性和高性能的卷积注意力模块,能够极大地增强CNNs的表达能力,提高计算机视觉任务的准确性。 ### 回答2: CBAMConvolutional Block Attention Module),是一种用于图像分类的Attention模块,它主要是用于增强卷积神经网络(CNN)的特征表达能力,使得CNN能够更好地区分不同种类的图像。 CBAM结构由两部分组成,分别是CBAM-Channel和CBAM-Spatial。在CBAM-Channel,它通过引入注意力机制,对每个通道的特征进行加权求和,并且使用全局平均池化操作,计算其重要性参数,进而对特征进行修正,从而提升模型的表达能力。CBAM-Spatial则通过空间注意力机制对图像的区域进行注意力分配权重,进一步优化模型的性能。 CBAM在图像分类方面的性能表现非常卓越。实验证明,在对比原始ResNet和ResNeXt网络,以及加入CBAM的ResNet和ResNext网络进行图像分类时,加入CBAM的ResNet和ResNeXt网络具有更强的表达能力和更高的分类准确性,同时,它在训练过程的收敛速度也有所提升。 总的来说,CBAM是一种非常有效的图像分类模块,利用注意力机制对CNN的特征进行增强,为图像分类任务提供了更好的性能表现。随着人工智能的迅速发展,CBAM在图像识别、物体检测等领域将具有广阔的应用前景。 ### 回答3: CBAM卷积注意力模块的缩写,它是一种用于图像分类和目标检测的神经网络模型。CBAM模块通过将通道和空间注意力机制组合在一起,从而有效地提高了模型的性能。 CBAM模块分为两个部分:通道注意力机制和空间注意力机制。通道注意力机制是针对图像特征的通道信息进行关注,它可以基于每个通道的特征图来计算权重,然后对于每个通道进行信息的调整和加权。这样,在网络的每个层次上都能更好地利用有用的通道信息,减少无用信息对网络性能的影响。 空间注意力机制是针对图像特征的空间信息进行关注。它能够自适应地计算每个像素点的权重,然后对于每个像素点进行信息的调整和加权。这样,网络的每个空间位置都能更好地利用有用的空间信息,提高目标检测和分类的准确率。 通过组合这两种注意力机制,CBAM模块能够区分有用和无用的特征,从而在图像分类和目标检测任务取得更好的性能。CBAM模块通常被用在深度卷积神经网络,例如ResNet以及MobileNet等,以提高整个网络的特征提取能力和分类性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北丐安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值