https://arxiv.org/pdf/1602.07360.pdf
本文提出SqeezeNet。它在ImageNet上实现了和AlexNet相同的正确率,但是只使用了1/50的参数。更进一步,使用模型压缩技术,可以将SqueezeNet压缩到0.5MB,这是AlexNet的1/510。
1.提高分布式训练的效率:
对于分布式数据并行训练,通信开销与模型中的参数数量成正比。所以服务器之间的通信是分布式CNN训练的可扩展性的限制因素。因为是轻量化模型,训练过程中的沟通更少,数据量更少,训练更快。
2.小模型导出到客户端的开销更少:
较小的模型需要较少的通信,使频繁更新更可行。
3.更可行的FPGA和嵌入式部署:
FPGA通常具有小于10MB的片上存储器并且没有片外存储器,足够小的模型可以直接存储在芯片上。
1.模型压缩的探索过程
压缩的目的:
减小参数的同时保证一定的精度。
一种方法是使用现有的CNN模型并有损压缩它。主要方式有模型奇异值分解(SVD),网络剪枝,深度压缩、硬件加速器。
2.神经网络空间设计的探索
神经网络(包括深度卷积神经网络)具有大的设计空间,具有用于微架构,宏架构,解算器和其它超参数的许多选项。
通常进行设计空间探索的方法有:
(1)贝叶斯优化
(2)模拟退火
(3)随机搜索
(4)遗传算法
3.squeezeNet设计过程:
结构设计策略:
1.使用1*1滤波器代替3*3滤波器,1x1滤波器具有比3x3滤波器少9倍的参数。
2.将输入到3x3过滤器的通道的数量减少。考虑一个完全由3x3滤波器组成的卷积层。该层中的参数的总量是(输入通道的数量)∗(滤波器的数量)∗(3 * 3)。 因此,为了在CNN中保持小的参数总数,不仅要减少3×3滤波器的数量(见上面的策略1),而且要减少3×3滤波器的输入通道的数量。我们使用挤压层将输入到3x3个过滤器的通道数量减少。
3.在网络后期降采样(将欠采样操作延后),以使卷积层具有大的激活图.更大的激活图保留了更多的信息,可以提供更高的分类准确率 .(可以在参数数量受限的情况下提高准确率)
Fire模块的构建:
其中包括:挤压卷积层(1*1滤波器)、扩展层(1*1和3*3卷积的混合)。我们在Fire模块中公开了三个可调整维度(超级参数):s1X1,e1X1和e3X3。在Fire模块中,s1X1是挤压层(所有1x1)中的滤波器数,e1X1是扩展层中1x1滤波器的数量,e3X3是扩展层中的3x3滤波器的数量。当我们使用Fire模块时,我们将s1X1设置为小于(e1X1 + e3X3)。
SqueezeNet结构:
SqueezeNet开始于一个独立的卷积层(conv1),然后是8个fire模块(fire2-9),最后是一个最终的转换层(conv10)。 我们从网络的开始到结束逐渐增加每个fire模块的过滤器数量。polling安排尽量靠后,所以 SqueezeNet在层conv1,fire4,fire8和conv10之后以步长为2来执行max-pooling。如图是SqueezeNet架构的宏体系结构视图。 左:SqueezeNet; 中间:SqueezeNet与简单的旁路; 右:具有复杂旁路的SqueezeNet。
1.Fire的扩展块中,1*1卷积核3*3卷积块输出特征图维度的保证。为了使来自1x1和3x3滤波器的输出激活具有相同的高度和宽度,我们在输入数据中向扩展模块的3x3滤波器添加零填充的1像素边界。
2.激活函数选用Relu
3.在fire9模块之后应用比率为50%的dropout
4.去掉全连接层
SqueezeNet体系结构尺寸:
基于SVD的方法能够将预训练的AlexNet模型压缩5倍,同时将顶1精度降低到56.0%(Denton等人,2014)。网络修剪实现了9倍的模型大小减少,同时在ImageNet上保持了57.2%的top-1和80.3%的top-5精度的基线(Han et al。,2015b)。深度压缩使模型尺寸减小了35倍,同时仍然保持了基线精度水平(Han 等人,2015a)。现在,使用SqueezeNet,与AlexNet相比,我们实现了模型尺寸减少50倍,同时满足或超过了AlexNet的top-1和前top-5的精度。
即使使用未压缩的32位值来表示模型,SqueezeNet具有比模型压缩社区的最好结果小1.4倍的模型大小,同时保持或超过基线精度。
SqueezeNet模型适合被压缩:
我们使用33%稀疏度和8-bits,对SqueezeNet应用深度压缩(Han等,2015a)。 这产生了与AlexNet相当的精度的0.66MB模型(363×小于32位AlexNet)。此外,在SqueezeNet上应用具有6-bits和33%稀疏性的深度压缩,我们产生具有等效精度的0.47MB型号(510x小于32位AlexNet)。
总之:通过将CNN架构创新(SqueezeNet)与最先进的压缩技术(深度压缩)相结合,我们实现了模型尺寸减少510×,与基准相比精度没有降低。
上图分别是SR和3*3滤波器在扩展层比例对模型大小和精度的影响
已有的参数:
s1X1,e1X1和e3X3。 SqueezeNet有8个fire模块,总共24维超参数。
再定义几个参数(为了对SqueezeNet这样样架构的设计空间进行广泛扫描):
1.basee:
CNN中第一个fire模块中的扩展过滤器数
2.pct3X3:
3X3的扩展过滤器的百分比,ei3X3=ei∗pct3X3
3.freq:
Fire module的个数,当经过freq个fire block后,增加扩展过滤器的数量incre,所以,对于某freq个fire某块中的某个fire模块,扩展滤波器的数量为:ei=basee+(incre∗j/freq),由基本定义:ei=ei1X1+ei3X3
4.挤压比SR
范围是0~1,si1X1=SR∗ei,挤压层滤波器个数占扩展层滤波器的比例。
模型的宏观设计空间探索:
之前探索了微架构级别的设计空间(单个fire模块的内容),现在探索宏观层面上关于Fire模块高级连接的设计策略。受ResNet启发,我们也探究旁路结构的作用。
我们探索了三种结构:不加旁路的Squeeze,加简单旁路的Squeeze,和加复杂旁路的Squeeze.
下面的数据可以看书,加旁路对模型确实有效果(必然吧,借鉴了后面的Inception的思想)。
细节:
加旁路只能加一半的fire模块,因为在简单的情况下,输入通道的数量和输出通道的数量必须相同; 因此,只有一半的Fire模块可以具有简单的旁路连接。当不能满足“相同数量的通道”要求时,我们使用复杂的旁路连接,如图所示 在图2的右侧。虽然简单的旁路是“仅有线”,但是我们将复杂旁路定义为包括1x1卷积层的旁路,滤波器的数量等于所需的输出通道的数量。 请注意,复杂的旁路连接会为模型添加额外的参数,而简单的旁路连接则不会。
增加旁路的作用分析:
1.改变模型的正则化程度
2.挤压层性能有限,旁路可以减轻挤压层的信息表示性瓶颈。在SqueezeNet中,挤压比(SR)为0.125,意味着每个挤压层比相应的膨胀层具有8倍少的输出通道。 由于这种严重的维度减小,可以通过挤压层的信息有限。然而,通过添加旁路连接到SqueezeNet,我们打开了信息绕挤压层流动的途径。
欢迎批评指正,讨论学习~
最近在github放了两份分类的代码,分别是用Tensorflow和Pytorch实现的,主要用于深度学习入门,学习Tensorflow和Pytorch搭建网络基本的操作。打算将各网络实现一下放入这两份代码中,有兴趣可以看一看,期待和大家一起维护更新。
代码地址:
Tensorflow实现分类网络
Pytorch实现分类网络