轻量化神经网络(1):SqueezeNet

论文:SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size

    SqueezeNet追求的是在最少的参数量、最少的运算量即模型最小size下的高效神经网络,其性能可以达到State_of_art的效果。

1. 小网络的优势

  • 更有效的分布式训练
  • 部署到新的终端时更少的开销
  • 对硬件十分友好,易于FPGA或者ASIC形式的硬件实现

2. SqueezeNet为实现更少的模型参数所提出的策略

  • 将3x3卷积用1*1卷积替换掉
  • 减少3*3卷积的输入通道数
  • 下采样的位置尽量往网络模型后部分靠,以使网络的卷积层获得尽可能大的feature map(作者说是一种直觉,Our intuition is that large activation maps (due to delayed downsampling) can lead to higher classification accuracy, with all else held equal. )

所以,提出SqueezeNet的基本Module,如下

3. Fire module

轻量化神经网络(1):SqueezeNet
  作者根据提到的减少参数量的思路设计了Fire Module,Fire Module包括squeeze层和expand层。顾名思义,squeeze就是来压缩通道数的,以便竟如expand层的输入可以有更少的输入通道,从而减少参数量;而expand再将通道数扩张,expand包括了1x1的滤波器和3x3的滤波器,将两者的输出Concat在一起作为下一个Module的输入,3x3卷积是加了zero_padding=1,stride=1刚好是的feature map的大小没有变。expand采用了两种滤波器应该是借鉴了Inception系列网络的思想,进行多特征的融合以提高网络的精度。Fire Module引入了三个参数s1、e1、e3,即squeeze层的1x1滤波器的数量和expand层的1x1滤波器和3x3滤波器的数量,文章在后面以这三个参数实验了对于CNN网络微架构的一些思考,后面再详述。

4. SqueezeNet网络结构

  网络结构图示如下:
轻量化神经网络(1):SqueezeNet
  左图是没有Shortcut连接的网络结构,中间是加简单的Shorcut连接的SqueezeNet,右边是加复杂Shortcut(complex bypass)的模型。网络在conv1、fire4,fire8和conv10后加了stride为2的max-pooling层进行下采样。在conv10后进行Global avgpool生成一维向量进行Softmax回归分类。
  文章还给了多种框架实现SqueezNet的代码链接。

5. SqueezeNet在ILSVRC2012上的结果

轻量化神经网络(1):SqueezeNet
  文章标题SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size,model size小于0.5MB是因为采用的韩松等人的Deep Compression技术,未压缩的模型大小应该是4.8MB,但是这也相比较于AlexNet小了50倍。从表中看,有意思的是采用Deep Compress对于SqueezeNet进行的8bit和6bit压缩的top1与top5的精度尽然没有一点下降。

5. 作者对于CNN微架构与宏观架构的探索与思考
  • 微架构:前面提到Fir Module定义了三个超参数s1、e1、e3,然后8个Module就有24个超参数。在此部分,定义了SR(squeeze层滤波器数量与expand层所有滤波器总数量)和pct3x3(expand层3x3滤波器数量与expand层滤波器总数的比值),采用特定策略去Sweep搜索,得到如下结果:
    轻量化神经网络(1):SqueezeNet
  • 宏观架构:作者借鉴ResNet网络的Shortcut连接,在基础SqueezeNet网络架构的基础引入了Simple Bypass和Complex Bypass,如前面网络结构部分示意。
    轻量化神经网络(1):SqueezeNet
    可以看到引入ShortCut连接是有用的,ShortCut的连接方式对于网络的性能也有很大影响。

  轻量化网络还有MobileNet,MobileNet v2,ShuffleNet,ShuffleNet v2,后续笔者会进一步学习整理,大家一起共同探讨学习。

PS:笔者后续会整理实现SqueezeNet的相关pytorch代码,请关注