选择内核注意力 SK | Selective Kernel Networks

SKNet是一种卷积神经网络,通过选择性卷积核机制,根据输入信息动态调整感受野大小,提高多尺度信息处理能力。在ImageNet和CIFAR等基准测试中,SKNet在保持较低模型复杂度的同时,性能优于现有先进架构。其成功应用启发了未来在神经网络动态选择机制和轻量级模型设计上的研究。

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

在这里插入图片描述

论文名称:《Selective Kernel Networks》

论文地址:https://arxiv.org/pdf/1903.06586.pdf

代码地址:https://github.com/implus/SKNet


在标准的卷积神经网络中,每层人工神经元的感受野被设计为具有相同的大小。神经科学界已经广泛认识到,视觉皮层神经元的感受野大小会受到刺激的调节,然而在构建CNN时很少考虑这一点。我们提出了一种动态选择机制,使得CNN中的每个神经元可以根据多个输入信息的尺度自适应地调整其感受野大小。我们设计了一个称为Selective Kernel (SK)单元的构建块,其中使用softmax注意力将具有不同核大小的多个分支进行融合,这种注意力受到这些分支中的信息的指导。对这些分支的不同注意力产生了融合层中神经元的有效感受野的不同大小。多个SK单元堆叠成一个深度网络,称为Selective Kernel Networks (SKNets)。在 ImageNetCIFAR 基准测试中,我们经验证明SKNet 在模型复杂度较低的情况下胜过了现有的最先进架构。详细分析表明,SKNet中的神经元能够捕捉具有不同尺度的目标对象,从而验证了神经元根据输入自适应调整感受野大小的能力。


问题背景

在深度学习领域,卷积神经网络(CNN)通常设计为在每一层具有固定大小的感受野。这种设计忽略了视觉皮层神经元根据刺激变化而调整感受野的能力,无法充分捕获多尺度信息。为了解决这一问题,Selective Kernel Networks (SKNet) 提出了一种动态选择机制,允许神经元根据多尺度输入信息自适应地调整感受野的大小。这一机制的目标是通过软注意力机制,动态选择不同大小的卷积核,从而实现多尺度信息的聚合。


核心概念

SKNet的核心概念是“选择性卷积核”(Selective Kernel)。该机制允许网络在多条路径上使用不同大小的卷积核,并通过软注意力机制选择最合适的路径。通过这种方式,神经元可以根据输入信息的特点动态调整其感受野,从而在保持较低计算成本的同时,提高网络的性能。


模块的操作步骤

在这里插入图片描述

Selective Kernel的操作步骤包括三个关键环节:拆分(Split)、融合(Fuse)和选择(Select)。在拆分步骤中,模块生成多个不同大小的卷积核路径,每条路径对应不同的感受野。在融合步骤中,模块将来自多个路径的信息聚合,生成用于选择的全局表示。最后,选择步骤使用软注意力机制,根据之前生成的全局表示来选择最佳的路径,并将选择权重应用于特征图。这样,网络可以自适应地选择不同的感受野,从而增强对目标对象的感知能力。


文章贡献

这篇文章的主要贡献在于提出了选择性卷积核机制,通过动态选择不同大小的卷积核实现多尺度信息的聚合。作者通过在ImageNet和CIFAR等基准测试上进行实验,证明了SKNet的有效性。实验结果显示,SKNet在保持较低模型复杂度的同时,性能优于现有的多种先进架构。此外,SKNet的选择机制为神经元的感受野大小自适应调整提供了新的方法,这可能是提高网络在目标识别任务中性能的关键。


实验结果与应用

实验结果显示,SKNet在ImageNet和CIFAR等基准测试上都取得了优异的表现。在ImageNet上,SKNet-50比ResNeXt-50降低了1.44%的Top-1错误率,尽管两者的模型复杂度相近。此外,SKNet还可以应用于轻量级模型,如ShuffleNetV2,证明了其广泛的适用性和有效性。SKNet在对象检测和语义分割等下游任务中也表现出色,这进一步表明其在多种视觉任务中的潜力。


对未来工作的启示

SKNet的成功启示了卷积神经网络中动态选择机制的潜力。未来的工作可以探索将SKNet应用于其他类型的神经网络,或者将其与其他注意力机制相结合。此外,SKNet的选择机制可能在轻量级模型的设计中发挥重要作用,为移动设备和嵌入式系统提供高效且有效的解决方案。研究人员还可以考虑将SKNet应用于其他领域,如自然语言处理和音频分析,以进一步拓展其应用范围。


代码

import torch.nn as nn
import torch


class GAM_Attention(nn.Module):
    def __init__(self, in_channels, rate=4):
        super(GAM_Attention, self).__init__()

        self.channel_attention = nn.Sequential(
            nn.Linear(in_channels, int(in_channels / rate)),
            nn.ReLU(inplace=True),
            nn.Linear(int(in_channels / rate), in_channels),
        )

        self.spatial_attention = nn.Sequential(
            nn.Conv2d(in_channels, int(in_channels / rate), kernel_size=7, padding=3),
            nn.BatchNorm2d(int(in_channels / rate)),
            nn.ReLU(inplace=True),
            nn.Conv2d(int(in_channels / rate), in_channels, kernel_size=7, padding=3),
            nn.BatchNorm2d(in_channels),
        )

    def forward(self, x):

        b, c, h, w = x.shape
        x_permute = x.permute(0, 2, 3, 1).view(b, -1, c)
        x_att_permute = self.channel_attention(x_permute).view(b, h, w, c)
        x_channel_att = x_att_permute.permute(0, 3, 1, 2).sigmoid()
        x = x * x_channel_att
        x_spatial_att = self.spatial_attention(x).sigmoid()
        out = x * x_spatial_att

        return out


if __name__ == "__main__":
    input = torch.randn(1, 64, 20, 20)
    model = GAM_Attention(in_channels=64)
    output = model(input)
    print(output.size())

### 即插即用的注意力机制实现 #### ECA Attention 的实现 ECA (Efficient Channel Attention) 是一种高效的通道注意力建模方法,能够显著提升模型性能而不增加过多计算开销。该机制通过引入自适应的一维卷积来捕捉跨通道的信息交互。 ```python import tensorflow as tf from tensorflow.keras.layers import Conv1D, Dense, LayerNormalization class ECAAttention(tf.keras.Model): def __init__(self, gamma=2, b=1): super(ECAAttention, self).__init__() self.gamma = gamma self.b = b def build(self, input_shape): channel = input_shape[-1] t = int(abs((np.log(channel / self.gamma)) + self.b)) k_size = max(t if t % 2 else t + 1, 3) self.avg_pool = tf.keras.layers.GlobalAveragePooling2D() self.conv = Conv1D(1, kernel_size=k_size, padding='same', activation='sigmoid') def call(self, inputs): avg_out = self.avg_pool(inputs) out = tf.reshape(avg_out, [-1, 1, inputs.shape[-1]]) attention = self.conv(out) return inputs * attention ``` 此代码实现了 ECA 注意力层,在实际应用中可以方便地嵌入到现有的神经网络架构之中[^2]。 #### SK Attention 的实现 SKNet (Selective Kernel Networks) 提出了选择内核的概念,允许网络动态调整感受野大小以更好地匹配不同的视觉模式。其核心在于 Split 和 Fuse 操作: - **Split**: 将输入特征图分为多个分支并分别施加不同尺度的感受野; - **Fuse**: 对各分支输出进行融合得到最终响应。 ```python def sk_unit(input_tensor, filters_list=[64], stride=1, M=2, r=8, L=32): d = max(int(input_tensor.shape[-1]) // r, L) splits = [] for i in range(M): conv_layer = tf.keras.Sequential([ tf.keras.layers.Conv2D(filters=filters_list[i], kernel_size=(i*2+1), strides=stride, padding="SAME"), tf.keras.layers.BatchNormalization(), tf.keras.layers.ReLU()]) split_output = conv_layer(input_tensor) splits.append(split_output) concat_features = tf.concat(splits, axis=-1) gap = tf.reduce_mean(concat_features, [1, 2], keepdims=True) z = tf.keras.layers.Dense(d)(gap) z = tf.nn.relu(z) attentions = [] for _ in range(M): a = tf.keras.layers.Dense(filters_list[_])(z) a = tf.expand_dims(a, axis=1) a = tf.expand_dims(a, axis=1) attentions.append(a) softmax_attention = tf.nn.softmax(attentions, dim=-1) refined_feature_maps = sum([s*a for s,a in zip(splits,softmax_attention)]) return refined_feature_maps ``` 这段代码展示了如何构建一个 SK Unit 来增强 CNN 中的空间感知能力[^3]。 对于希望快速集成这些先进组件的研究者来说,GitHub 上有许多开源项目提供了丰富的资源和支持。例如 `keras-attention-mechanism` 库就包含了多种流行的注意力机制实现方案,并附带详细的文档说明[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

迪菲赫尔曼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值