CBNet: ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks
PDF:https://arxiv.org/pdf/1910.03151.pdf
PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks
1 概述
作者通过比对试验分别比较了降维和通道信息交流对SE Block的影响,分别得出两个结论,不降维的SE具有更好性能,通道信息交流有助于SE性能提升。因此在SE Block的基础上提出了更轻量化的ECA Block
2 Efficient Channel Attention (ECA) Module
SE (Global pooling-FC[r]-ReLu-FC-sigmoid),FC[r]就是使用压缩比(降维)为 r 的FC层。
SE-Var1(0参数的SE,Global pooling-sigmoid)
SE-Var2 (Global pooling-[·]-sigmoid),[·]为点积操作。
SE-Var3 (Global pooling-FC-sigmoid)
2-1 Avoiding Dimensionality Reduction
SE-Var2和SE-Var3表明,不用降维操作的FC具有更好性能。SE-Var3结果更出色因为考虑了通道间信息交流(cross-channel interaction)。SE-GC1、SE-GC2 和 SE-GC3分别表示在SE-Var3基础上使用不同数量的 group的Group convolution操作。
2-2 Local Cross-Channel Interaction
同时作者可视化通道特征发现它具有一定的局部周期性,因此作者只考虑当前通道和其 k 个邻域通道的信息交流。然后参数数量为 k ,再共享所有通道的参数,则最终的参数数量为 k 。实现上使用卷积核为 k 的1D卷积来实现通道交换,即
3 与其他注意力模块对比
PyTorch代码:
class ECA_Module(nn.Module):
def __init__(self, channel,gamma=2, b=1):
super(ECA_Module, self).__init__()
self.gamma = gamma
self.b = b
t = int(abs(log(channel, 2) + self.b) / self.gamma)
k = t if t % 2 else t + 1
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.conv = nn.Conv1d(1, 1, kernel_size=k, padding=k//2, bias=False)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
b, c, _, _ = x.size()
y = self.avg_pool(x)
y = self.conv(y.squeeze(-1).transpose(-1,-2))
y = y.transpose(-1,-2).unsqueeze(-1)
y = self.sigmoid(y)
return x * y.expand_as(x)