【Block总结】SGE注意力机制
一、论文介绍
论文链接:https://arxiv.org/pdf/1905.09646
- 研究背景:论文首先提及了在计算机视觉领域,特征分组的思想由来已久,并介绍了相关背景。
- 研究目的:旨在通过引入SGE模块,改善特征图的空间分布,提升模型对特定语义特征的表示能力。
- 实验平台:实验代码和预训练模型可在https://github.com/implus/PytorchInsight 获取。
二、创新点
- SGE模块:提出了一种新的空间分组增强模块,该模块具有轻量级、几乎不需要额外参数和计算量的特点。
- 特征表示增强:SGE模块能够显著改善特征图的空间分布,提升模型对特定语义特征的捕捉能力。
- 对比实验:在ImageNet和COCO 2017数据集上与多种先进的注意力模块进行了对比实验,验证了SGE模块的有效性。
三、方法
- SGE模块设计:介绍了SGE模块的具体设计,包括如何通过分组和增强操作来改善特征图的空间分布。
- 特征分组:将特征图按空间位置进行分组,每组包含特定区域的特征向量。
- 增强操作:对每个组的特征向量进行增强处理,以提高其表示能力。
四、模块作用
- 改善空间分布:SGE模块通过分组和增强操作,改善了特征图的空间分布,使得语义相关区域的激活值更加突出。
- 抑制噪声:在增强语义相关区域的同时,SGE模块还能有效抑制大量噪声,提高特征表示的清晰度。
- 提升准确性:实验结果表明,引入SGE模块后,模型的准确性得到了显著提升。
五、改进的效果
- ImageNet数据集:在ImageNet数据集上,SGE-ResNet50和SGE-ResNet101的Top-1和Top-5准确率均超过了多种先进的注意力模块。
- COCO 2017数据集:在COCO 2017数据集上,SGE模块也表现出色,提升了对象检测的平均精度(AP)。
- 可视化分析:通过可视化分析,进一步验证了SGE模块在改善特征图空间分布和提升语义特征表示能力方面的有效性。
代码:
import torch
from torch import nn
from torch.nn.parameter import Parameter
__all__ = ['SGELayer']
class SGELayer(nn.Module):
def __init__(self, groups=64):
super(SGELayer, self).__init__()
self.groups = groups
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.weight = Parameter(torch.zeros(1, groups, 1, 1))
self.bias = Parameter(torch.ones(1, groups, 1, 1))
self.sig = nn.Sigmoid()
def forward(self, x):
b, c, h, w = x.size()
x = x.view(b * self.groups, -1, h, w)
xn = x * self.avg_pool(x)
xn = xn.sum(dim=1, keepdim=True)
t = xn.view(b * self.groups, -1)
t = t - t.mean(dim=1, keepdim=True)
std = t.std(dim=1, keepdim=True) + 1e-5
t = t / std
t = t.view(b, self.groups, h, w)
t = t * self.weight + self.bias
t = t.view(b * self.groups, 1, h, w)
x = x * self.sig(t)
x = x.view(b, c, h, w)
return x
if __name__ == '__main__':
# 生成随机输入数据
input_data = torch.randn(1, 32, 640, 480)
mca = SGELayer(16)
output = mca(input_data)
# 打印输入和输出形状
print("Input size:", input_data.size())
print("Output size:", output.size())