SqueezeNet

文章:https://arxiv.org/abs/1602.07360
代码:https://github.com/DeepScale/SqueezeNet

SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE

1 摘要

相同准确率的CNN模型,更小的模型具有三点优势:

  • 分布式训练时,更小的模型跨服务器通信更少,训练速度更快;
  • 较小的CNN需要较少的带宽来将新模型从云导出到自动驾驶汽车,可以实现更频繁的模型更新;
  • 较小的CNN更适合部署在FPGA和其他内存有限的硬件上。

作者提出了SqueezeNet,达到了AlexNet级别的准确率但参数只有AlexNet的1/50。结合模型压缩技术,把模型压缩到小于 0.5 MB,是AlexNet的 1/510。

2 相关工作

2.1 模型压缩

作者工作的首要目标是确定一个参数非常少但保持准确性的模型。为了解决这个问题,一个明智的方法是对现有的CNN模型进行有损压缩。事实上,围绕模型压缩这一主题已经出现了一个研究团体并得到了一些研究成果。

Denton等人提出了一种相当简单的方法,将奇异值分解(SVD)应用于预训练的CNN模型;Han等人提出了网络剪枝,将预训练模型中小于指定阈值的参数设为0以得到稀疏矩阵,然后在该稀疏矩阵上执行数次训练过程;Han等人进一步将网络剪枝与量化和霍夫曼编码结合创造了一种叫做深度压缩的方法,并进一步设计了一种叫做EIE的硬件加速器进行模型压缩,实现了大幅度的加索和节能。

2.2 CNN微体系架构

将卷积应用到ANN中至少有25年的历史;LeCun在1980s将CNN应用到手写字符识别;在神经网络中,卷积核通常是3维的,包括宽、高和通道。当将CNN应用到图像处理时,第一层通常是3个通道(RGB),后面层中第 L i L_i Li层的通道数和第 L i − 1 L_{i-1} Li1层的卷积核数目相同。最早LeCun使用了5 * 5的滤波器,最近的VGG中使用 3 * 3滤波器,在NIN网络和GoogleNet族中使用了1 * 1滤波器。

在设计非常庞大的CNN时,为每一层手动选择滤波器是非常笨重的。为了解决这个问题,最近提出了很多由多个包含特定组织的卷积层组成的模块,如GoogleNet中的Inception结构,包含了多个不同维度的滤波器,如1 * 1,1 * 3,3 * 1,3 * 3,5 * 5。

作者使用术语CNN微体系结构来指代各个模块的特定组织和维度

2.3 CNN宏体系结构

作者将CNN宏体系结构定义为多个模块的系统级组织,形成端到端的CNN架构

近年来,研究最多的CNN宏体系结构就是网络深度的影响。VGG中在ImageNet数据集上应用12 - 19层的网络并且证明了网络深度对准确率具有正面的促进作用;ResNet论文中使用超过30层的网络进一步提升了在ImageNet数据集上的分类准确率。

跨多层或模块的连接选择是CNN宏观架构研究的新兴领域。ResNet和Highway Network提出了跨越多层的直连通道,作者将其称之为旁路连接。ResNet中,相比于未添加旁路连接的网络,添加了旁路连接的34层网络在ImageNet数据集上的Top-5准确率提升了2个百分点。

2.4 神经网络设计空间探索

神经网络(包括深度和卷积NN)具有很大的设计空间,有许多微体系结构,宏架构,求解器和其他超参数选项。AI研究人员似乎很自然地想要了解这些因素如何影响NN的准确性。NN的设计空间探索(DSE)的大部分工作都集中在开发自动化方法,以寻找能够提供更高精度的NN架构。这些自动化DSE方法包括贝叶斯优化(Snoek等,2012),模拟退火(Ludermir等,2006),随机搜索(Bergstra&Bengio,2012)和遗传算法(Stanley&Miikkulainen,2002)。值得赞扬的是,这些论文中的每一篇都提供了一种案例,其中所提出的DSE方法产生了NN架构,与代表性基线相比,该架构实现了更高的准确性。然而,这些论文并未试图提供关于NN设计空间形状的直觉。在本文的后面,作者避开了自动化方法, 相反,以这样一种方式重构CNN,即进行有原则的A / B比较,以研究CNN架构决策如何影响模型的大小和准确性。

下文,我们首先提出并评估带有和不带模型压缩的SqueezeNet架构。然后,探讨了微架构和宏体系结构中的设计选择对类似SqueezeNet的CNN架构的影响。

3 SqueezeNet

本节,首先介绍具有更少参数的CNN的设计策略;其次,介绍作者设计的Fire模块;最后,介绍Squeeze网络。

3.1 网络设计策略

作者在本文中的首要目标是设计具有少量参数但保持较高识别准确率的CNN架构。为实现这一目标,作者在设计CNN架构时采用了三种主要策略:

  • 用 1 * 1 卷积核代替 3 * 3 卷积核,这样参数数量会变为原来的1 / 9;
  • 减少输入到3 * 3卷积核的输入通道的数目,假设一个全由3 * 3 卷积核组成的卷积层,该层的参数数量为(输入通道数) * (卷积核个数) * (3 * 3)。所以,为了减少网络的参数数量,不仅需要将 3 * 3的卷积核变为 1 * 1 的卷积核,同时也需要减少和3 * 3的卷积核相关的输入通道的数目。作者在本文中使用squeeze层减少和3 * 3卷积核相连的输入通道的数目;
  • 在网络后期进行下采样,以便卷积层具有更大的激活映射,CNN中,每一个卷积层的激活映射由输入图像大小、CNN中哪些层进行下采样决定。最常见的是,通过在某些卷积或池化层中设置(stride> 1),将下采样设计到CNN体系结构中。如果网络中的早期层具有较大的步幅,则大多数层将具有小的激活映射。相反,如果网络中的大多数层的步幅为1,并且大于1的步幅集中在网络的末端,则网络中的许多层将具有大的激活图。我们的直觉是,在其他所有都保持相同时,大型激活图(由于延迟的下采样)可以导致更高的分类准确性。实际上,K.He和H. Sun将延迟下采样应用于四种不同的CNN架构,并且在每种情况下延迟下采样都导致了更高的分类准确度。

上述策略1和策略2都是尝试在保持准确率的情况下减少CNN中的参数数量,策略3则是在有限参数数量下尽可能最大化识别准确率。

3.2 Fire模块

在这里插入图片描述
Fire模块由一个squeeze卷积层(只包含1 * 1卷积核)和一个expand层(包含1 * 1和3 * 3卷积核)组成。之所以使用1 * 1卷积核是基于3.1节中的策略1。在fire模块中有三个可调的超参数,分别是 s 1 x 1 , e 1 x 1 , e 3 x 3 s_{1x1},e_{1x1},e_{3x3} s1x1,e1x1,e3x3,分别表示squeeze层中 1 * 1卷积核的数量和expand层中 1 * 1 及 3 * 3卷积核的数量。在Fire模块中, s 1 x 1 &lt; ( e 1 x 1 + e 3 x 3 ) s_{1x1} &lt; (e_{1x1}+e_{3x3}) s1x1<(e1x1+e3x3),所以squeeze层帮助减少了 3 * 3 卷积核的输入通道的数量,符合3.1节中策略2的思想。

3.3 SqueezeNet结构

在这里插入图片描述上图最左侧为原始的SqueezeNet结构,一个单独的卷积层Conv1后连接了8个Fire模块,最后有一个卷积层Conv10。从起始层到最后逐步增加Fire模块中卷积核的数量。在conv1、fire4、fire8和conv10之后使用了stride为2的最大池化。这种把池化放入相对靠后的层的思想符合第3.1节的策略3。

3.3.1 SqueezeNet其他细节

在这里插入图片描述

  • 对使用3 * 3卷积核的输入添加了边界为1的zero-padding,这样1 * 1和3 * 3的卷积核具有相同的输出宽高;
  • 在squeeze和expand层后使用了ReLU激活函数;
  • 在fire9之后使用了比例为0.5的dropout;
  • 没有使用全连接层,而是使用了NIN中提出的平均池化层;
  • 训练网络时的初始学习率为0.04,训练过程中准不减小学习率,具体细节可以参考https://github.com/DeepScale/SqueezeNet;
  • Caffe默认不支持一个卷积层包含两种不同大小的卷积核(1 * 1 和 3 * 3),作者实现了两个卷积层,分别包含1 * 1和3 * 3的卷积核,然后将两个卷积层的输出在channel通道连接起来以实现和expand层同样的效果;
  • 目前squeezenet在mxnet,chainer,keras,torch中都有实现。

4 SqueezeNet效果评估

在这里插入图片描述AlexNet在ImageNet上的Top-1和Top-5准确率分别为57.2%和80.3%,模型大小是240MB;

应用SVD、剪枝和深度压缩三种模型压缩技术,其中深度压缩技术效果最好,在保持准确率不变的情况下,模型大小变为了原来的1 / 35,仅为6.9MB;

但是基准未压缩的SqueezeNet网络模型大小仅为4.8MB,在ImageNet数据集上的Top-1和Top-5准确率分别为57.5%和80.3%,达到和超过了AlexNet的效果;

实验结果表明作者设计的未压缩的SqueezeNet超过了最好的模型压缩的效果。作者进一步对SqueezeNet的模型进行了压缩,应用深度压缩技术压缩到了8 bit或6 bit,在保持识别准确率的情况下把模型大小压缩到了0.66MB和0.47MB。证明了小的SqueezeNet模型依然可以进一步压缩。

最后,请注意,Deep Compression(Han et al.,2015b)使用码本作为其方案的一部分,用于将CNN参数量化为6位或8位精度。因此,在大多数商品处理器上,使用深度压缩中开发的方案,使用8位量化或使用6位量化实现32/8 = 4x或32/6 = 5.3x的加速并非易事。但是,Han等人开发的定制硬件 - 高效推理引擎(EIE) - 可以更有效地计算码本量化的CNN。此外,在我们发布SqueezeNet后的几个月里,P.Gysel开发了一种名为Ristretto的策略,用于将SqueezeNet线性量化为8位。具体来说,Ristretto以8位进行计算,并以8位数据类型存储参数和激活。在SqueezeNet推理中使用Ristretto策略进行8位计算,Gysel在使用8位而不是32位数据类型时观察到精度下降不到1个百分点。

5 CNN微观设计空间探索

到目前为止,我们已经为小型模型提出了架构设计策略,遵循这些原则来创建SqueezeNet,并发现SqueezeNet比AlexNet小50倍,具有相同的精度。然而,SqueezeNet和其他模型存在于CNN架构的广泛且基本上未开发的设计空间中。现在,在第5节和第6节中,我们将探讨设计空间的几个方面。我们将这种架构探索分为两个主题:微体系结构探索(每个模块层维度和配置)和宏架构探索(模块和其他层的高级端到端组织)。

在本节中,我们设计并执行实验,目的是根据我们在3.1节中提出的设计策略,提供关于微架构设计空间形状的直觉。请注意,我们的目标不是在每个实验中最大限度地提高准确性,而是要了解CNN架构选择对模型大小和准确性的影响。

5.1 CNN微架构参数

在SqueezeNet中,每个Fire模块都有我们在3.2中定义的三个超参数: s 1 x 1 , e 1 x 1 , e 3 x 3 s_{1x1},e_{1x1},e_{3x3} s1x1,e1x1,e3x3。SqueezeNet有8个Fire模块,共有24个超参数。为了对SqueezeNet式架构的设计空间进行广泛扫描,我们定义了以下一组更高级别的元参数,它们控制着CNN中所有Fire模块的维度。

定义参数 b a s e e base_e basee为第一个Fire模块中expand卷积核的数量;

在每freq个 Fire模块之后,扩充 i n c r e incr_e incre个expand滤波器,因此,对第 i i i个Fire模块,expand滤波器的数量是 e i = b a s e e + ( i n c r e ∗ ⌊ i f r e q ⌋ ) e_i = base_e + (incr_e * \lfloor \frac{i}{freq}\rfloor) ei=basee+(increfreqi)

每一个expand层,既有 1 * 1的卷积核,也有 3 * 3的卷积核,因此定义 e i = e i , 1 x 1 + e i , 3 x 3 e_i = e_{i,1x1} + e_{i,3x3} ei=ei,1x1+ei,3x3,定义 p c t 3 x 3 pct_{3x3} pct3x3为在expand层中3 * 3卷积核所占的比例。因此有, e i , 3 x 3 = e i ∗ p c t 3 x 3 , e i , 1 ∗ 1 = e i ∗ ( 1 − p c t 3 x 3 ) e_{i,3x3} = e_i * pct_{3x3},e_{i,1*1}=e_i * (1 - pct_{3x3}) ei,3x3=eipct3x3,ei,11=ei(1pct3x3)

定义参数squeeze ration(SR)为单个Fire模块中squeeze层的卷积核占该Fire模块中expand层的卷积核数量的比例。因此有, s i , 1 x 1 = S R ∗ e i = S R ∗ ( e i , 1 x 1 + e i , 3 x 3 ) s_{i,1x1}=SR * e_i = SR * (e_{i,1x1} + e_{i,3x3}) si,1x1=SRei=SR(ei,1x1+ei,3x3)。 表1中所示的squeezenet的参数为: b a s e e = 128 , i n c r e = 128 , p c t 3 x 3 = 0.5 , f r e q = 2 , S R = 0.125 base_e = 128,incr_e = 128,pct_{3x3} = 0.5,freq = 2,SR = 0.125 basee=128,incre=128,pct3x3=0.5,freq=2,SR=0.125

5.2 SR

在3.1节中,我们建议通过使用挤压层来减少参数数量,以减少输入到3x3滤波器的通道数量。我们将SR定义为squeeze层中的卷积核数量与expand层中的卷积核数量之间的比率。现在设计一个实验来研究SR大小对模型尺寸和精度的影响。

以Figure2中最左侧的模型为起点,设置 b a s e e = 128 , i n c r e = 128 , p c t 3 x 3 = 0.5 , f r e q = 2 base_e = 128,incr_e = 128,pct_{3x3} = 0.5,freq = 2 basee=128,incre=128,pct3x3=0.5,freq=2 S R SR SR取值范围为[0.125,1],从头训练多个具有不同SR值得squeezenet。不同模型得准确率如下图左图所示:

在这里插入图片描述
如上图左图所示,从0.125开始增加SR到0.75可以有效地将Top-5准确率从80.3%提升到86%,同时模型大小也从4.8MB增加到了19MB。SR进一步从0.75增加到1并没有进一步提升准确率。

5.3 1 * 1和3 * 3卷积核的trade-off

在3.1节中,我们建议通过用1x1卷积核替换一些3x3卷积核来减少CNN中的参数数量。一个悬而未决的问题是,CNN中卷积核的空间分辨率有多重要?

VGG(Simonyan&Zisserman,2014)架构在大多数层的卷积核中具有3x3空间分辨率; GoogLeNet(Szegedy等,2014)和Network-in-Network(NiN)(Lin等,2013)在某些层中具有1x1卷积核。在GoogLeNet和NiN中,作者只是提出了一定数量的1x1和3x3卷积核并没有进一步分析。在这里,我们试图阐明1x1和3x3卷积核的比例如何影响模型的大小和精度。

使用下面的超参数开始实验, b a s e e = 128 , i n c r e = 128 , f r e q = 2 , S R = 0.5 base_e = 128,incr_e = 128,freq = 2,SR=0.5 basee=128,incre=128,freq=2,SR=0.5 p c t 3 x 3 ∈ [ 0.01 , 0.99 ] pct_{3x3} \in [0.01,0.99] pct3x3[0.01,0.99],不同 p c t 3 x 3 pct_{3x3} pct3x3参数下模型的准确率和大小如Fig 3(b)所示。使用50%的3 * 3卷积核时模型大小为13MB,准确率为85.6%,进一步增加3 * 3卷积核所占的比例增加了模型的大小,但并没有增加模型的准确率。

6 CNN宏观设计空间探索

受ResNet的启发,作者设计了三种不同的宏观结构,如Fig 2所示:

  • Vanilla SqueezeNet(原始的SqueezeNet);
  • 在SqueezeNet的一些Fire模块之间添加简单的直连通道;
  • 在第二种方式的基础上,剩下的Fire模块之间添加复杂直连通道。

我们的简单旁路架构在第3,5,7,9个Fire模块上增加了旁路连接,要求这些模块学习输入和输出之间的残差函数。与在ResNet中一样,要在Fire 3上实现旁路连接,我们将Fire 4的输入设置为(Fire2的输出+ Fire3的输出),其中+运算符表示逐元素相加。这改变了应用于这些Fire模块的参数的正则化,并且根据ResNet,可以提高训练整个模型的最终准确度或能力。

一个限制是,在简单的情况下,输入通道的数量和输出通道的数量必须相同;因此,只有一半的Fire模块可以具有简单的旁路连接,如Fig 2中间的图所示。当无法满足“相同数量的通道”要求时,我们使用复杂的旁路连接,如Fig 2右侧所示。虽然简单的旁路“只是一根导线”,但我们将复杂的旁路定义为旁路,其中包括1x1卷积层,其卷积核数量设置为所需的输出通道数量。请注意,复杂的旁路连接会为模型添加额外的参数,而简单的旁路连接则不会。

除了改变正则化之外,我们直观地认为添加旁路连接有助于缓解squeeze层引入的代表性瓶颈。在SqueezeNet中,挤压比(SR)为0.125,这意味着每个squeeze层的输出通道比伴随的expand层少8倍。由于这种严重的维数降低,只有少量的信息可以通过squeeze层。但是,通过向SqueezeNet添加旁路连接,我们开辟了在squeeze层周围传递信息的途径。

三个不同的宏架构中都使用Tabel 1所示的微架构,三个模型的大小和准确率如下图所示:
在这里插入图片描述复杂而简单的旁路连接均比vanilla SqueezeNet架构提高了精度。有趣的是,与复杂旁路相比,简单旁路具有更高的准确度。使用简单旁路,在未增加参数数量的情况下,将模型的Top-1准确率提升了2.9个百分点,将Top-5准确率提升了2.2个百分点。

7 结论

在本文中,我们提出了一种更加规范的卷积神经网络设计空间探索方法的步骤。为实现这一目标,我们推出了SqueezeNet,这是一种CNN架构,其参数比AlexNet少50倍,并在ImageNet上保持AlexNet级精度。我们还在未损失精度的情况下将SqueezeNet压缩到小于0.5MB,比没有压缩的AlexNet小510倍。自从我们在2016年发布本文作为技术报告以来,Song Han和他的合作者已经对SqueezeNet和模型压缩进行了进一步的实验。使用称为密集稀疏密集(DSD)的新方法(Han et al.,2016b),Han et al在训练期间使用模型压缩作为正则化器,以进一步提高准确度,生成一组压缩的SqueezeNet参数,在ImageNet-1k上将准确率提升了1.2个百分点,并且还生成一组未压缩的SqueezeNet参数,与表2中的结果相比,准确度高4.3个百分点。

我们在本文开头提到,小型模型更适合FPGA上的片上实现。自从我们发布SqueezeNet模型以来,Gschwend开发了SqueezeNet的变体并在FPGA上实现(Gschwend,2016)。正如我们所预料的那样,Gschwend能够将类似SqueezeNet的模型的参数完全存储在FPGA中,并且无需片外存储器访问来加载模型参数。

在本文的上下文中,我们将ImageNet作为目标数据集。然而,将ImageNet训练的CNN表示应用于各种应用,例如细粒度物体识别(Zhang et al.,2013; Donahue et al.,2013),图像中的标识识别以及并产生关于图像的句子(图像内容描述)。预训练的ImageNet CNN模型也已应用于许多与自动驾驶相关的应用,包括图像和视频中的行人和车辆检测,以及分割道路的形状。我们认为SqueezeNet将成为适用于各种应用的良好候选CNN架构,尤其是适用于那些模型大小非常重要的应用场景。

SqueezeNet是我们在广泛探索CNN架构设计空间时发现的几个新CNN之一。我们希望SqueezeNet能够激发读者思考和探索CNN架构设计领域的广泛可能性,并以更系统的方式进行探索。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值