Selective Kernel Residual Network(SKResNet) 是一种结合了选择性卷积核机制和残差连接的深度神经网络架构。它通过动态选择不同尺度的卷积核来自适应地提取多尺度特征,在保持计算效率的同时显著提升了模型的表达能力和性能。
传统卷积神经网络(CNN)在图像处理中依赖固定大小的卷积核(如 3x3 或 5x5)来提取特征。这种设计虽然简单高效,但在面对具有多尺度特征的复杂场景时,表现出一定的局限性:
这些限制促使研究者探索更加灵活和智能的卷积操作方式,Selective Kernel Network正是在这一背景下应运而生的创新解决方案。
SKResNet 的核心在于引入 Selective Kernel(SK)机制,它允许网络根据输入数据动态选择不同尺度的卷积核。具体而言:
多尺度卷积并行:在 SKBlock 中,网络同时使用多个不同大小的卷积核(如 3x1、5x1、7x1、9x1)处理输入,生成多种尺度的特征表示。
注意力加权融合:通过全局平均池化和全连接层,计算每个卷积核输出对应的注意力权重,再根据这些权重动态融合多尺度特征。
残差连接:结合 ResNet 的跳跃连接(shortcut),缓解深层网络的梯度消失问题,提升训练稳定性。
相比传统的卷积神经网络,SKResNet展现出显著的技术优势:
SKResNet采用层次化的设计思路,主要由以下几个核心组件构成:
这种模块化设计不仅提高了代码的可维护性,还使得网络结构具有良好的可扩展性和灵活性。
SKBlock是SKResNet的核心创新模块,负责实现多尺度特征的提取和智能选择。
class SKBlock(nn.Module):
def __init__(self, inchannel, outchannel, stride=1):
super().__init__()
# 多尺度卷积核定义
self.kernel1 = nn.Sequential(
nn.Conv2d(inchannel, outchannel, (3, 1), (stride, 1), (1, 0)),
nn.BatchNorm2d(outchannel)
)
self.kernel2 = nn.Sequential(
nn.Conv2d(inchannel, outchannel, (5, 1), (stride, 1), (2, 0)),
nn.BatchNorm2d(outchannel)
)
self.kernel3 = nn.Sequential(
nn.Conv2d(inchannel, outchannel, (7, 1), (stride, 1), (3, 0)),
nn.BatchNorm2d(outchannel)
)
self.kernel4 = nn.Sequential(
nn.Conv2d(inchannel, outchannel, (9, 1), (stride, 1), (4, 0)),
nn.BatchNorm2d(outchannel)
)
SKBlock采用四个不同尺寸的一维卷积核:3×1、5×1、7×1、9×1。这种设计有以下几个考虑:
self.gap = nn.AdaptiveAvgPool2d(1)
self.att_fc = nn.Sequential(
nn.Linear(outchannel, outchannel*4),
nn.Sigmoid()
)
注意力机制的设计包含以下关键组件:
def forward(self, x):
# 多尺度特征提取
y1 = self.kernel1(x).unsqueeze(1) # [b, 1, outchannel, h, modal]
y2 = self.kernel2(x).unsqueeze(1)
y3 = self.kernel3(x).unsqueeze(1)
y4 = self.kernel4(x).unsqueeze(1)
y_total = torch.cat([y1, y2, y3, y4], dim=1) # [b, 4, outchannel, h, modal]
# 注意力权重计算
attn = self.att_fc(self.gap(torch.sum(y_total, dim=1)).squeeze(-1).squeeze(-1))
attn = attn.reshape(x.size(0), 4, -1).unsqueeze(-1).unsqueeze(-1)
# 加权融合
attn_y = y_total * attn
out = torch.sum(attn_y, dim=1)
return out
特征选择与融合过程包含以下步骤:
class Block(nn.Module):
def __init__(self, inchannel, outchannel, stride=1):
super().__init__()
self.block = nn.Sequential(
SKBlock(inchannel=inchannel, outchannel=outchannel, stride=stride),
nn.BatchNorm2d(outchannel),
nn.ReLU(),
nn.Conv2d(outchannel, outchannel, 1, 1, 0),
nn.BatchNorm2d(outchannel)
)
self.short = nn.Sequential()
if (inchannel != outchannel or stride != 1):
self.short = nn.Sequential(
nn.Conv2d(inchannel, outchannel, (3, 1), (stride, 1), (1, 0)),
nn.BatchNorm2d(outchannel)
)
def forward(self, x):
out = self.block(x) + self.short(x)
return nn.ReLU()(out)
Block模块的设计融合了SKBlock和残差学习的优势:
class SKResNet(nn.Module):
def __init__(self, train_shape, category):
super().__init__()
self.layer1 = self.make_layers(1, 64, 2, 1)
self.layer2 = self.make_layers(64, 128, 2, 1)
self.layer3 = self.make_layers(128, 256, 2, 1)
self.layer4 = self.make_layers(256, 512, 2, 1)
self.ada_pool = nn.AdaptiveAvgPool2d((1, train_shape[-1]))
self.fc = nn.Linear(512*train_shape[-1], category)
SKResNet的整体架构采用四层递进的设计:
SKResNet中卷积核尺寸的选择遵循以下原则:
注意力机制的设计考虑了以下几个方面:
残差连接的实现包含以下优化策略:
SKResNet在网络设计中平衡了深度与宽度:
SKResNet的计算复杂度主要由以下几部分组成:
组件 | 复杂度特征 | 主要开销 |
---|---|---|
多尺度卷积 | O(K²×C×H×W) | 四个并行卷积核的计算 |
注意力机制 | O(C) | 全连接层的参数量线性增长 |
残差连接 | O(C×H×W) | 额外的1×1卷积调整 |
整体网络 | O(D×C²×H×W) | 深度D和通道数C的联合影响 |
尽管SKBlock增加了计算开销,但通过以下策略实现了效率优化:
指标 | SKResNet | 传统 CNN |
---|---|---|
特征提取方式 | 动态选择卷积核 | 固定卷积核 |
感知范围 | 多尺度 | 固定尺度 |
参数量 | 较多 | 较少 |
计算复杂度 | 较高 | 较低 |
任务适应性 | 高 | 中 |
典型应用 | 图像分类、目标检测 | 图像分类、图像分割 |
本节以OPPORTUNITY 数据集为例,展示SKResNet的实际应用及其实验结果。
融合选择性卷积与残差结构的SKResNet在OPPORTUNITY数据集上的性能如下表所示:
| Metric | Value |
Inference Time 5.23 ms
Val Acc 0.9724
Accuracy 0.9755
Macro Precision 0.9632
Macro Recall 0.9604
Macro F1 0.9614
Fw-score 0.9754
SKResNet 实现了令人印象深刻的 0.9724 验证准确率和 0.9755 的整体准确率,这反映了它对数据集内不同活动进行分类的有效性。该模型还表现出很强的泛化性,宏观精度为 0.9632,宏观召回率为 0.9604,宏观 F1 评分为 0.9614。0.9754 的频率加权分数 (Fw-score) 进一步强调了其跨类别之间的平衡表现。SKResNet 的推理时间为 5.23 毫秒 ,事实证明它对实时应用程序非常有效。
Open_Door_1: Precision = 1.00, Recall = 1.00, F1-score = 1.00
Close_Door_1: Precision = 0.98, Recall = 0.98, F1-score = 0.98
Open_Door_2: Precision = 1.00, Recall = 1.00, F1-score = 1.00
Close_Door_2: Precision = 0.98, Recall = 0.97, F1-score = 0.98
Open_Fridge: Precision = 0.97, Recall = 0.97, F1-score = 0.97
Close_Fridge: Precision = 0.99, Recall = 0.97, F1-score = 0.98
Dishwasher: Precision = 0.96, Recall = 0.94, F1-score = 0.95
Open_Drawer_1: Precision = 0.94, Recall = 0.92, F1-score = 0.93
Close_Drawer_1: Precision = 0.89, Recall = 0.88, F1-score = 0.88
Open_Drawer_2: Precision = 0.86, Recall = 0.88, F1-score = 0.87
Close_Drawer_2: Precision = 0.75, Recall = 0.75, F1-score = 0.75
Open_Drawer_3: Precision = 0.94, Recall = 0.94, F1-score = 0.94
Close_Drawer_3: Precision = 0.99, Recall = 0.99, F1-score = 0.99
Clean_Table: Precision = 0.98, Recall = 0.98, F1-score = 0.98
Drink_from_Cup: Precision = 1.00, Recall = 0.98, F1-score = 0.99
Toggle_Switch: Precision = 0.98, Recall = 0.98, F1-score = 0.98
Open_Door_1、Open_Door_2 和 Close_Drawer_3 等活动可以达到近乎完美的 F1 分数 (0.99–1.00),这表明 SKResNet 能够精确识别不同的运动模式。
SKResNet 擅长区分动态活动,同时偶尔会面临重叠运动模式的挑战:
训练过程中,ResNext 的训练集与验证集指标表现如下:
训练和验证指标的紧密结合表明 SKResNet 避免了严重的过拟合,实现了稳定可靠的性能。选择性核残差网络 (SKResNet) 在 OPPORTUNITY 数据集上提供了出色的结果,总体准确率为 0.9755, 宏 F1 分数为 0.9614,推理时间为 5.23 毫秒 。其自适应内核选择和残差连接使其能够有效地捕获多尺度特征,使其非常适合行为识别任务。该模型擅长区分动态活动,例如开门作和饮酒,同时显示出密切相关的作(如抽屉作)的微小限制。
Selective Kernel Residual Network通过巧妙地结合多尺度卷积核选择和残差学习,为深度学习领域带来了新的思路和方法。它不仅解决了传统CNN在多尺度特征提取方面的局限性,还通过注意力机制实现了智能的特征选择,在保持计算效率的同时显著提升了模型性能。SKResNet代表了深度学习架构设计的一个重要发展方向,它展示了如何通过创新的设计思路来突破传统方法的局限性,为构建更加智能和高效的深度学习模型提供了宝贵的经验和启示。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。