欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 【深度学习中的注意力机制7】11种主流注意力机制112个创新研究paper+代码——通道注意力(Channel Attention)

【深度学习中的注意力机制7】11种主流注意力机制112个创新研究paper+代码——通道注意力(Channel Attention)

2024/10/23 16:16:06 来源:https://blog.csdn.net/gaoxiaoxiao1209/article/details/143080690  浏览:    关键词:【深度学习中的注意力机制7】11种主流注意力机制112个创新研究paper+代码——通道注意力(Channel Attention)

【深度学习中的注意力机制7】11种主流注意力机制112个创新研究paper+代码——通道注意力(Channel Attention)

【深度学习中的注意力机制7】11种主流注意力机制112个创新研究paper+代码——通道注意力(Channel Attention)


文章目录

  • 【深度学习中的注意力机制7】11种主流注意力机制112个创新研究paper+代码——通道注意力(Channel Attention)
  • 1. 通道注意力的起源与提出
  • 2. 通道注意力的原理
  • 3. 通道注意力的发展
  • 4. 代码实现
  • 5. 代码逐句解释
  • 6. 总结


欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:
可访问艾思科蓝官网,浏览即将召开的学术会议列表。会议入口:https://ais.cn/u/mmmiUz

1. 通道注意力的起源与提出

通道注意力(Channel Attention)是近年来在计算机视觉任务中提出的一种注意力机制,旨在捕捉输入特征在通道维度上的相关性。通道注意力的提出主要是为了应对传统卷积神经网络(CNN)中忽略特征图各个通道之间的显式关联这一问题。

通道注意力最早在2017年由Hu等人在其提出的Squeeze-and-Excitation Networks (SE-Nets) 中引入。SE模块通过为每一个通道分配一个重要性权重,动态调整通道特征的影响,从而增强有用的特征,抑制不相关的特征。这一机制帮助CNN更加有效地学习到图像中的重要信息,在许多视觉任务中取得了显著的性能提升。

2. 通道注意力的原理

通道注意力的核心思想是通过学习每个特征通道的权重来增强网络的表示能力。具体来说,它对输入特征图的每个通道进行加权,使得网络能够根据任务的需要自动增强或者削弱不同通道的特征。以SE模块为例,其具体步骤如下:

Squeeze(压缩): 将输入的特征图通过全局平均池化(Global Average Pooling)压缩到通道维度。此步骤的目的是获取每个通道的全局信息,使得通道间的信息得以融合。具体地,对于输入特征图 X ∈ R H × W × C X∈R^{H×W×C} XRH×W×C,全局平均池化输出一个 C C C-维向量,表示每个通道的全局统计信息。

Excitation(激发): 将压缩后的通道信息通过一个两层的全连接网络,利用非线性激活函数(如ReLU)和sigmoid函数来生成每个通道的权重。这个权重代表了每个通道的重要性。

Reweighting(重加权): 将生成的通道权重与原始特征图进行逐通道相乘,以调整每个通道的权重。

SE模块的计算过程可以表示为:
在这里插入图片描述
其中, X c X_c Xc表示输入特征图的第 c c c 个通道, z z z 是通道的全局统计信息, s s s 是通过两层全连接网络生成的通道权重, X c ˆ \^{X_c} Xcˆ经过权重调整后的特征图。

3. 通道注意力的发展

通道注意力机制自SE模块提出以来,得到了广泛的应用和发展。在原始SE模块的基础上,研究者们提出了许多改进版本,比如:

  • CBAM(Convolutional Block Attention Module):CBAM模块结合了空间注意力和通道注意力,以捕获更多维度的特征信息。
  • ECA-Net(Efficient Channel Attention): 为了避免SE模块中的过多参数,ECA-Net通过局部卷积来代替全连接层,从而减少参数量并提升效率。
  • SKNet(Selective Kernel Networks): SKNet通过动态调整卷积核的大小,引入了更多的通道选择策略。

4. 代码实现

下面是基于PyTorch框架的一个简单通道注意力机制的实现,采用了Squeeze-and-Excitation模块。

import torch
import torch.nn as nnclass SEBlock(nn.Module):def __init__(self, in_channels, reduction=16):super(SEBlock, self).__init__()# 全局平均池化self.global_avg_pool = nn.AdaptiveAvgPool2d(1)# 第一个全连接层,减少通道数self.fc1 = nn.Linear(in_channels, in_channels // reduction, bias=False)# 第二个全连接层,恢复通道数self.fc2 = nn.Linear(in_channels // reduction, in_channels, bias=False)# 激活函数self.relu = nn.ReLU()self.sigmoid = nn.Sigmoid()def forward(self, x):# 输入尺寸为 [batch_size, in_channels, H, W]# 1. 全局平均池化,将特征图压缩到 [batch_size, in_channels, 1, 1]b, c, _, _ = x.size()y = self.global_avg_pool(x).view(b, c)# 2. 两层全连接网络,计算每个通道的权重y = self.fc1(y)y = self.relu(y)y = self.fc2(y)y = self.sigmoid(y)# 3. 将权重重新调整为 [batch_size, in_channels, 1, 1],并与输入逐通道相乘y = y.view(b, c, 1, 1)return x * y.expand_as(x)# 测试SE模块
batch_size = 4
in_channels = 64
height, width = 32, 32# 随机生成输入张量
x = torch.randn(batch_size, in_channels, height, width)# 实例化SEBlock
se_block = SEBlock(in_channels)# 前向传播
output = se_block(x)print("输入尺寸:", x.shape)
print("输出尺寸:", output.shape)

5. 代码逐句解释

1. 导入库:

import torch
import torch.nn as nn

导入PyTorch库,其中torch用于张量操作,nn包含神经网络模块。

2. 定义SEBlock类:

class SEBlock(nn.Module):def __init__(self, in_channels, reduction=16):super(SEBlock, self).__init__()

定义SEBlock类,继承自nn.Modulein_channels为输入特征的通道数,reduction是通道压缩率(通常设置为16)。

3. 全局平均池化层:

self.global_avg_pool = nn.AdaptiveAvgPool2d(1)

AdaptiveAvgPool2d(1)将每个通道的特征图压缩为单一值(全局平均池化)。

4. 全连接层定义:

self.fc1 = nn.Linear(in_channels, in_channels // reduction, bias=False)
self.fc2 = nn.Linear(in_channels // reduction, in_channels, bias=False)

通过两层全连接层,首先将通道数减少,进行非线性变换,再将其恢复到原始通道数。

5. 激活函数:

self.relu = nn.ReLU()
self.sigmoid = nn.Sigmoid()

ReLU用于第一层全连接后的激活,Sigmoid用于最后计算权重的激活函数。

6. 前向传播函数:

def forward(self, x):b, c, _, _ = x.size()y = self.global_avg_pool(x).view(b, c)y = self.fc1(y)y = self.relu(y)y = self.fc2(y)y = self.sigmoid(y)y = y.view(b, c, 1, 1)return x * y.expand_as(x)
  • 首先对输入特征图进行全局平均池化。
  • 然后通过两层全连接层计算每个通道的权重。
  • 最后将权重与原始输入特征逐通道相乘。

7. 测试SE模块:

x = torch.randn(batch_size, in_channels, height, width)
se_block = SEBlock(in_channels)
output = se_block(x)
print("输入尺寸:", x.shape)
print("输出尺寸:", output.shape)

在这里,通过随机生成输入张量测试SE模块,检查输入和输出的尺寸是否匹配。

6. 总结

通道注意力(如SE模块)通过为每个通道分配权重,在视觉任务中提升了网络的表现能力。其原理是通过全局平均池化获取每个通道的全局信息,并动态调整每个通道的重要性。经过多年的发展,通道注意力已经成为视觉任务中不可或缺的模块,并在不同的模型结构中得到广泛应用。

欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:
可访问艾思科蓝官网,浏览即将召开的学术会议列表。会议入口:https://ais.cn/u/mmmiUz

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com