通道注意力机制(Channel Attention)代码详解 - PyTorch实现
这段代码定义了一个通道注意力模块(ChannelAttention),它通过对输入特征图进行通道级别的注意力加权来提升模型的性能。
该模块主要包含以下几个部分:
avg_pool和max_pool:分别进行自适应平均池化和自适应最大池化,将输入特征图压缩成一个通道。fc1和fc2:两个卷积层,用于对压缩后的特征图进行通道维度的降维和升维。relu1:激活函数,用于增加模型的非线性表达能力。sigmoid:激活函数,用于将输出的加权系数限制在0到1之间,以表示通道的重要程度。
在模型的前向传播过程中,该模块首先对输入的特征图进行平均池化和最大池化,然后分别通过 fc1 和 fc2 进行通道维度的降维和升维,并经过 relu1 进行非线性变换。最后将两个通道加权的结果相加,并通过 sigmoid 激活函数输出加权系数,以表示每个通道的重要程度。
以下是代码的详细解释:
class ChannelAttention(nn.Module):
def __init__(self, in_planes, ratio=16):
super(ChannelAttention, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
self.relu1 = nn.PReLU()
self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))
max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))
out = avg_out + max_out
return self.sigmoid(out)
代码解析:
-
__init__方法初始化模块参数,包括:in_planes: 输入特征图的通道数。ratio: 通道降维的比例,用于控制fc1卷积层的输出通道数。avg_pool,max_pool,fc1,relu1,fc2,sigmoid: 模块中使用的层和激活函数。
-
forward方法执行前向传播,具体步骤如下:- 对输入特征图
x进行平均池化 (avg_pool) 和最大池化 (max_pool),分别得到avg_out和max_out。 - 将
avg_out和max_out分别通过fc1,relu1,fc2进行通道维度的降维和升维,并经过非线性变换。 - 将两个通道加权的结果相加,得到
out。 - 使用
sigmoid函数对out进行激活,得到最终的加权系数,用于对输入特征图进行通道级别的注意力加权。
- 对输入特征图
总结:
通道注意力模块通过对输入特征图进行通道级别的注意力加权,可以有效地提升模型的性能。该模块的代码结构简单易懂,实现方便,值得在深度学习模型中尝试使用。
原文地址: http://www.cveoy.top/t/topic/jnwX 著作权归作者所有。请勿转载和采集!