具有注意力能力的卷积神经网络“CBAM”

一、简介

注意力机制是人类视觉系统中的重要部分,人在识别物体时会自动的将注意力集中在所要识别的物体上。笔者个人认为这种注意力机制可以帮助人在识别物体时减少背景信息带来的影响,从而使人的识别能力更不易受其他干扰的影响,因此如果能使卷积神经网络也具有这种能力,就能在提高模型的识别能力的同时提高模型的鲁棒性。在本文中,作者通过同时利用特征图的通道信息及空间信息设计了一种具有注意力能力的卷积模块,使模型能够把“注意力”放在更有用的信息上,此外该模块可以应用各种卷积神经网络架构中,能够对各种计算机视觉任务带来一定的提升。

图1 CBAM示意图

二、网络设计

1、注意力卷积模块

文中提出的注意力模块主要包含两部分,第一部分为通道注意力图,它能够对通道进行选择,另一部分为空间注意力图,它能够选取图像空间中所需注意的区域,对于给定的特征图,经过经过卷积注意力模块后的输出如式1所示:

2、通道注意模块

在卷积神经网络中,通道信息一般代表着图像不同的特征信息,因此通过对通道进行选择可以使网络更能注意到图像中对任务有用的信息。为实现对通道的选择,本文利用式2,分别计算每张特征图的全局平均池化及全局最大池化信息,然后通过全连接层后相加来得到通道注意力参数,其中两者共用相同的全连接网络。如图2

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Keras卷积神经网络中加入CBAM注意力机制,需要按照以下步骤进行操作: 1. 导入必要的Keras库和模块,例如:Conv2D、Activation、Add、Lambda等。 2. 定义CBAM注意力机制的两个模块:通道注意力模块和空间注意力模块。 3. 将通道注意力模块和空间注意力模块组合成CBAM模块。 4. 在卷积神经网络的每个卷积层后添加CBAM模块。 下面是一个使用Keras实现CBAM注意力机制的示例代码: ```python from keras.layers import Conv2D, Activation, Add, Lambda 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) avg_pool = shared_layer_one(avg_pool) avg_pool = shared_layer_two(avg_pool) max_pool = GlobalMaxPooling2D()(input_feature) max_pool = Reshape((1,1,channel))(max_pool) max_pool = shared_layer_one(max_pool) max_pool = shared_layer_two(max_pool) 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]) 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) max_pool = Lambda(lambda x: K.max(x, axis=3, keepdims=True))(cbam_feature) concat = Concatenate(axis=3)([avg_pool, max_pool]) cbam_feature = Conv2D(filters = 1, kernel_size=kernel_size, strides=1, padding='same', activation='sigmoid', kernel_initializer='he_normal', use_bias=False)(concat) if K.image_data_format() == "channels_first": cbam_feature = Permute((3, 1, 2))(cbam_feature) return multiply([input_feature, cbam_feature]) def cbam_block(cbam_feature,ratio=8): # 定义CBAM模块 cbam_feature = channel_attention(cbam_feature,ratio) cbam_feature = spatial_attention(cbam_feature) return cbam_feature ``` 可以在需要添加CBAM注意力机制卷积层后添加CBAM模块,例如: ```python input_data = Input(shape=(224, 224, 3)) x = Conv2D(filters=64, kernel_size=(3, 3), strides=(1, 1), padding='same')(input_data) x = cbam_block(x) x = Activation('relu')(x) ``` 这样就可以在卷积神经网络中加入CBAM注意力机制

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值