作者丨VincentLee
来源丨晓飞的算法工程笔记
来源链接:https://mp.weixin.qq.com/s/-LAfyLA3U4C27thFlRgDhw
轻量级网络的核心是在尽量保持精度的前提下,从体积和速度两方面对网络进行轻量化改造,本文对轻量级网络进行简述,主要涉及以下网络:
- SqueezeNet系列
- ShuffleNet系列
- MnasNet
- MobileNet系列
- CondenseNet
- ESPNet系列
- ChannelNets
- PeleeNet
- IGC系列
- FBNet系列
- EfficientNet
- GhostNet
- WeightNet
- MicroNet
SqueezeNet系列是比较早期且经典的轻量级网络,SqueezeNet使用Fire模块进行参数压缩,而SqueezeNext则在此基础上加入分离卷积进行改进。虽然SqueezeNet系列不如MobieNet使用广泛,但其架构思想和实验结论还是可以值得借鉴的。
SqueezeNetSqueezeNet是早期开始关注轻量化网络的研究之一,使用Fire模块进行参数压缩。
SqueezeNet的核心模块为Fire模块, 结构如图 1 所示, 输入层先通过squeeze卷积层 卷 积)进行维度压缩,然后通过expand卷积层 卷积和 卷积混合)进行维度扩展。Fire模 块包含 3 个参数, 分别为squeeze层的 卷积核数 , expand层的 卷积核数 和 层的 卷积核数 , 一般
SqueezeNext是SqueezeNet实战升级版,直接和MobileNet对比性能。SqueezeNext全部使用标准卷积,分析实际推理速度,优化的手段集中在网络整体结构的优化。
SqueezeNext的设计沿用残差结构,没有使用当时流行的深度分离卷积,而是直接使用了分离卷积,设计主要基于以下策略:
- Low Rank Filters 低秩分解的核心思想就是将大矩阵分解成多个小矩阵,这里使用CP分解(Canonical Polyadic Decomposition), 将 卷积分解成 和 的分离卷积, 参数量能从 降为。
- Bottleneck Module 参数量与输入输出维度有关,虽然可以使用深度分离卷积来减少计算量,但是深度分离卷积在终端系统的计算并不高效。因此采用SqueezeNet的squeeze层进行输入维度的压缩,每个block的开头使用连续两个squeeze层,每层降低1/2维度。
- Fully Connected Layers 在AlexNet中,全连接层的参数占总模型的96%,SqueezeNext使用bottleneck层来降低全连接层的输入维度,从而降低网络参数量。
ShuffleNet系列是轻量级网络中很重要的一个系列,ShuffleNetV1提出了channel shuffle操作,使得网络可以尽情地使用分组卷积来加速,而ShuffleNetV2则推倒V1的大部分设计,从实际出发,提出channel split操作,在加速网络的同时进行了特征重用,达到了很好的效果。
ShuffleNet V1ShuffleNet的核心在于使用channel shuffle操作弥补分组间的信息交流,使得网络可以尽情使用pointwise分组卷积,不仅可以减少主要的网络计算量,也可以增加卷积的维度。
在目前的一些主流网络中,通常使用pointwise卷积进行维度的降低,从而降低网络的复杂度,但由于输入维度较高,pointwise卷积的开销也是十分巨大的。对于小网络而言,昂贵的pointwise卷积会带来明显的性能下降,比如在ResNext unit中,pointwise卷积占据了93.4%的计算量。为此,论文引入了分组卷积,首先探讨了两种ShuffleNet的实现:
- 图1a是最直接的方法,将所有的操作进行了绝对的维度隔离,但这会导致特定的输出仅关联了很小一部分的输入,阻隔了组间的信息流,降低了表达能力。
- 图1b对输出的维度进行重新分配,首先将每个组的输出分成多个子组,然后将每个子组输入到不同的组中,能够很好地保留组间的信息流。
图1b的思想可以简单地用channel shuffle操作进行实现,如图1c所示, 假设包含 组的卷积 层输出为 维,首先将输出reshape()为 , 然后进行transpose 0 , 最后再flatten()回维。
ShuffleNet V2ShuffleNetV1的pointwise分组卷积以及bottleneck结果均会提高MAC,导致不可忽视的计算损耗。为了达到高性能以及高准确率,关键是在不通过稠密卷积以及过多分组的情况下,获得输入输出一样的大维度卷积。ShuffleNet V2从实践出发,以实际的推理速度为指导,总结出了5条轻量级网络的设计要领,并根据要领提出了ShuffleNetV2,很好地兼顾了准确率和速度,其中channel split操作十分亮眼,将输入特征分成两部分,达到了类似DenseNet的特征重用效果。