最近在研究一维数据,发现目前网络上的注意力机制都是基于二维来构建的,对于一维的,没有查到什么可直接加在网络中的代码,因此本次文章主要介绍常用的三种注意力机制–SENet,CBAM和ECA其一维的代码。
1.SEnet注意力机制
SE模块允许对特征重新校准,其核心是通过全连接层对全局信息学习,根据损失函数值Loss实现通道权重梯度更新,并获取每个通道特征的权重信息,依据权重值的大小来增加有用特征的学习,抑制不重要的特征信息,提高网络运行效率。
具体的过程为:
注意力机制传入四个参数,B C W H,因此一维只需传入三个参数,并将二维卷积核换为一维卷积核即可,接下来是模型参数结构展示:
2.CBAM注意力机制
CBAM将通道注意力机制和空间注意力机制进行一个结合,相比于SENet只关注通道的注意力机制可以取得更好的效果。其改动为需进行一维的全局平均池化与全局最大池化,同样将二维卷积改为一维卷积即可。
接下来是模型参数结构展示:
MyModel(
(features): Sequential(
(0): Conv1d(32, 32, kernel_size=(3,), stride=(2,), padding=(1,))
(1): BatchNorm1d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU()
(3): CBAM(
(channelAttention): ChannelAttention(
(avg_pool): AdaptiveAvgPool1d(output_size=1)
(max_pool): AdaptiveMaxPool1d(output_size=1)
(fc1): Conv1d(32, 2, kernel_size=(1,), stride=(1,))
(relu1): ReLU()
(fc2): Conv1d(2, 32, kernel_size=(1,), stride=(1,))
(sigmoid): Sigmoid()
)
(spatialAttention): SpatialAttention(
(conv1): Conv1d(2, 1, kernel_size=(7,), stride=(1,), padding=(3,))
(sigmoid): Sigmoid()
)
)
(4): Conv1d(32, 32, kernel_size=(3,), stride=(2,), padding=(1,))
(5): BatchNorm1d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(6): ReLU()
(7): Conv1d(32, 32, kernel_size=(3,), stride=(2,), padding=(1,))
(8): BatchNorm1d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(9): ReLU()
)
(classifier): Sequential(
(0): Linear(in_features=384, out_features=48, bias=True)
(1): ReLU()
(2): Linear(in_features=48, out_features=2, bias=True)
)
)
模型参数表:
3.ECA注意力机制
ECA通过快速的一维卷积产生通道注意,其核大小可以通过通道维数的非线性映射自适应地确定。并且ECA是一个非常轻量级的即插即用块,可以提高各种深度CNN架构的性能。
ECA的改动则为去掉维度转换函数与删除维度的函数。
![(https://img-blog.csdnimg.cn/8c5b141195b0465a8b10f8f9b5057490.png)
接下来是模型参数结构展示:
MyModel(
(features): Sequential(
(0): Conv1d(32, 32, kernel_size=(3,), stride=(2,), padding=(1,))
(1): BatchNorm1d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU()
(3): ECABlock(
(avg_pool): AdaptiveAvgPool1d(output_size=1)
(conv): Conv1d(32, 32, kernel_size=(3,), stride=(1,), padding=(1,), bias=False)
(sigmoid): Sigmoid()
)
(4): Conv1d(32, 32, kernel_size=(3,), stride=(2,), padding=(1,))
(5): BatchNorm1d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(6): ReLU()
(7): Conv1d(32, 32, kernel_size=(3,), stride=(2,), padding=(1,))
(8): BatchNorm1d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(9): ReLU()
)
(classifier): Sequential(
(0): Linear(in_features=384, out_features=48, bias=True)
(1): ReLU()
(2): Linear(in_features=48, out_features=2, bias=True)
)
)
模型参数表:
对于代码,可关注我们公众号浩浩的科研笔记,代码都在上面。我们也是有售后的,所以大家可以放心。