HS-ResNet: Hierarchical-Split Block on Convolutional Neural Network
本文提出了一种新颖的分层分割块(HSBlock),用于提升卷积神经网络(CNN)的性能和效率。该方法通过将特征图拆分为多个组并进行多尺度特征提取,解决了传统网络在处理复杂任务时可能产生的特征冗余和计算复杂度过高的问题。实验表明,基于HSBlock设计的HS-ResNet在图像分类、目标检测等任务中表现优异,并且在保持参数数量和计算成本的同时实现了更强大的特征表示能力。与现有的多种网络架构相比,HS-ResNet展现了显著的优势。
引言
构建高效率的网络架构是进一步优化其性能表现的核心要素。然而,在这些关键参数(如网络规模、宽度和基数等)发生变动时,体系结构的设计变得更加复杂尤其是在网络深入发展的时候。在本研究中我们重新审视了影响瓶颈的关键因素及其尺寸设置。我们特别关注以下三项基础问题:(i) 如何防止特征图中包含过量且冗余的信息内容。(ii) 如何在不增加计算开销的情况下显著增强模型对特征表示的学习能力。(iii) 如何实现既提升模型性能又维持推理速度不降。
在本文中,我们提出了一个新颖的分层分割块,用于生成多尺度特征表示。具体而言,深度神经网络中的常规特征图将被划分为s个子块,每个子块包含w个通道。如图2所示,仅第一组滤波器能够直接连接至下一层。随后将第二组特征图输入至3×3卷积层进行特征提取,接着将输出后的特征图在通道维度上分解为两个子组。其中一个子组直接连接至下一层,而另一个子组则需与通道维度中的下一组输入特征映射进行串联操作。通过使用一组3×3卷积滤波器完成此串联过程,其后该过程可重复执行直至处理完所有输入特征图。最终,我们将所有输入子块中的特征映射依次拼接在一起并发送至另一层1×1滤波器以重构最终的特征表示。此外,我们还构建了一个名为HS-ResNet的新网络架构,该架构由多个分层分割模块构成。与传统的Res2Net结构[9]相比,HS-ResNet旨在避免提取和存储过多冗余信息的同时仍能有效学习丰富的层次化表征

主要贡献:
- 我们提出了一种新颖的分层分割块 ,其中包含多尺度特征 。分层分割块非常有效,并且可以保持与标准卷积相似的参数数量和计算成本 。分层分割块非常灵活且可扩展,为计算机视觉的众多任务打开了各种网络体系结构的大门。
- 我们提出了一种用于图像分类任务的网络体系结构,该体系结构的性能明显优于基线模型。此外,它们在参数数量和计算成本方面是有效的,并且平均优于其他更复杂的体系结构。
- 我们发现,利用HS-ResNet主干的模型能够在几个任务上实现最先进的性能,即: 图像分类 [17],对象检测 [26],实例分割 [11] 和语义分割 [3]。
相关工作
为了增强模型的功能,在当前的研究中多采用两种不同的技术路线。一类是以人工设计为基础的CNN结构,另一类则是利用神经架构搜索(NAS)的方法进行优化。
人工设计的CNN架构
VGG[30]提出了一种简单而有效的策略来构建非常深的网络:通过堆叠相同维度的模块来构建网络。GoogLeNet[31]通过一个基础模块开始构建网络:该模块包含了四个并行的操作:1×1卷积、3×3卷积、5×5卷积以及最大池化操作。这些操作的输出被串联起来并传递到下一层进行处理。ResNeXt[36]提出了基元的概念:该概念由组卷积操作构成,并认为相比于仅增加网络深度或宽度,在保持较深较宽的同时提升性能更为有效。SE-Net[15]通过自适应地调整通道响应机制引入了通道注意力机制以改进特征响应能力。SK-Net[20]在两个分支中引起了关注机制在特征图上的作用:这种设计有助于在不同分支中实现信息的有效传递与融合。Res2Net[9]在多尺度特征表示方面进行了深入优化:它采用金字塔卷积架构(包含9×9、7×7、5×5、3×3四种尺寸的不同内核)以捕捉多层次的空间关系和细节特征。这种设计使得模型能够更好地处理不同尺度的信息并提取多方位的特征描述。随后提出的ResNeSt架构进一步提升了多尺度表示能力:它在每个网络块中整合了基于特征图拆分注意力的各种信息流路径从而实现了对深层特征空间的有效建模与捕捉。
神经架构搜索
随着GPU硬件的发展, 神经网络架构搜索(NAS)的主要关注点已从基于手动设计的手势转向针对特定任务的自适应系统搜索模式 。现有大部分NAS生成网络采用了与MobileNetV2类似的架构, 包括EfficientNet [444], MobileNetV3[14], FBNet[35], DNANet[18], OFANet[2]等前沿模型。研究者[34]提出了一种在单层中整合不同内核尺寸深度卷积的技术, 该方法通过混合机制实现了更好的计算效率 。然而, 当前主流 NAS 方法仍受限于人工设计的基础模块, 如瓶颈 [12] 和反向块 [27]等基本组件 。因此, 我们的创新性工作不仅能够扩展神经架构搜索的空间, 并且可能带来性能提升的效果, 这一发现值得在未来的深入研究中进一步探讨 。
方法
分层分割块
如图2所示的分层分割块架构中,在经过1×1卷积操作后,我们将特征图划分为s组,并以xi表示各组特征。每组均具有相同的宽度参数w作为通道宽度设置。随后将每个xi输入至3×3卷积操作中得到输出特征图yi。创新性的思路在于将yi划分为两个子组yi,1和yi,2分别处理。其中 yi,2 与前一组 xi 连接并输入到 Fi-1() 中进行处理。在完成所有输入特征组的操作后,通过整合所有 yi,1 的输出恢复通道维度,并保证每个 yi,1 具备独特的通道特性。值得注意的是较大的s值对应更强的多尺度处理能力而较大的w值则意味着更丰富的特征表达能力。为了在hs-resnet模型中平衡参数规模与计算复杂度我们通过调节w和s来实现这一目标

拆分和连接操作
该模块分为两步:分割与连接。其中第一部分是一个分割过程:它将整合后的输入图像x划分为独立组xi,并确保每组具有相同的宽度特性。随后进入第二步处理流程:一个拆分过程将其余备选图像 yi 分解为两个子模块 y_{i,1} 和 y_{i,2}。需要注意的是,在 yi 宽度分布不均的情况下(即各通道权重差异显著),其对应的子模块 y_{i,1} 和 y_{i,2} 也会相应地呈现出不同的尺寸比例关系。此外在设计思路方面我们参考了 GhostNet[10] 的工作原理:具体而言在本方案中:y_{i,1} 的身份映射环节旨在保留原始图像中的核心信息;而 y_{i,2} 则主要用于提取更加细致的情感或细节元素
本研究旨在通过整合yi-1,2与xi来扩大通信带宽,并促进不同组之间的信息交互。本研究的第二个串行模块仅对所有yi,1进行整合处理,并将处理后的结果作为输入进入单通道卷积层。研究表明,在Res2Net架构中使用求和操作的效果不如我们的串行模块(文献[9])。值得注意的是,求和操作可能导致特征表示的改变甚至破坏,而串行模块能够有效保留整体特征表示。
复杂性分析
在该研究中,作者主要对模型复杂度展开分析,其核心在于对比不同模型之间的参数规模差异.然而,在缺乏具体对比对象的情况下,这一问题尚不明确.

import torch
import torch.nn as nn
class HSBlock(nn.Module):
'''
替代3x3卷积
'''
def __init__(self, in_ch, s=8):
'''
特征大小不改变
:param in_ch: 输入通道
:param s: 分组数
'''
super(HSBlock, self).__init__()
self.s = s
self.module_list = nn.ModuleList()
in_ch_range=torch.Tensor(in_ch)
in_ch_list = list(in_ch_range.chunk(chunks=self.s, dim=0))
self.module_list.append(nn.Sequential())
channel_nums = []
for i in range(1,len(in_ch_list)):
if i == 1:
channels = len(in_ch_list[i])
else:
random_tensor = torch.Tensor(channel_nums[i-2])
_, pre_ch = random_tensor.chunk(chunks=2, dim=0)
channels= len(pre_ch)+len(in_ch_list[i])
channel_nums.append(channels)
self.module_list.append(self.conv_bn_relu(in_ch=channels, out_ch=channels))
self.initialize_weights()
def conv_bn_relu(self, in_ch, out_ch, kernel_size=3, stride=1, padding=1):
conv_bn_relu = nn.Sequential(
nn.Conv2d(in_ch, out_ch, kernel_size, stride, padding),
nn.BatchNorm2d(out_ch),
nn.ReLU(inplace=True)
)
return conv_bn_relu
def initialize_weights(self):
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
if m.bias is not None:
m.bias.data.zero_()
elif isinstance(m, nn.BatchNorm2d):
m.weight.data.fill_(1)
m.bias.data.zero_()
elif isinstance(m, nn.Linear):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
if m.bias is not None:
m.bias.data.zero_()
def forward(self, x):
x = list(x.chunk(chunks=self.s, dim=1))
for i in range(1, len(self.module_list)):
y = self.module_list[i](x[i])
if i == len(self.module_list) - 1:
x[0] = torch.cat((x[0], y), 1)
else:
y1, y2 = y.chunk(chunks=2, dim=1)
x[0] = torch.cat((x[0], y1), 1)
x[i + 1] = torch.cat((x[i + 1], y2), 1)
return x[0]
参考文献:
该文章探讨了H Skip ResNet在知乎平台上的应用情况(知乎官网)。
学术界探讨的深度学习模型HS-ResNet在论文阅读分享中得到广泛应用
High-Speed ResNet/ hs_block.py在main文件夹下·bobo0810的High-Speed ResNet (github.com)
