最近在研究一维数据,发现目前网络上的注意力机制都是基于二维来构建的,对于一维的,没有查到什么可直接加在网络中的代码,因此本次文章主要介绍常用的三种注意力机制–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)))
模型参数表:
对于代码,可关注我们公众号浩浩的科研笔记,代码都在上面。我们也是有售后的,所以大家可以放心。
版权归原作者 ALSJL 所有, 如有侵权,请联系我们删除。