squeezenet 论文阅读

2020-09-08 17:52:17 浏览数 (1)

1 研究背景:

最近对深卷积神经网络 (CNNs) 的研究主要集中在提高计算机视觉数据集的精确度上。对于给定的精度级别, 通常可以用不同的 CNN 体系结构来实现了该精度级别。而具有更少参数的 CNN 体系结构具有以下几个优点:

(1)更高效的分布式训练

(2)向客户端导出新模型时的开销更小

(3)可行的 FPGA 和嵌入式部署

2 相关工作

2.1 模型压缩

奇异值分解 (SVD)

网络修剪

深压缩

【目前对模型压缩的理论以及方法还不熟悉,后续加强此方面学习】

2.2 CNN 微结构

CNNs网络结构越来越深的大趋势下, 手动选择每个层的过滤尺寸变得很麻烦。为了解决这一问题, 提出了由多个卷积层组成的各种更高级别的构建块或模块.然后将许多这样的模块组合起来, 也许还有其他的(ad-hoc)层来组成一个完整的网络. 我们使用CNN 微体系结构【CNN microarchitecture】一词来引用各个模块的特定组织和维度。

2.3 CNN 宏观结构

虽然微体系结构是指单个层和模块, 但我们将CNN macroarchitecture定义为多个模块的系统级组织, 使其成为一个端到端的 CNN 架构。

从Vgg 12层到19层开始,网络层数是热门话题。加深网络层数可获得较高的准确性。

ResNet 残差网络,解决网络加深,性能退化问题。

2.4 网络设计空间探索

神经网络 (包括深度网络和卷积神经网络) 具有很大的设计空间, 比如说microarchitectures、macroarchitectures的设计和其他超参数的选择。神经网络设计空间探索的大部分工作都侧重于开发自动化的方法, 以找到更高精度的神经网络体系结构。这些自动化方法包括贝叶斯优化 (Snoek et, 2012), 模拟退火 (Ludermir 等, 2006), 随机搜索 (Bergstra & Bengio, 2012) 和遗传算法 (Stanley & Miikkulainen, 2002)。值得赞扬的是,每一篇论文都提供了一个案例,在这个案例中,提出的DSE方法产生了一个NN体系结构,与一个具有代表性的基础神经网络相比,它的精确度的确更高。然而, 这些论文并没有试图提供关于神经网络设计空间形状的直觉。在本文的后面, 我们避开了自动化的方法-相反, 我们通过重构 CNNs 的方式, 这样就就可以做A/B的比较, 从而可以探索出CNN 架构是如何影响模型的大小和准确性的。

在下面的章节中, 我们首先提出和评估了 SqueezeNet 网络结构, 并没有模型压缩。然后, 我们探讨了微体系结构宏观体系结构中的设计选择对 SqueezeNet 型 CNN 架构的影响。

3 SQUEEZENET: 使用少量参数保持精度

3.1 结构设计策略

本文的首要目标是确定在保持准确性的同时, 有几个参数的 CNN 架构。为了实现这一点, 我们在设计 CNN 架构时采用了三个主要策略:

策略 1.用1x1 滤镜替换3x3 滤镜。

考虑到一定数量的卷积的预算, 我们将选择大量使用1x1卷积, 因为1x1 卷积的参数比3x3 过滤器少了 9X.

策略 2.减少3x3 卷积输入通道的数量。

假设有一个卷积层, 它完全由3x3 卷积组成。此层中参数的总数量为:(输入通道数) * (过滤器数) * (3 * 3)。因此, 为了在 CNN 中得到更少的参数, 不仅要减少3x3 过滤器的数量 (参见上面的策略 1), 还要减少3x3 卷积中输入通道的数量。我们使用squeeze层将输入通道的数量减少, 在下一节中我们将对其进行描述。

策略 3.在网络中延迟下采样的时间, 以便卷积层具有较大的特征图。

在卷积网络中,每个卷积层输出一个特征图,特征图的宽度和高度由一下内容决定:

(1)输入数据的大小

(2)在CNN 体系结构中缩减像素采样的层的选择

我们的直觉是, 在其他不变的情况下,大的特征图 (由延迟下采样产生) 可以导致更高的分类精度 。的确, K.He和 h. Sun 将延迟下采样率应用到四种不同的 CNN 体系结构中, 在每种情况下, 延迟下采样都会导致分类精度变高 (He& Sun, 2015).【这里所说的下采样应该就是指池化】

策略1和2是关于在尽可能保持模型准确度地情况下减少 CNN 的参数数量,。策略3是关于在有限的参数数量下最大化精度。接下来, 我们描述的Fire模块, 将使我们能够成功地使用战略 1, 2 和3。

3.2 Fire Model

图1图1

一个Fire模块包括:

一个squeeze层 (只有1x1 卷积), 将其放入一个具有1x1 和3x3 卷积组合的expand层中(图1)。

在Fire模块中随意使用1x1 过滤器是应用3.1节中的策略1。

在一个Fire模块中有三个超参数: s1x1, e1x1和 e3x3。在Fire模块中, s1x1 是squeeze层 (所有 1x1) 中的过滤器数, e1x1是1x1 卷积在expand层的数量, e3x3 3x3卷积在expand层的数量。当我们使用Fire模块时, 我们设置 s1x1 小于 (e1x1 e 3x3 ), 因此, expand层有助于限制3x3卷积中输入通道的数量即3.1节中的策略 2

3.3 SQUEEZENET 体系结构

我们现在描述了 SqueezeNet CNN 的架构。

我们在图2中说明了 SqueezeNet 从一个独立的卷积层 (conv1) 开始, 后跟8个Fire模块 (fire2-9), 最后 conv 层 (conv10) 结束。从开始到网络的末端,我们逐渐增加每个Fire模块的卷积的数量。

SqueezeNet 在层 conv1、fire4、fire8 和 conv10 之后执行最大池化, 其步长为 2;这些相对较晚地执行池化操作是在执行3.1节的策略3。我们在表1中展示了完整的 SqueezeNet 体系结构。

图 2图 2

3.3.1 其他SQUEEZENET 细节

为了简洁起见, 我们省略了表1和图2中有关 SqueezeNet 的详细信息和设计选项的数量。我们提供以下这些设计选择。这些选择背后的直觉可以在下面引用的论文中找到。

(1)为了使1∗1 和 3∗3 filter输出的结果有相同的尺寸,在expand modules中,给3∗3 filter的原始输入添加一个像素的边界(zero-padding)

(2)squeeze 和 expand layers中都是用ReLU作为激活函数

(3)在fire9 module之后,使用Dropout,比例取50%

(4)注意到SqueezeNet中没有全连接层,这借鉴了Network in network的思想,用GAP代替全连接

【GAP 代替全连接解释与实现】https://www.cnblogs.com/hutao722/p/10008581.html

(5)训练过程中,初始学习率设置为0.04,在训练过程中线性降低学习率。更多的细节参见本项目在github中的配置文件。

(6)由于Caffe中不支持使用两个不同尺寸的filter,在expand layer中实际上是使用了两个单独的卷积层(1∗1filter 和 3∗3filter),最后将这两层的输出连接在一起,这在数值上等价于使用单层但是包含两个不同尺寸的filter。

【在github上还有SqueezeNet在其他框架下的实现】MXNet、Chainer、Keras、Torch。

https://github.com/forresti/SqueezeNet

表1表1

4 评估SQUEEZENET

在评估 SqueezeNet 时, 我们使用 AlexNet[4] 和相关的模型压缩结果作为比较的基准

表2 表2

在表2中, 我们将最近的模型压缩结果 和SqueezeNet网络做一个对比。可以看到:SVD 方法可以将 AlexNet 模型压缩为以前的5x, 同时会使top-1 数据集上的精度降低到 56.0% (丹顿 et, 2014)。网络修剪实现了模型尺寸的9x 降低, 同时保持了 top-1数据集上 57.2%的精度和top-5数据集上 80.3% 的精度 (Han等人, 2015b)。深压缩达到35x 的模型尺寸压缩比率, 同时仍然保持以往的精度 (Han等, 2015a)。现在, 使用 SqueezeNet网络, 我们实现了减少50X 的模型压缩比率, 同时满足或超过 AlexNet 的 top-1 和 top-5 的准确性。

我们似乎已经超过了目前模型压缩所取得的最新成果: 即使使用未压缩的32位值来表示模型, SqueezeNet 也在保持或超过原本正确率的基础上有一个1.4× 的模型压缩比,这相比于目前模型压缩所取得的最新成果还要好一些。

SqueezeNet, 使用33% 稀疏和8位量化. 这将生成一个 0.66 MB 的模型 (363× 小于32位 AlexNet), 并具有与 AlexNet 等效的精度。

此外, 在 SqueezeNet 上应用6位量化和33% 稀疏度的深压缩, 我们生成一个0.47MB 模型 (510× 小于32位 AlexNet), 具有等效的精度。我们的小模型确实可以压缩。

此外, 这些结果表明, 深压缩 (韩等, 2015a) 不仅在 CNN 的体系结构具有许多参数 (如 AlexNet 和 VGG), 但它也能够压缩已经紧凑, 完全卷积 SqueezeNet结构。通过10×压缩 SqueezeNet 的深层压缩, 同时保留基线精度。总而言之: 通过将 CNN 的体系结构创新 (SqueezeNet) 与最先进的压缩技术 (深压缩) 结合在一起, 我们实现了一个 510× 在模型大小上的缩减, 与基线相比, 精确度没有降低。

5 CNN 微体系结构设计空间探索

现在, 在5和6节中, 我们探讨了设计空间的几个方面。我们将此体系结构探索分为两个主要主题: microarchitectural 探索(每个模块层的维度和配置) 和macroarchitectural 探测(模块的端到端组织和其他层)。

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

图3图3

5.1 CNN 微体系结构参数

5.2 压缩比(SR)

在3.1 节中, 我们建议减少参数的数目, 方法是使用squeez层减少3x3 卷积的输入通道数。我们将压缩比率 (SR)定义为squeeze层中的卷积个数与expand层中的卷积个数之间的比值。我们现在设计了一个实验来研究压缩比对模型尺寸和精确度的影响。

在这些实验中, 我们使用 SqueezeNet (图 2) 作为起点。与 SqueezeNet 中一样, 这些实验使用以下 metaparameters:basee=128,incre=128,pct3x3=0.5,freq=2basee=128,incre=128,pct3x3=0.5,freq=2。我们培训多个模型, 其中每个模型有一个不同的压缩比 (SR),他们在范围 [0.125, 1.0]内变化。 在图 3 (a) 中, 我们展示了这个实验的结果, 在图上的每个点都是一个独立的模型, 从头开始训练。SqueezeNet 是SR = 0.125的点。 从这个数字我们知道, 在SR= 0.125时增加SR 可以进一步增加 ImageNet top-5 精度(从 80.3% (4.8MB)到86.0% (19MB)) 峰值在86.0% ( SR = 0.75 ,模型大小为19MB ), 并且设置 SR = 1.0 进一步增加了模型的大小,却没有提高准确性。

5.3 训练时关闭1X1和3X3卷积核

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

VGG (Simonyan & Zisserman 2014) 体系结构在大多卷积层中都充斥着3x3 的卷积;GoogLeNet (Szegedy 等, 2014) 和NiN (林等, 2013)在某些层里有1x1 的卷积。在 GoogLeNet 和NiN, 作者简单地提出了具体数量的1x1 和3x3 卷积没有进一步的分析。在这里, 我们试图阐明1x1 和3x3 过滤器的比例对模型大小和精度的影响.

我们在本实验中使用以下 metaparameters:basee=128,incre=128,SR=0.5,freq=2basee=128,incre=128,SR=0.5,freq=2, 并且我们让pct3x3pct3x3从1% 到99%变化 。换句话说, 每个Fire模块的expand层有一个预定义的数量的过滤器划分在1x1 和3x3 之间,

在这里,我们把“旋钮”从 “大多数是1x1卷积” 调节到 “大多数是 3x3卷积”。与以前的实验一样, 这些模型有8个FIre模块, 与图2中的层组织相同。我们在图 3 (b) 中显示了这个实验的结果。请注意, 图 3 (a) 和图 3 (b) 中的13MB 模型是相同的体系结构: SR = 0.500 和 pct3x3=50pct3x3=50%。我们在图 3 (b) 中看到, 在3x3 卷积占比为50%时,ImageNet数据集上的精度会达到85.6% , 当进一步增加了3x3 卷积的百分比时,只增加了模型的大小, 但没有提高 ImageNet数据集上的准确性。

6 CNN 宏观体系结构设计空间探索

到目前为止, 我们已经探索了微体系结构层面的设计空间, 即CNN网络各个模块的内容。现在, 我们在 macroarchitecture 级别上探讨了有关Fire模块之间高层连接的设计决策。灵感来自 ResNet (He等, 2015b), 我们探索了三种不同的体系结构:

· Vanilla SqueezeNet (按前一节). · SqueezeNet 在某些Fire模块之间进行简单的旁路连接。 · SqueezeNet 在Fire模块之间使用复杂的旁路连接。

我们在图2中画出了这三种 SqueezeNet 的变体。

表3表3

我们的简单旁路体系结构在3、5、7和9的Fire模块附近添加旁路连接, 要求这些模块在输入和输出之间学习残差函数。与 ResNet 一样, 要实现围绕 Fire3 的旁路连接, 我们将输入设置为 Fire4 等于 (Fire2 输出 Fire3 的输出), 其中 运算符为数组加法。这改变了应用于这些Fire模块的参数, 并且, 根据 ResNet, 可以提高最终的准确度。

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

我们还可以比较直观地看到: 增加旁路连接将有助于减轻squeeze层引入的瓶颈。例如:在 SqueezeNet中, 挤压比 (SR) 是 0.125, 这意味着每个squeeze层的输出通道比expand层少8倍。由于这种严重的通道数减少, 只有很少的信息可以通过expand层。但是, 通过将旁路连接添加到 SqueezeNet网络中, 我们打开了信息的通道, 使信息可以在不同的squeeze层之间传输。

我们按照图2中的三种结构训练了 SqueezeNet网络, 并比较了表3中的精度和模型大小。我们修正了微体系结构以匹配 SqueezeNet, 如表1在整个探索中所述。复杂和简单的旁路连接相比于基础的SqueezeNet结构,准确性得以改善。有趣的是, 简单的旁路使得精确度的提高比复杂的旁路更高。

7 论文阅读总结

关于神经网络的部分理解:

CNN微结构

CNN宏观结构

关于模型压缩的方法:

这方面理论基础为无,后续加强。

参考链接:

https://blog.csdn.net/u013044310/article/details/80188530?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

0 人点赞