前言
这是卷积神经网络学习路线的第16篇文章,介绍ICLR 2017的SqueezeNet。近些年来深层卷积网络的主要方向集中于提高网络的准确率。而对于相同的正确率,更小的CNN架构可以提供如下优势:(1)在分布式训练中,与服务器通信需求更小。(2)参数更少,从云端下载模型的数据量少。(3)更适合在FPGA等内存受限的设备上部署。基于这些优点,这篇论文提出了SqueezeNet。它在ImageNet上实现了和AlexNet相同的准确率,但是只使用了AlexNet
的参数。更进一步,使用模型压缩技术,可以将SqueezeNet压缩到
0.5
M,这是AlexNet的
。
SqueezeNet细节
结构设计技巧
-
-
(2)减少输入通道数量:这一部分使用
squeeze
层来实现。
-
(3)将下采样操作延后,可以给卷积层提供更大的特征图:更大的激特征图保留了更多的信息,可以获得更高的分类准确率
-
其中,(1)和(2)可以显著减少参数数量,(3)可以在参数数量受限的情况下提高准确率。
FIRE MODULE
Fire Module是SqueezeNet中的基础构建模块,Fire Module如Figure1所示 :
-
squeeze convolution layer
:只使用
卷积核,即上面提到的策略(1)。
-
expand layer
:使用
和
卷积核的组合。
-
Fire module中有
3
个可调的超参数:
(
squeeze convolution layer
中
卷积核的个数),
(
expand layer
中
卷积核的个数),
(
expand layer
中
卷积核的个数)
-
使用Fire Module的过程中,令
,这样
squeeze layer
可以限制输入通道数量,即
结构设计技巧
提到的技巧(2)。
网络结构
SqueezeNet以卷积层
conv1
开始,接着使用
8
个
Fire modules
(
fire 2-9
),最后以卷积层
conv10
结束。每个Fire Module中的
Filter
数量逐渐增加,并且在
conv1
,
fire4
,
fire8
, 和
conv10
这几层之后使用步长为2的
Max-Pooling
,即将池化层放在相对靠后的位置,这使用了以上的策略(3)。
如图,左边为原始版本的SqueezeNet,中间为包含简单跳跃连接的改进版本,最右侧为使用复杂跳跃连接的改进版本。更加具体的细节如Table1所示:
这里有一些细节,例如我们看
fire2
这个模块在剪枝前的参数是
11920
,这个参数是怎么计算得到的呢?
fire2
之前的
maxpool1
层的输出是
,之后接着的
Squeeze
层有
16
个
的卷积filter,注意这里是多通道卷积,为了避免与二维卷积混淆,在卷积尺寸末尾写上了通道数。这一层的输出尺寸为
,之后将输出分别送到expand层中的
(64个)和
(64个)进行处理,注意这里不对16个通道进行切分(就是说这里和
MobileNet
里面的那种深度可分离卷积不一样,这里就是普通的卷积)。为了得到大小相同的输出,对
的卷积输入进行尺寸为
1
的
zero padding
。分别得到
和
的大小相同的特征图。将这两个特征图
concat
到一起得到
大小的特征图,加上
bias
参数,这样总参数为。