这段代码定义了一个通道注意力模块(ChannelAttention),它通过对输入特征图进行通道级别的注意力加权来提升模型的性能。

该模块主要包含以下几个部分:

  • avg_poolmax_pool:分别进行自适应平均池化和自适应最大池化,将输入特征图压缩成一个通道。
  • fc1fc2:两个卷积层,用于对压缩后的特征图进行通道维度的降维和升维。
  • relu1:激活函数,用于增加模型的非线性表达能力。
  • sigmoid:激活函数,用于将输出的加权系数限制在0到1之间,以表示通道的重要程度。

在模型的前向传播过程中,该模块首先对输入的特征图进行平均池化和最大池化,然后分别通过 fc1fc2 进行通道维度的降维和升维,并经过 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)

代码解析:

  1. __init__ 方法初始化模块参数,包括:

    • in_planes: 输入特征图的通道数。
    • ratio: 通道降维的比例,用于控制 fc1 卷积层的输出通道数。
    • avg_pool, max_pool, fc1, relu1, fc2, sigmoid: 模块中使用的层和激活函数。
  2. forward 方法执行前向传播,具体步骤如下:

    • 对输入特征图 x 进行平均池化 (avg_pool) 和最大池化 (max_pool),分别得到 avg_outmax_out
    • avg_outmax_out 分别通过 fc1, relu1, fc2 进行通道维度的降维和升维,并经过非线性变换。
    • 将两个通道加权的结果相加,得到 out
    • 使用 sigmoid 函数对 out 进行激活,得到最终的加权系数,用于对输入特征图进行通道级别的注意力加权。

总结:

通道注意力模块通过对输入特征图进行通道级别的注意力加权,可以有效地提升模型的性能。该模块的代码结构简单易懂,实现方便,值得在深度学习模型中尝试使用。

通道注意力机制(Channel Attention)代码详解 - PyTorch实现

原文地址: http://www.cveoy.top/t/topic/jnwX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录