一、前言
本文介绍ICLR 2017的SqueezeNet。近些年来深层卷积网络的主要方向集中于提高网络的准确率。而对于相同的正确率,更小的CNN架构可以提供如下优势:
- 在分布式训练中,与服务器通信需求更小;
- 参数更少,从云端下载模型的数据量少;
- 更适合在FPGA等内存受限的设备上部署。
基于这些优点,这篇论文提出了SqueezeNet。它在ImageNet上实现了和AlexNet相同的准确率,但是只使用了AlexNet 的参数。更进一步,使用模型压缩技术,可以将SqueezeNet压缩到0.5M,这是AlexNet的
。
二、SqueezeNet
1、设计思想
1)使用1×1卷积来替代部分的3×3卷积,可以将参数减少为原来的1/9;
2)减少输入通道的数量,这一点通过squeeze层实现,也能减少参数量;
3)将下采样操作延后,可以给卷积层提供更大的特征图:更大的激特征图保留了更多的信息,可以获得更高的分类准确率。
2、Fire Module
Fire Module是SqueezeNet中的基础构建模块,Fire Module如Figure1所示 :
-
squeeze convolution layer: 只使用1x1卷积核; -
expand layer: 使用1x1和3x3卷积核的组合; -
Fire Module有3个可调的超参数:(
squeeze convolution layer中1x1卷积核的个数);(
expand layer中1x1卷积核的个数);(
expand layer中3x3卷积核的个数); - 使用Fire Module的过程中,令
s_{1 \times 1} < e_{1 \times 1} + e_{3 \times 3},这样squeeze layer可以限制输入通道数量。
3、网络结构
SqueezeNet以卷积层conv1开始,接着使用8个Fire modules (fire 2-9),最后以卷积层conv10结束。每个Fire Module中的Filter数量逐渐增加,并且在conv1,fire4,fire8, 和 conv10这几层之后使用步长为2的Max-Pooling,即将池化层放在相对靠后的位置。
如图,左边为原始版本的SqueezeNet,中间为包含简单跳跃连接的改进版本,最右侧为使用复杂跳跃连接的改进版本。更加具体的细节如Table1所示:
参数量的计算过程:
例如我们看fire2这个模块在剪枝前的参数是11920,这个参数是怎么计算得到的呢?fire2之前的maxpool1层的输出是,之后接着的Squeeze层有16个的
卷积filter,注意这里是多通道卷积,为了避免与二维卷积混淆,在卷积尺寸末尾写上了通道数。这一层的输出尺寸为
,之后将输出分别送到expand层中的
(64个)和
(64个)进行处理,注意这里不对16个通道进行切分(就是说这里和MobileNet里面的那种深度可分离卷积不一样,这里就是普通的卷积)。为了得到大小相同的输出,对
的卷积输入进行尺寸为1的zero padding。分别得到
和
的大小相同的特征图。将这两个特征图concat到一起得到
大小的特征图,加上bias参数,这样总参数为
。
其他细节:
- 为了使
和
卷积核输出的特征图尺寸相同,在expand模块中,给
卷积核的原始输入添加一个像素的边界(zero-padding);
- squeeze layer和expand layer都是用ReLU作为激活函数;
- 在fire9模块之后,使用Dropout,比例取50%;
- 注意到SqueezeNet中没有全连接层,这借鉴了Network in Network的思想;
- 训练过程中,初始学习率设置为0.04,,在训练过程中线性衰减学习率。
4、实验结果
SqueezeNet和AlexNet以及其他压缩算法比较的结果如Table2所示:
可以看到,SVD方法能将预训练的AlexNet模型压缩为原来的,top1和top5正确率几乎不变。模型压缩能将AlexNet压缩到原来的
,正确率基本不变。SqueezeNet的压缩倍率可以达到50倍以上,并且准确率还有略微的提升。注意到即使使用float32数值来表示模型参数,SqueezeNet也比之前压缩率最高的模型更小,同时表现更好。如果将模型压缩策略用在SqueezeNet上,使用33%的稀疏表示和int8量化,会得到一个仅有0.66M的模型。进一步,如果使用6比特量化,会得到仅有0.47MB的模型,同时准确率不变。此外,结果表明模型压缩不仅对包含庞大参数参数量的CNN网络起作用,对于较小的网络,例如SqueezeNet也是有用的。将SqueezeNet的网络结构和模型压缩结合起来可以将原模型压缩到
。













网友评论