分别来用keras实现通道注意力模块和空间注意力模块。

#通道注意力机制
def channel_attention(input_feature, ratio=8):channel_axis = 1 if K.image_data_format() == "channels_first" else -1channel = 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)  # Reshape: width,height,depth#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])

通道注意力:将输入的featuremap,分别经过基于width和height的global max pooling 和global average pooling。

目的:保持通道数不变

"""
我们先分别进行一个通道维度的平均池化和最大池化得到两个 H×W×1 的通道描述,并将这两个描述按照通道拼接在一起;
然后,经过一个 7×7 的卷积层,激活函数为 Sigmoid,得到权重系数 Ms;
最后,拿权重系数和特征 F’ 相乘即可得到缩放后的新特征。
"""
def spatial_attention(input_feature):kernel_size = 7if 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_featureavg_pool = Lambda(lambda x: K.mean(x, axis=3, keepdims=True))(cbam_feature)  # 对张量求平均值,改变第三维坐标,并保持原本维度#assert avg_pool._keras_shape[-1] == 1max_pool = Lambda(lambda x: K.max(x, axis=3, keepdims=True))(cbam_feature)#assert max_pool._keras_shape[-1] == 1concat = Concatenate(axis=3)([avg_pool, max_pool])  # 拼接#assert concat._keras_shape[-1] == 2cbam_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] == 1if K.image_data_format() == "channels_first":cbam_feature = Permute((3, 1, 2))(cbam_feature)return multiply([input_feature, cbam_feature])

空间注意力:将输入的featuremap,做一个基于channel的global max pooling 和global average pooling。

目的:保持特征图大小不变

CBAM

将Channel attention模块输出的特征图作为Spatial attention模块的输入特征图

def cbam_block(cbam_feature, ratio=8):cbam_feature = channel_attention(cbam_feature, ratio)cbam_feature = spatial_attention(cbam_feature)return cbam_feature

到底如何做到“随插随用”

核心思想:需要理解输入的是特征图,输出的也是注意力权重与原图相乘后的特征图。

#简单举例:输入特征图,经过卷积,BN层,最后输出的是三者的和,并输入到下一层在相应的位置添加CBAM
inputs = x
residual = layers.Conv2D(filter, kernel_size = (1, 1), strides = strides, padding = 'same')(inputs)
residual = layers.BatchNormalization(axis = bn_axis)(residual)
cbam = cbam_block(residual)
x = layers.add([x, residual, cbam])

SE

from keras.layers import GlobalAveragePooling2D, Reshape, Dense, multiply
from keras import backend as Kdef se_block(input_feature, ratio=8):channel_axis = 1 if K.image_data_format() == "channels_first" else -1channel = input_feature._keras_shape[channel_axis]se_feature = GlobalAveragePooling2D()(input_feature)se_feature = Reshape((1, 1, channel))(se_feature)  # 第一步:压缩(Squeeze), reshape成1✖️1✖️C# assert se_feature._keras_shape[1:] == (1,1,channel)# 第二步:激励(Excitation),# 由两个全连接层组成,其中SERatio是一个缩放参数,这个参数的目的是为了减少通道个数从而降低计算量。# 第一个全连接层有(C/radio)个神经元,输入为1×1×C,输出1×1×(C/radio)。# 第二个全连接层有C个神经元,输入为1×1×(C/radio),输出为1×1×C。se_feature = Dense(channel // ratio,activation='relu',kernel_initializer='he_normal',use_bias=True,bias_initializer='zeros')(se_feature)#assert se_feature._keras_shape[1:] == (1, 1, channel // ratio)se_feature = Dense(channel,activation='sigmoid',kernel_initializer='he_normal',use_bias=True,bias_initializer='zeros')(se_feature)#assert se_feature._keras_shape[1:] == (1, 1, channel)"""# 因为keras默认为channels_last,没修改不需要加这段if K.image_data_format() == 'channels_first':se_feature = Permute((3, 1, 2))(se_feature)"""se_feature = multiply([input_feature, se_feature])return se_feature

ECA

import math
from keras.layers import *
from keras.layers import Activation
from keras.layers import GlobalAveragePooling2D
import keras.backend as K
import tensorflow as tf
def eca_block(input_feature, b=1, gamma=2, name=""):channel_axis = 1 if K.image_data_format() == "channels_first" else -1channel = input_feature.shape[channel_axis]kernel_size = int(abs((math.log(channel, 2) + b) / gamma))kernel_size = kernel_size if kernel_size % 2 else kernel_size + 1avg_pool = GlobalAveragePooling2D()(input_feature)x = Reshape((-1, 1))(avg_pool)x = Conv1D(1, kernel_size=kernel_size, padding="same", name="eca_layer_" + str(name), use_bias=False, )(x)x = Activation('sigmoid')(x)x = Reshape((1, 1, -1))(x)output = multiply([input_feature, x])return output

keras实现注意力机制相关推荐

  1. keras cnn注意力机制_TensorFlow、PyTorch、Keras:NLP框架哪家强

    全文共3412字,预计学习时长7分钟 在对TensorFlow.PyTorch和Keras做功能对比之前,先来了解一些它们各自的非竞争性柔性特点吧. 非竞争性特点 下文介绍了TensorFlow.Py ...

  2. keras cnn注意力机制_从发展历史视角解析Transformer:从全连接CNN到Transformer

    编译 | bluemin校对 | 陈彩娴Transformer架构在机器学习领域(尤其是NLP里)是一项热门研究,为我们带来了许多重要成果,比如:GPT-2.GPT-3等写稿机器人:第一代GPT及其性 ...

  3. keras cnn注意力机制_2019 SSA-CNN(自注意力机制)目标检测算法论文阅读笔记

    背景 <SSA-CNN Semantic Self-Attention CNN for Pedestrian Detection>是2019 的工作,其作者来自于南洋理工.这篇文章主要是做 ...

  4. tensorflow环境下的识别食物_在TensorFlow+Keras环境下使用RoI池化一步步实现注意力机制...

    在本文中,作者解释了感兴趣区域池化(RoI 池化)的基本概念和一般用法,以及如何使用它来实现注意力机制.他一步步给出了在 Keras 和 TensorFlow 环境下使用 RoI 池化的实现. 选自 ...

  5. 通道注意力机制keras_在TensorFlow+Keras环境下使用RoI池化一步步实现注意力机制

    项目地址:https://gist.github.com/Jsevillamol/0daac5a6001843942f91f2a3daea27a7 理解 RoI 池化 RoI 池化的概念由 Ross ...

  6. 浙大 | FcaNet:频域通道注意力机制(keras实现)

    FcaNet: Frequency Channel Attention Networks  paper:http://arxiv.org/abs/2012.11879 code:https://git ...

  7. WACV 2020 | ULSAM: 超轻量级子空间注意力机制(keras实现)

    ULSAM: Ultra-Lightweight Subspace Attention Module for Compact Convolutional Neural Networks paper:h ...

  8. 【深度学习】(8) CNN中的通道注意力机制(SEnet、ECAnet),附Tensorflow完整代码

    各位同学好,今天和大家分享一下attention注意力机制在CNN卷积神经网络中的应用,重点介绍三种注意力机制,及其代码复现. 在我之前的神经网络专栏的文章中也使用到过注意力机制,比如在MobileN ...

  9. 独家 | 感悟注意力机制

    作者:Greg Mehdiyev, Ray Hong, Jinghan Yu, Brendan Artley翻译:陈之炎校对:ZRX本文约2800字,建议阅读12分钟 本文由Simon Fraser大 ...

最新文章

  1. DrawText函数
  2. java e次方_java基础知识
  3. PHP中oop面向对象基础知识(一)
  4. linux硬件 软件raid,Linux下软件RAID的实现
  5. mysql 备库,高性能MySQL:主库、分发主库以及备库
  6. java流与文件——文本输入输出
  7. 电子书链接的集合 (不断更新)
  8. JavaScript垃圾回收
  9. 系统性能指标、压测、性能优化思路
  10. print('{:15}|{:^9}|{:^9}'.format('', 'lat.', 'long.'))是什么意思?
  11. 免费讲座 再出江湖!
  12. bootstrap-table重载_Bootstrap Table的使用总结
  13. 迭代扩展卡尔曼滤波IEKF
  14. 驱动篇 -- 继电器
  15. 超五类屏蔽双绞线和计算机电缆区别,超五类单屏网线和六类单屏蔽网线的区别是什么?...
  16. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!
  17. classes是什么意思怎么读_淦怎么读音 淦是什么意思
  18. 格雷码与二进制码的相互转换 (python代码实现)
  19. jython 导入java包_在jython中导入java类
  20. 【IBM MQ】AMQ6126问题解决思路

热门文章

  1. 单模光电转换器怎么接_光纤收发器怎么连接?光纤收发器安装图解大全!
  2. 【墨天轮专访第四期】华为云GaussDB:发挥生态优势,培养应用型DBA
  3. centos7安装mysql失败
  4. 蛇形矩阵之逆时针矩阵
  5. 【数据库】 如何对数据库进行操作
  6. coursera android,Coursera
  7. ellipsize属性
  8. java调用微信支付流程
  9. matlab绘制散点拟合图
  10. 有时用weblogic用户启动weblogic时会报错的原因以及解决办法