本文对比了两种常见的通道注意力机制,包括经典的通道注意力模块和自适应通道权重分配方法。

第一个代码块展示了一个经典的通道注意力模块 (ChannelAttention),它通过全局池化层和两个卷积层生成通道权重向量。该模块的优点在于简单易懂,并在许多任务中表现良好。

class ChannelAttention(nn.Module):
    def __init__(self, in_planes, ratio=16):
        super(ChannelAttention, self).__init__()

        self.max_pool = nn.AdaptiveMaxPool2d(1)

        self.fc1 = nn.Conv2d(in_planes, in_planes // 16, 1, bias=False)
        self.relu1 = nn.ReLU()
        self.fc2 = nn.Conv2d(in_planes // 16, in_planes, 1, bias=False)

        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))
        out = max_out
        return self.sigmoid(out)

第二个代码片段则展示了一种自适应通道权重分配方法。它通过平均池化层和一个 1x1 卷积层生成通道权重向量,并通过 Softmax 函数对权重进行归一化。该方法的优点在于能够自适应地学习通道权重,在某些任务中可能取得更好的表现。

feat_vec = self.avg_pool(spatial_attentioned_img_feat)
feat_vec = conv1x1_channel_wise(feat_vec)
feat_vec = nn.Softmax(dim=1)(feat_vec) * feat_vec.shape[1]

其中 conv1x1_channel_wisenn.Conv2d(input, input, 1, bias=True)

总结来说,两种通道注意力模块各有优劣,具体选择哪一种需要根据任务和数据集来决定。例如,在资源受限的情况下,经典的通道注意力模块可能更适合,而在追求更精细的通道权重分配时,自适应通道权重分配方法可能更合适。

通道注意力机制比较:经典模块 vs 自适应权重分配

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

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