论文:SqueezeNext: Hardware-Aware Neural Network Design
Github:https://github.com/amirgholami/SqueezeNext
BLOCK模块对比:
如上图所示,
第一个为ResNet 的BLOCK模块
第二个为SqueezeNet 的BLOCK模块,也就是所谓的Fire Module
第三个为SqueezeNext的BLOCK模块
SqueezeNext BLOCK模块设计:
假设输入为c个通道,经过第一个1*1卷积模块,通道数减半,经过第二个1*1卷积模块,通道数再次减半,然后经过3*1卷积模块通道数加倍,经过1*3卷积模块通道数保持不变,再经过一个1*1卷积模块,通道数加倍。最终输入通道数和输出通道数保持一致。
该模块主要包含3个改进点:
(1)Low Rank Filters :
主要将K*K的卷积替换为1*K+K*1的卷积。从而使得参数量由K2降为2K。
(2)Bottleneck Module :
瓶颈模块,类似于SqueezeNet 中Fire Module里面的squeeze模块。但是和而不同,SqueezeNet 中Fire Module里面只堆叠了一个squeeze模块,而SqueezeNext 中连续堆叠2个该模块,每经过一个瓶颈模块,通道数都减半。
(3)Fully Connected Layers :
全连接层的参数为H × W × Ci × L ,其中L表示分类的数目,H,W,C分别表示最后一层的高,宽,通道数。为了减少这部分的参数量,SqueezeNext 使用了1*1的卷积模块,将最后一层的通道数进行了4倍量的压缩,再接入全连接层,以此来减少参数量。
如上图所示,通过增加黑框中的模块,达到了全连接层参数量的降低。
网络结构:
SqueezeNext 一共包含23层(包括全连接层),主体网络结构分为了SqNxt-23和SqNxt-23v5这两种结构。
两种结构的区别在于,
Network | Depth | Width | channel-wise(group) |
1.0-G-SqNxt-23 | [6; 6; 8; 1] | 1.0x | 2 |
1.0-SqNxt-23 | [6; 6; 8; 1] | 1.0x | 1 |
1.0-SqNxt-23v5 | [2; 4; 14; 1] | 1.0x | 1 |
2.0-SqNxt-23 | [6; 6; 8; 1] | 2.0x | 1 |
2.0-SqNxt-23v5 | [2; 4; 14; 1] | 2.0x | 1 |
1.0和2.0的区别在于通道数加倍
传统和v5的区别在于网络结构Depth的区别
带G表示使用了depth-wise conv,不带的表示为传统的卷积。
结果:
从参数量上看,SqNxt的1.0版本网络比原始的SqueezeNet更少,精度更高。
SqNxt的2.0版本比MobileNet的参数更少,精度上TOP-1略低,TOP-5有较大提升。
从能量消耗,推断时间,准确性上,也可以看出SqNxt具有明显的优势。
总结:
SqNxt,一个运算量和效果都优于SqueezeNet的改进版。