注意力机制学习 BAM
注意力机制学习-BAM
- 简介
- 思考
- 步骤
- 代码
- 实验
- 最后
简介
2018年BMVC,从通道和空间两方面去解释注意力机制,和CBAM为同一团队打造。论文连接:BAM
BAM:Bottleneck Attention Module,顾名思义,瓶颈注意力模块。将模块放在模型的瓶颈处。
思考
为什么要做混合注意力?
混合域注意力机制如何混合?
为什么?
因为不同的维度所代表的意义不同,所携带的信息不同。通道注意力机制主要是特征信息的表达(what),空间注意力更注重位置信息的表达(where)。
如何?
1、并联,特征图权重相加;
2、并联,特征图concat;
3、串联。
步骤
1、(通道上权重信息)输入特征图UUU经过全局平均池化编码成的一维特征向量,使得每个通道都具有全局感受野;然后,经过全连接层对一维特征向量进行降维操作,并使用Relu6激活函数进行非线性处理;然后在利用全连接层进行升维操作,最后经过批量归一化得到对应权重Mc(U)M_c(U)Mc(U)(11C)。计算公式如下:
2、(空间上权重信息)利用11卷积对输入特征图UUU进行降维操作;然后利用两个卷积核尺寸为33的空洞卷积提取特征信息,空洞卷积具有更大的感受野;最后,利用11卷积将特征图映射到1w*h,得到空间注意力映射Ms(U)M_s(U)Ms(U),其计算公式如下:
3、融合通道注意力与空间注意力:通过广播机制将Mc(U)M_c(U)Mc(U)和Ms(U)M_s(U)Ms(U)扩展到同一维度,然后权重相加,得到注意力向量M(U)M(U)M(U)。
4、重构特征图:输入特征图UUU与M(U)M(U)M(U)逐元素相乘,再通过残差结构与UUU相加。
整体结构图如下:
代码
代码粘贴自github。:BAM代码
地址:https://github.com/Jongchan/attention-module/blob/master/MODELS/bam.py
import torch
import math
import torch.nn as nn
import torch.nn.functional as Fclass Flatten(nn.Module):def forward(self, x):return x.view(x.size(0), -1)
class ChannelGate(nn.Module):def __init__(self, gate_channel, reduction_ratio=16, num_layers=1):super(ChannelGate, self).__init__()self.gate_activation = gate_activationself.gate_c = nn.Sequential()self.gate_c.add_module( 'flatten', Flatten() )gate_channels = [gate_channel]gate_channels += [gate_channel // reduction_ratio] * num_layersgate_channels += [gate_channel]for i in range( len(gate_channels) - 2 ):self.gate_c.add_module( 'gate_c_fc_%d'%i, nn.Linear(gate_channels[i], gate_channels[i+1]) )self.gate_c.add_module( 'gate_c_bn_%d'%(i+1), nn.BatchNorm1d(gate_channels[i+1]) )self.gate_c.add_module( 'gate_c_relu_%d'%(i+1), nn.ReLU() )self.gate_c.add_module( 'gate_c_fc_final', nn.Linear(gate_channels[-2], gate_channels[-1]) )def forward(self, in_tensor):avg_pool = F.avg_pool2d( in_tensor, in_tensor.size(2), stride=in_tensor.size(2) )return self.gate_c( avg_pool ).unsqueeze(2).unsqueeze(3).expand_as(in_tensor)class SpatialGate(nn.Module):def __init__(self, gate_channel, reduction_ratio=16, dilation_conv_num=2, dilation_val=4):super(SpatialGate, self).__init__()self.gate_s = nn.Sequential()self.gate_s.add_module( 'gate_s_conv_reduce0', nn.Conv2d(gate_channel, gate_channel//reduction_ratio, kernel_size=1))self.gate_s.add_module( 'gate_s_bn_reduce0', nn.BatchNorm2d(gate_channel//reduction_ratio) )self.gate_s.add_module( 'gate_s_relu_reduce0',nn.ReLU() )for i in range( dilation_conv_num ):self.gate_s.add_module( 'gate_s_conv_di_%d'%i, nn.Conv2d(gate_channel//reduction_ratio, gate_channel//reduction_ratio, kernel_size=3, \padding=dilation_val, dilation=dilation_val) )self.gate_s.add_module( 'gate_s_bn_di_%d'%i, nn.BatchNorm2d(gate_channel//reduction_ratio) )self.gate_s.add_module( 'gate_s_relu_di_%d'%i, nn.ReLU() )self.gate_s.add_module( 'gate_s_conv_final', nn.Conv2d(gate_channel//reduction_ratio, 1, kernel_size=1) )def forward(self, in_tensor):return self.gate_s( in_tensor ).expand_as(in_tensor)
class BAM(nn.Module):def __init__(self, gate_channel):super(BAM, self).__init__()self.channel_att = ChannelGate(gate_channel)self.spatial_att = SpatialGate(gate_channel)def forward(self,in_tensor):att = 1 + F.sigmoid( self.channel_att(in_tensor) + self.spatial_att(in_tensor) )return att * in_tensor
代码比较简洁易懂,值得注意的是代码与流程图中不一样的地方,图片中UUU与注意力向量M(U)M(U)M(U)相乘,然后再加UUU,但是在代码中是通道注意力与空间注意力向量相加后再加1,然后与输入特征图UUU相乘,实际是一样的。
实验
简单介绍实验记录。
表1中(a)表示BAM中超参数的消融实验,dilation value表示空洞卷积中的扩张因子参数,论文中对比了1,2,4,6四种不同的扩展因子,通过实验结果证明dilation val = 4效果最好;还对比了所见缩减比例,用与通道注意力分支的全连接层和空间注意力机制的一维卷积,通过实验证明16时效果最好。
(b)表示是否使用通道注意力分支和空间注意力分支,怎么进行融合的消融实验,通过实验发现单独添加通道分支或空间分支时都有一定的效果,但同时使用时有显著的效果提升,表明将通道和空间结合在一起对生成最终的注意力向量起到了关键作用。
翻译:事实上,这种设计类似于人类视觉系统,它具有“什么”(通道)和“哪里”(空间)两方面,并且这两方面都有助于处理视觉信息 。
表中提供了最大元素、点乘、求和三种结合方式的实验,从结果可以看出逐元素相加取得了最好的效果。元素求和能够很好的整合和保护前面的特征信息,前向推理时能够很好的使用来了两个互补分支的信息,在反向传播时,梯度平均分配给所有的输入,从而实现有效的训练。
(c)表示BAM能够有效的提升提取特征的能力,而不是检测的通过增加网络的深度提高模型的效果。
此外:
还通过实验验证了BAM添加在卷积模块内,和添加在瓶颈处对模型效果的提升,除了PreResNet110,其他的都是在瓶颈处效果提升较大。
最后
简单记录,如有问题请大家指正。
注意力机制学习 BAM相关推荐
- Attention注意力机制学习(二)------->一些注意力网络整理
SKNet--SENet孪生兄弟篇(2019) 论文 Selective Kernel Networks https://arxiv.org/abs/1903.06586 2019年 介绍 SKNe ...
- 【注意力机制】BAM: Bottleneck Attention Module论文理解
摘要 深度神经网络的最新进展是通过架构搜索来获得更强的表征能力. 瓶颈注意模块(BAM): 本研究关注深度神经网络中注意力机制的影响,提出了一个简单而有效的注意力模块,即瓶颈注意模块(BA ...
- 第七周作业:注意力机制学习的part2
[BMVC2018]BAM: Bottleneck Attention Module PDF:1807.06514.pdf (arxiv.org) 为使神经网络获得更强的表征能力,在文中作者提出了一种 ...
- 注意力机制学习笔记二(Attention-GAN、SAGAN、YLG-SAGAN)
一.Attention-GAN 论文地址:Attention-GAN for Object Transfiguration in Wild Images Object Transfiguration不 ...
- 注意力机制 ——学习笔记
文章目录 一.生物神经网络的注意力 1.1 生物注意力的种类 视觉注意力 听觉注意力 语言注意力 1.2 生物注意力的优势 1.3 注意力与记忆力的关系 1.4 人工神经网络的注意力 二.为什么要使用 ...
- (C1-2)注意力机制学习(TBD)
注意力机制 图像处理注意力机制Attention汇总(附代码) ⭐ 暂时没有要深入学习,只是用到了SENet,不太明白为什么它是一种注意力机制方法,于是去检索学习了下,后续有必要再补充. 根据注意力权 ...
- Attention注意力机制学习(一)------->SENet
目录 前言 论文 注意力机制 Squeeze-and-Excitation (SE) 模块 第一步Squeeze(Fsq) 第二步excitation(Fex) SE注意力机制应用于inception ...
- Attention注意力机制学习(三)------->从Attention到Transformer再到BERT
关于提取特征向量这件事 视觉图像领域提特征向量的方式: 古典方式:SIFI/HOG算法 现代方式:VGG.ResNet.MobileNet等网络 自然语言处理文本领域提特征向量的方式: 较早时期:N- ...
- Transformer、多头注意力机制学习笔记:Attention is All You Need.
文章目录 相关参考连接: https://blog.csdn.net/hpulfc/article/details/80448570 https://blog.csdn.net/weixin_4239 ...
最新文章
- Boost:circular buffer的测试程序
- 三十四 操作文件和目录
- 第一百一十三期:去伪存真,区块链应用到底能解决什么实际问题?
- jfinal项目部署服务器,jfinal undertow项目再集成JDK,一键安装系统服务,让部署再快一点...
- 匿名内部类 java 1614965228
- 学习web前端要了解的HTML5知识有哪些?
- leetcode 题库894-- 所有可能的满二叉树
- c+智能指针源码分析_C ++中的智能指针
- Windows Phone开发(6):处理屏幕方向的改变 转:http://blog.csdn.net/tcjiaan/article/details/7273107...
- pscad c语言程序,PSCAD入门教程(第8节):调用C语言函数及file reference组件使用...
- drool 7.x 属性 : no-loop
- uboot distro_bootcmd 理解
- 数字万用表常用功能使用
- 手机图片转换成文字怎么办
- 论文解读:《利用深度学习方法识别RNA伪尿苷位点》
- 蚂蚁笔记(leanote)搭建
- linux可执行文件剪裁
- vue自定义星星评分组件rater,可自定义星星图片,大小,暂不支持半颗星
- 数据结构——树的思维导图,帮助自己记忆。
- ATmega8仿真——LED 数码管的学习