注意力机制之SGE Attention

论文提出了一种名为空间组增强(SGE)的模块,旨在改进卷积神经网络(CNN)中的语义特征学习。SGE通过生成注意因子调整子特征的重要性,增强了每个组的表达能力并抑制潜在噪声。该模块设计轻量级,仅基于组内特征相似性引导注意因子,无需大量额外参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

论文

Spatial Group-wise Enhance: Improving Semantic Feature Learning in Convolutional Networks

论文链接

paper:Spatial Group-wise Enhance: Improving Semantic Feature Learning in Convolutional Networks

模型结构

在这里插入图片描述

论文主要内容

卷积神经网络(CNN)通过收集不同层次和不同部分的语义子特征来生成复杂对象的特征表示。这些子特征通常可以以分组形式分布在每一层的特征向量中,代表各种语义实体。然而,这些子特征的激活往往在空间上受到相似模式和噪声背景的影响,从而导致错误的定位和识别。本文提出了一个空间组增强(SGE)模块,该模块可以通过为每个语义组中的每个空间位置生成一个注意因子来调整每个子特征的重要性,从而每个单独的组可以自主地增强其学习的表达,并抑制可能的噪声。注意因素仅由各组内部的全局和局部特征描述符之间的相似性来引导,因此SGE模块的设计非常轻量级,几乎没有额外的参数和计算。

import numpy as np
import torch
from torch import nn
from torch.nn import init



class SpatialGroupEnhance(nn.Module):

    def __init__(self, groups):
        super().__init__()
        self.groups=groups
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.weight=nn.Parameter(torch.zeros(1,groups,1,1))
        self.bias=nn.Parameter(torch.zeros(1,groups,1,1))
        self.sig=nn.Sigmoid()
        self.init_weights()


    def init_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                init.kaiming_normal_(m.weight, mode='fan_out')
                if m.bias is not None:
                    init.constant_(m.bias, 0)
            elif isinstance(m, nn.BatchNorm2d):
                init.constant_(m.weight, 1)
                init.constant_(m.bias, 0)
            elif isinstance(m, nn.Linear):
                init.normal_(m.weight, std=0.001)
                if m.bias is not None:
                    init.constant_(m.bias, 0)

    def forward(self, x):
        b, c, h,w=x.shape
        x=x.view(b*self.groups,-1,h,w) #bs*g,dim//g,h,w
        xn=x*self.avg_pool(x) #bs*g,dim//g,h,w
        xn=xn.sum(dim=1,keepdim=True) #bs*g,1,h,w
        t=xn.view(b*self.groups,-1) #bs*g,h*w

        t=t-t.mean(dim=1,keepdim=True) #bs*g,h*w
        std=t.std(dim=1,keepdim=True)+1e-5
        t=t/std #bs*g,h*w
        t=t.view(b,self.groups,h,w) #bs,g,h*w
        
        t=t*self.weight+self.bias #bs,g,h*w
        t=t.view(b*self.groups,1,h,w) #bs*g,1,h*w
        x=x*self.sig(t)
        x=x.view(b,c,h,w)

        return x 


if __name__ == '__main__':
    input=torch.randn(50,512,7,7)
    sge = SpatialGroupEnhance(groups=8)
    output=sge(input)
    print(output.shape)

代码解析

该模块可以增强CNN中特征图的表达能力,并提升其性能。
在此代码块中,定义了两个变量b和c,分别表示输入x的batch size和通道数。

接着,执行了reshape操作,将每个channel划分为self.groups个group。第一行中,x经过reshape之后变成了大小为(b*groups,dim//groups,h,w)的张量。

然后,这个被划分为group的特征图通过 x n = x 1 H W ∑ x xn=x\frac{1}{HW}\sum x xn=xHW1x的方法,生成了加权后的特征图,其中H*W为特征图的像素点个数,由avg_pool操作保证输出特征图形状一致。

接着,执行了 x n xn xn 的加权操作。

之后,将加权后的张量 t t t进行标准化操作,即每个元素减去均值并除以方差。

在这个阶段,t被视为group的全局平均值(rolling-mean)和标准差(rolling-std)。group内的每个值被减去它们的group的rolling-mean,再除以该group的rolling-std。标准化的结果被保存在张量t中。

并且,执行了激活函数的计算,即t * self.weight + self.bias,其中self.weight和self.bias是可学习的参数。

然后,执行了x * the sigmoid of t 操作,并将结果再次分组。

将正常化之后的结果乘以原始输入“x”(第三行代码),并将结果reshape成最终输出的形式。

最后,用input中的随机张量来测试该模型,并打印出其最终的输出形状。

### SGE注意力机制的实现与解释 #### 关于SGE模块的工作原理 SGE(Spatial Gather-Excite)模块通过全局和局部特征描述符之间的相似性来生成注意力因子,从而增强语义特征的空间分布并抑制噪声[^1]。具体来说,该方法旨在捕捉空间维度上的依赖关系,使得模型能够更好地聚焦于重要的区域。 #### 技术细节解析 为了理解如何在深度学习框架中部署SGE机制,可以考虑以下几个方面: - **输入处理**:接收来自卷积层或其他编码结构产生的多通道特征图作为输入。 - **计算过程** - 首先提取全局上下文信息; - 接着测量这些全局表示与各个位置处局部特征向量间的关联度; - 基于此关联程度构建权重矩阵; - 将此权重应用于原始特征映射上以调整其激活强度。 ```python import torch.nn as nn class SpatialGatherModule(nn.Module): def __init__(self, scale=1.0): super(SpatialGatherModule, self).__init__() self.scale = scale def forward(self, feats, probs): batch_size, num_classes, height, width = probs.size( ) # Compute the global context from probability map. probs_mean = probs.view(batch_size, num_classes, -1).mean(dim=-1).view(batch_size, num_classes, 1, 1) # Apply softmax to get normalized weights over spatial locations. weights = (probs / (probs_mean + 1e-7)).softmax(dim=(2, 3)) # Perform weighted sum across all positions within each channel of feature maps. out = (feats * weights).sum((2, 3), keepdim=True) return out * self.scale ``` 上述代码展示了`SpatialGatherModule`类的一个简单版本,它接受两个参数——特征张量(`feats`)以及类别预测概率(`probs`)。这里的关键操作是在给定的概率图基础上计算加权平均值,并据此重新分配特征的重要性得分。 #### 应用场景扩展 除了图像分类任务外,SGE也可以被应用到目标检测、实例分割等领域,在不同数据集如ImageNet-1K、MS COCO等上面均显示出良好的性能提升效果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

果粒橙_LGC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值