作者信息:
华校专,曾任阿里巴巴资深算法工程师、智易科技首席算法研究员,现任腾讯高级研究员,《Python 大战机器学习》的作者。
编者按:
算法工程师必备系列更新啦!继上次推出了算法工程师必备的数学基础后,小编继续整理了必要的机器学习知识,全部以干货的内容呈现,哪里不会学哪里,老板再也不用担心你的基础问题!
六、ResNet 变种
6.1 恒等映射修正
- 在论文
《Identity Mappings in Deep Residual Networks》
中,ResNet
的作者通过实验证明了恒等映射的重要性,并且提出了一个新的残差单元来简化恒等映射。
6.1.1 新残差块
新的残差单元中,恒等映射添加到ReLU
激活函数之后。它使得训练变得更简单,并且提高了网络的泛化能力。

假设 是第 l 个残差单元的输入特征; 为一组与第 个残差单元相关的权重(包括偏置项), 是残差单元中的层的数量; 代表残差函数。则第 个残差单元的输出为(它也等价于第 个残差单元的输入):
考虑递归,对于任意深的残差单元 ,则有:
因此,对任意深的单元 ,其输入特征 可以表示为浅层单元 的特征 加上一个形如 的残差函数。
这意味着:任意单元 和 之间都具有残差性。
对于任意深的单元 ,其输入特征
可以表示为: 。即:之前所有残差函数输出的总和,再加上 。
与之形成鲜明对比的是常规网络中,输入特征 是一系列矩阵向量的乘积。即为: (忽略了激活函数和 BN
)。
新的残差单元也更具有良好的反向传播特性。对于损失函数 ,有:
可以看到:
:直接传递信息而不涉及任何权重。它保证了信息能够直接传回给任意浅层 。
根据3.
和4.
的讨论表明:在前向和反向阶段,信号都能够直接传递到任意单元。
6.1.2 快捷连接验证
如果对快捷连接执行的不是线性缩放,而是一个复杂的函数 ,则上式括号中第一部分变成: 。其中 为 的导数。
这也会丧失快捷连接的好处,阻碍梯度的传播。
下图所示为对快捷连接进行的各种修改:
为了简化,这里没有画出BN
层。每个权重层的后面实际上都有一个BN
层。
在统计学上,它等效于一个缩放比例为0.5的缩放操作。
在 CIFAR-10
上利用ResNet-110
的测试误差如下:(fail
表示测试误差超过 )
on shortcut
和 on F
列分别给出了快捷连接、残差块上的缩放比例。


(b)
:对所有的快捷连接设置缩放。其中缩放因子 。
残差有两种配置:缩放(缩放因子 0.5)、不缩放。
(d)
:对快捷连接执行门控机制,但是残差并不进行缩放。
(f)
:对快捷连接执行dropout
,其中遗忘比例为0.5 。
最终结果表明:快捷连接是信息传递最直接的路径,快捷连接中的各种操作都会阻碍信息的传递,以致于对优化造成困难。
理论上,对快捷连接执行1x1
卷积,会引入更多的参数。它应该比恒等连接具备更强大的表达能力。
事实上,其训练误差要比恒等连接的训练误差高的多。这意味着模型退化是因为优化问题,而不是网络表达能力的问题。
6.1.3 激活函数验证
设残差块之间的函数为 ,即:+
之后引入 :
前面的理论推导均假设 为恒等映射 ,而上面的实验中 。因此接下来考察 f 的影响。
如下图所示,组件都相同,但是不同的组合导致不同的残差块或 f 。
这种结构问题较大,因为理想的残差块的输出范围是 。这里的残差块经过个ReLU
之后的输出为非负,从而使得残差的输出为 ,从而使得前向信号会逐级递增。这会影响网络的表达能力。
(b)
:将BN
移动到addition
之后, 。
(c)
:将ReLU
移动到addition
之前,。

最终结果表明:full pre-activation
效果最好。有两个原因:
所有其它四组结构中,只有第二个权重层的输入的到了标准化,第一个权重层的输入并未的到标准化。
6.1.4 网络性能
在 ILSVRC 2012
验证集上的评估结果:
方法 | 数据集增强 | train crop | test crop | top-1 误差 | top-5 误差 |
---|
ResNet-152,原始残差块 | scale | 224x224 | 224x224 | 23.0% | 6.7% |
ResNet-152,原始残差块 | scale | 224x224 | 320x320 | 21.3% | 5.5% |
ResNet-152,full pre-activation | scale | 224x224 | 320x320 | 21.1% | 5.5% |
ResNet-200,原始残差块 | scale | 224x224 | 320x320 | 21.8% | 6.0% |
ResNet-200,full pre-activation | scale | 224x224 | 320x320 | 20.7% | 5.3% |
ResNet-200,full pre-activation | scale + asp ratio |
224x224 | 320x320 | 20.1% | 4.8% |
Inception v3 | scale + asp ratio | 299x299 | 299x299 | 21.2% | 5.6% |
6.2 ResNeXt
通常提高模型准确率的方法是加深网络深度或者加宽网络宽度,但这些方法会增加超参数的数量、参数数量和计算量。
ResNeXt
网络可以在不增加网络参数复杂度的前提下提高准确率,同时还减少了超参数的数量。
ResNeXt
的设计参考了VGG
和Inception
的设计哲学。
其缺点是:
每个“变换”中,滤波器的数量和尺寸等超参数都需要精细的设计。
一旦需要训练新的任务(如新任务是一个NLP
任务),可能需要重新设计网络结构。因此可扩展性不高。
VGG
:网络通过简单地层叠相同结构的层来实现,因此网络结构简单。其缺点是网络参数太多,计算量太大。
Inception
:通过执行分裂-变换-合并
策略来精心设计拓扑结构,使得网络参数较少,计算复杂度较低。这种分裂-变换-合并
行为预期能够达到一个大的dense
层的表达能力,但是计算复杂度要低的多。
在相同的参数数量和计算复杂度的情况下,ResNeXt
的预测性能要优于ResNet
。
- 它在
ILSVRC 2016
分类任务中取得了第二名的成绩。 101
层的ResNeXt
就能够获得超过200
层ResNet
的准确率,并且计算量只有后者的一半。
ResNeXt
改进了ResNet
网络结构,并提出了一个新的维度,称作“基数”cardinality
。基数是网络的深度和网络的宽度之外的另一个重要因素。
作者通过实验表明:增加基数比增加网络的深度或者网络的宽度更有效。
6.2.1 分裂-变换-合并
考虑全连接网络中的一个神经元。假设输入为 ,为一个一度的输入向量(长度为 D )。假设对应的权重为 。不考虑偏置和激活函数,则神经元的输出为: 。
它可以视作一个最简单的“分裂-变换-合并”:
- 变换:每个低维嵌入分别使用一组专用滤波器(
3x3
、5x5
等) 执行变换。
对一个ResNeXt
块,其“分裂-变换-合并”策略用公式表述为:
其中:
- 为任意函数,它将 映射为 的一个低维嵌入,并对该低维嵌入执行转换。
- C 为转换的数量,也就是基数
cardinality
。
在ResNeXt
中,为了设计方便 采取以下设计原则:
所有的 具有相同的结构。这是参考了VGG
的层叠相同结构的层的思想。
第一层:执行1x1
的卷积来产生 的一个低维嵌入。
最后一层:执行1x1
的卷积来将结果提升到合适的维度。
6.2.2 ResNeXt 块
一个ResNeXt
模块执行了一组相同的“变换”,每一个“变换”都是输入的一个低维嵌入,变换的数量就是基数 C
。
如下所示:左图为ResNet
块;右图为ResNeXt
块。

ResNeXt
模块有两种等效的形式:图(a)
为标准形式,图(b)
类似Inception-ResNet
模块。其中图(b)
的拼接是沿着深度方向拼接。
经过这种拆分,图(b)
就等效于图(a)
。其中:i 表示输出单元位于 i 通道,s 表示输入单元位于 s 通道,j,k 表示通道中的坐标。
本质原因是1x1
卷积是简单的对通道进行线性相加。它可以拆分为:先将输入通道分组,然后计算各组的子通道的线性和(1x1
卷积);然后将所有组的和相加。

图(b)
与Inception-ResNet
模块的区别在于:这里每一条路径都是相同的。
图(c)
是一个分组卷积的形式,它就是用分组卷积来实现图(b)
。它也是图(b)
在代码中的实现方式。
- 等效的原因是:输入通道数为
128
的1x1
卷积可以如下拆分:( 设输入张量为 ,输出张量为 ,核张量为 )
通常ResNeXt
模块至少有三层。事实上它也可以有两层,此时它等效于一个宽的、密集模块。
- 此时并没有通过
1x1
卷积进行降维与升维,而是在降维的过程中同时进行变换,在升维的过程中也进行变换。 - 如下图所示,它等价于图
(c)
中,去掉中间的变换层(128,3x3,128
层),同时将第一层、第三层的 1x1
替换为3x3
卷积层。

6.2.3 网络性能
ResNeXt
的两种重要超参数是:基数C
和颈宽d
。
这二者也决定了ResNeXt
模块等价形式中,通道分组卷积的通道数量为 Cxd
。
- 基数
C
:决定了每个ResNeXt
模块有多少条路径。 - 颈宽(
bottleneck width
)d
:决定了ResNeXt
模块中第一层1x1
卷积降维的维度。
ResNeXt
的网络参数和计算量与同等结构的ResNet
几乎相同。以ResNet-50
为例(输入图片尺寸224x224
):
ResNeXt-50(32x4d)
意思是:基数C=32
,颈宽d=4
。

在ImageNet
上进行的对比实验(验证集误差,single crop
):
基数 vs 颈宽:基数越大越好。
模型 | 配置 | top-1 error(%) |
---|
ResNet-50 | C=1,d=64 | 23.9 |
ResNeXt-50 | C=2,d=40 | 23.0 |
ResNeXt-50 | C=4,d=24 | 22.6 |
ResNeXt-50 | C=8,d=14 | 22.3 |
ResNeXt-50 | C=32,d=4 | 22.2 |
ResNet-101 | C=1,d=64 | 22.0 |
ResNeXt-101 | C=2,d=40 | 21.7 |
ResNeXt-101 | C=4,d=24 | 21.4 |
ResNeXt-101 | C=8,d=14 | 21.3 |
ResNeXt-101 | C=32,d=4 | 21.2 |
4.与其它模型的预测能力比较(验证集误差,single crop
):
ResNet/ResNeXt
的图片尺寸为224x224
和 320x320
;Inception
的图片尺寸为299x299
。

6.3 随机深度网络
随机深度网络提出了训练时随机丢弃网络层的思想,从而能够让网络深度增加到超过1000层,并仍然可以减少测试误差。
如图所示:在CIFAR-10
上,1202
层的ResNet
测试误差要高于 110
层的ResNet
,表现出明显的过拟合。而 1202
层的随机深度网络(结合了ResNet
)的测试误差要低于 110
层的ResNet
。

神经网络的表达能力主要由网络深度来决定,但是过深的网络会带来三个问题:反向传播过程中的梯度消失、前向传播过程中的feature
消失、训练时间过长。
虽然较浅的网络能够缓解这几个问题,但是较浅的网络表达能力不足,容易陷入欠拟合。
随机深度网络解决这一矛盾的策略是:构建具有足够表达能力的深度神经网络(具有数百层甚至数千层),然后:
在网络训练期间,对每个mini batch
随机地移除部分层来显著的减小网络的深度。
移除操作:删除对应的层,并用跳跃连接来代替。
随机深度的思想可以和ResNet
结合。因为ResNet
已经包含了跳跃连接,因此可以直接修改。
6.3.1 随机深度
- 表示第 个残差块的输出, 为第
个残差块的输入(它也是第 个残差块的输出)。
- 为一组与第 个残差单元相关的权重(包括偏置项), 是残差单元中的层的数量。
假设第 个残差块是否随机丢弃由伯努利随机变量 来指示:当 时,第 个残差块被丢弃;当 时,第 个残差块被保留。
因此有: 。
对随机变量 ,令:
其中 称做保留概率或者存活概率,它是一个非常重要的超参数。
的选择有两个策略:
其背后的思想是:靠近输入的层提取的是被后续层使用的低级特征,因此更应该被保留下来。
所有残差块的存活概率都不同,且根据残差块的深度进行线性衰减:
给定第 个残差块的保留概率 ,则网络的深度 的期望为(以残差块数量为单位): 。
当 时,无论是均匀存活还是线性衰减存活,都满足 。因此随机深度网络在训练时具有更短的期望深度,从而节省了训练时间。
的选择策略,以及 的大小的选取需要根据实验仔细选择。
- 根据作者的实验结果,作者推荐使用线性衰减存活概率,并选择 。此时有:
- 如果选择更小的 将会带来更大的测试误差,但是会更大的加速训练过程。

网络训练时期望深度的减少,使得梯度链变短,从而加强了反向传播期间靠近输入层的梯度。
随机深度网络可以被理解为一系列不同深度的网络的隐式集成的集成模型。
随机深度网络可以视作 个隐式的神经网络的集成,这些被集成的网络都是权重共享的,类似于Dropout
。
- 在训练时,对每个
mini batch
,只有其中之一得到了权重更新。
随机深度网络和 Dropout
都可以被理解为一系列网络的隐式集成。
- 随机深度集网络成了一系列具有不同深度的神经网络,而
Dropout
集成了一系列具有不同宽度的神经网络。 -
Dropout
与BN
配合使用时会失效,而随机深度可以和BN
配合使用。
在随机深度网络中,由于训练时的随机深度,模型的测试误差的抖动相对于ResNet
会偏大。
6.3.2 网络性能
对ResNet
(固定深度和随机深度)在三个数据集上进行比较,测试误差的结果如下:
虽然这里模型的测试误差没有提升,但是训练速度大幅提升。
网络 | CIFAR10+ | CIFAR100+ | ImageNet |
---|
ResNet(固定深度) | 6.41 | 27.76 | 21.78 |
ResNet(随机深度) | 5.25 | 24.98 | 21.98 |
CIFAR10/100
采用 110 层 ResNet
,ImageNet
采用 152 层 ResNet
。
虽然在 ImageNet
上随机深度模型没有提升,但是作者表示这是因为网络本身比较简单(相对 ImageNet
数据集)。如果使用更深的ResNet
,则容易看到随机深度模型的提升。
在 CIFAR-10
上,ResNet
随机深度网络的深度 、概率 与测试集误差的关系:

七、SENet
SENet
提出了一种新的架构单元来解决通道之间相互依赖的问题。它通过显式地对通道之间的相互依赖关系建模,自适应的重新校准通道维的特征响应,从而提高了网络的表达能力。SENet
以2.251% top-5
的错误率获得了ILSVRC 2017
分类比赛的冠军。SENet
是和ResNet
一样,都是一种网络框架。它可以直接与其他网络架构一起融合使用,只需要付出微小的计算成本就可以产生显著的性能提升。
7.1 SE 块
SE
块(Squeeze-and-Excitation
)是SENet
中提出的新的架构单元,它主要由squeeze
操作和excitation
操作组成。
-
对于给定的任何变换 ,其中: 为输入feature map
,其尺寸为,通道数为 为输出feature map
,其尺寸为 ,通道数为 。
可以构建一个相应的SE
块来对输出feature map
执行特征重新校准:
- 首先对输出
feature map
squeeze
操作,它对每个通道的全局信息建模,生成一组通道描述符。 -
然后是一个
excitation
操作,它对通道之间的依赖关系建模,生成一组权重信息(对应于每个通道的权重)。 - 最后输出
feature map
被重新加权以生成SE
块的输出。
SE
块可以理解为注意力机制的一个应用。它是一个轻量级的门机制,用于对通道关系进行建模。
通过该机制,网络学习全局信息(全通道、全空间)来选择性的强调部分特征,并抑制其它特征。
设 , 为第 个通道,是一个 的矩阵;设 , 为第 个通道,是一个 的矩阵。
这里 *
表示卷积。同时为了描述简洁,这里忽略了偏置项。
- 输出 考虑了输入 的所有通道,因此通道依赖性被隐式的嵌入到 中。
- 需要学习的变换 就是一组卷积核。 为第 c 个卷积核,记做: , 为第 个卷积核的第 通道,是一个二维矩阵。则:
7.1.1 squeeze 操作
squeeze
操作的作用是:跨空间 聚合特征来产生通道描述符。
该描述符嵌入了通道维度特征响应的全局分布,包含了全局感受野的信息。
每个学到的滤波器都是对局部感受野进行操作,因此每个输出单元都无法利用局部感受野之外的上下文信息。
在网络的低层,其感受野尺寸很小,这个问题更严重。
为减轻这个问题,可以将全局空间信息压缩成一组通道描述符,每个通道对应一个通道描述符。然后利用该通道描述符。


3.通常基于通道的全局平均池化来生成通道描述符(也可以考虑使用更复杂的聚合策略)。
设所有通道的通道描述符组成一个向量 。则有:
7.1.2 excitation 操作
excitation
操作的作用是:通过自门机制来学习每个通道的激活值,从而控制每个通道的权重。
excitation
操作利用了squeeze
操作输出的通道描述符 。
降维通过一个输出单元的数量为 的全连接层来实现,其中 为降维比例。
升维通过一个输出单元的数量为 C 的全连接层来实现。
通过对通道描述符 进行降维,显式的对通道之间的相互依赖关系建模。
- 然后,
ReLU
激活函数的输出经过线性升维之后,通过一个sigmoid
激活函数。 - 首先,通道描述符 经过线性降维之后,通过一个
ReLU
激活函数。

设excitation
操作的输出为向量 ,则有: 。
其中: 为sigmoid
激活函数, 为降维层的权重,
为升维层的权重,为降维比例。
在经过excitation
操作之后,通过重新调节 得到SE
块的输出。
设SE
块的最终输出为 ,则有: 。这里 为excitaion
操作的输出结果,它作为通道 的权重。
不仅考虑了本通道的全局信息(由 引入),还考虑了其它通道的全局信息(由 引入)。
7.1.3 SE 块使用
有两种使用SE
块来构建SENet
的方式:
下图中,左侧为原始Inception
模块,右侧为SE-Inception
模块。
下图中,左侧为原始残差模块,右侧为SE-ResNet
模块。


如果使用SE
块来替代现有网络架构中的原始块,则所有额外的参数都包含在门机制的两个全连接层中。
引入的额外参数的数量为: 。其中: 表示降维比例(论文中设定为16), 指的是SE
块的数量, 表示第 个SE
块的输出通道的维度。
如:SE-ResNet-50
在ResNet-50
所要求的大约2500万参数之外,额外引入了约250万参数,相对增加了。
超参数 称作减少比率,它刻画了需要将通道描述符组成的向量压缩的比例。它是一个重要的超参数,需要在精度和复杂度之间平衡。
网络的精度并不会随着 的增加而单调上升,因此需要多次实验并选取其中最好的那个值。
如下所示为SE-ResNet-50
采用不同的 在 ImageNet
验证集上的预测误差(single-crop
)。original
表示原始的 ResNet-50
。

虽然SE
块可以应用在网络的任何地方,但是它在不同深度中承担了不同的作用。
这说明在网络的最初阶段,特征通道的重要性很可能由不同的类别共享。即:低层特征通常更具有普遍性。
这说明在网络的高层,每个通道的值变得更具有类别特异性。即:高层特征通常更具有特异性。
在网络的最后阶段的SE
块为网络提供重新校准所起到的作用,相对于网络的前面阶段的SE
块来说,更加不重要。
这意味着可以删除最后一个阶段的SE
块,从而显著减少总体参数数量,仅仅带来一点点的损失。如:在SE-ResNet-50
中,删除最后一个阶段的SE
块可以使得参数增加量下降到 4%,而在ImageNet
上的top-1
错误率的损失小于 0.1%
。
因此:Se
块执行特征通道重新校准的好处可以通过整个网络进行累积。
- 在网络较高的层中:对于不同类别的样本,特征通道的权重分布开始分化。
- 在网络较低的层中:对于不同类别的样本,特征通道的权重分布几乎相同。
7.2 网络性能
网络结构:其中 fc,[16,256]
表示 SE
块中的两个全连接层的输出维度。

在ImageNet
验证集上的计算复杂度和预测误差比较(single-crop
)。
original
列:从各自原始论文中给出的结果报告。
re-implementation
列:重新训练得到的结果报告。
GFLOPs/MFLOPs
:计算复杂度,单位为 G/M FLOPs
。
MobileNet
采用的是 1.0 MobileNet-224
,ShuffleNet
采用的是 1.0 ShuffleNet 1x(g=3)
。
随机裁剪成 224x224
大小(Inception
系列裁剪成 299x299
)。
输入图片沿着通道归一化:每个像素减去本通道的像素均值。


3.在ImageNet
验证集上的预测误差比较(single-crop
):
其中 SENet-154(post-challenge)
是采用 320x320
大小的图片来训练的。

八、 DenseNet
DenseNet
不是通过更深或者更宽的结构,而是通过特征重用来提升网络的学习能力。
ResNet
的思想是:创建从“靠近输入的层” 到 “靠近输出的层” 的直连。而DenseNet
做得更为彻底:将所有层以前馈的形式相连,这种网络因此称作DenseNet
。
- 缓解梯度消失的问题。因为每层都可以直接从损失函数中获取梯度、从原始输入中获取信息,从而易于训练。
- 密集连接还具有正则化的效应,缓解了小训练集任务的过拟合。
- 鼓励特征重用。网络将不同层学到的
feature map
进行组合。 - 大幅度减少参数数量。因为每层的卷积核尺寸都比较小,输出通道数较少 (由增长率
决定)。
DenseNet
具有比传统卷积网络更少的参数,因为它不需要重新学习多余的feature map
。
这会改变状态
,但是也传递了需要保留的信息。
ResNet
通过恒等映射来直接传递需要保留的信息,因此层之间只需要传递状态的变化
。
DenseNet
会将所有层的状态
全部保存到集体知识
中,同时每一层增加很少数量的feture map
到网络的集体知识中
。
- 传统的前馈神经网络可以视作在层与层之间传递
状态
的算法,每一层接收前一层的状态
,然后将新的状态
传递给下一层。
DenseNet
的层很窄(即:feature map
的通道数很小),如:每一层的输出只有 12 个通道。
8.1 DenseNet 块
具有 层的传统卷积网络有 个连接,每层仅仅与后继层相连。
具有 个残差块的 ResNet
在每个残差块增加了跨层连接,第 个残差块的输出为: 。其中 是第 个残差块的输入特征; 为一组与第 个残差块相关的权重(包括偏置项), 是残差块中的层的数量; 代表残差函数。
具有 个层块的DenseNet
块有 个连接,每层以前馈的方式将该层与它后面的所有层相连。对于第 层:所有先前层的feature map
都作为本层的输入,第 层具有 个输入feature map
;本层输出的feature map
都将作为后面 层的输入。
假设DenseNet
块包含 层,每一层都实现了一个非线性变换 ,其中 表示层的索引。
假设DenseNet
块的输入为 ,DenseNet
块的第 层的输出为 ,则有:
其中 表示 层输出的feature map
沿着通道方向的拼接。
ResNet
块与它不同。在ResNet
中,不同feature map
是通过直接相加来作为块的输出。

3.当 feature map
的尺寸改变时,无法沿着通道方向进行拼接。此时将网络划分为多个DenseNet
块,每块内部的 feature map
尺寸相同,块之间的feature map
尺寸不同。
8.1.1 增长率
DenseNet
块中,每层的 输出的feature map
通道数都相同,都是 个。 是一个重要的超参数,称作网络的增长率。
第 l 层的输入feature map
的通道数为: 。其中 为输入层的通道数。
DenseNet
不同于现有网络的一个重要地方是:DenseNet
的网络很窄,即输出的 feature map
通道数较小,如:k=12。
一个很小的增长率就能够获得不错的效果。一种解释是:DenseNet
块的每层都可以访问块内的所有早前层输出的feature map
,这些feature map
可以视作DenseNet
块的全局状态。每层输出的feature map
都将被添加到块的这个全局状态中,该全局状态可以理解为网络块的“集体知识”,由块内所有层共享。增长率 k 决定了新增特征占全局状态的比例。
因此feature map
无需逐层复制(因为它是全局共享),这也是DenseNet
与传统网络结构不同的地方。这有助于整个网络的特征重用,并产生更紧凑的模型。
8.1.2 非线性变换
- 可以是包含了
Batch Normalization(BN)
、ReLU
单元、池化或者卷积等操作的复合函数。 - 论文中
的结构为:先执行
BN
,再执行ReLU
,最后接一个3x3
的卷积,即:BN-ReLU-Conv(3x3)
。
8.1.3 bottleneck
尽管DenseNet
块中每层只产生 个输出feature map
,但是它具有很多输入。当在 之前采用 1x1
卷积实现降维时,可以减小计算量。
的输入是由第 层的输出 feature map
组成,其中第 0
层的输出feature map
就是整个DensNet
块的输入feature map
。
事实上第 层从DensNet
块的输入feature map
中抽取各种特征。即 包含了DensNet
块的输入feature map
的冗余信息,这可以通过 1x1
卷积降维来去掉这种冗余性。
因此这种1x1
卷积降维对于DenseNet
块极其有效。
如果在 中引入 1x1
卷积降维,则该版本的DenseNet
称作DenseNet-B
。其 结构为:先执行BN
,再执行ReLU
,再接一个1x1
的卷积,再执行BN
,再执行ReLU
,最后接一个3x3
的卷积。即:BN-ReLU-Conv(1x1)-BN-ReLU-Conv(3x3)
。
其中1x1
卷积的输出通道数是个超参数,论文中选取为 。
8.2 过渡层
一个DenseNet
网络具有多个DenseNet
块,DenseNet
块之间由过渡层连接。DenseNet
块之间的层称为过渡层,其主要作用是连接不同的DenseNet
块。
过渡层可以包含卷积或池化操作,从而改变前一个DenseNet
块的输出feature map
的大小(包括尺寸大小、通道数量)。
论文中的过渡层由一个BN
层、一个1x1
卷积层、一个2x2
平均池化层组成。其中 1x1
卷积层用于减少DenseNet
块的输出通道数,提高模型的紧凑性。
如果不减少DenseNet
块的输出通道数,则经过了 个DenseNet
块之后,网络的feature map
的通道数为: ,其中 为输入图片的通道数, 为每个DenseNet
块的层数。

3.如果Dense
块输出feature map
的通道数为 m ,则可以使得过渡层输出feature map
的通道数为 ,其中 为压缩因子。
结合了DenseNet-C
和 DenseNet-B
的改进的网络称作 4DenseNet-BC
。
当 时,经过过渡层的feature map
通道数不变。
当 时,经过过渡层的feature map
通道数减小。此时的DenseNet
称做 DenseNet-C
。
8.3 网络性能
网络结构:ImageNet
训练的DenseNet
网络结构,其中增长率 k=32 。
- 表中的
conv
代表的是 BN-ReLU-Conv
的组合。如 1x1 conv
表示:先执行BN
,再执行ReLU
,最后执行1x1
的卷积。 DenseNet-xx
表示DenseNet
块有xx
层。如:DenseNet-169
表示 DenseNet
块有 L=169 层 。- 所有的
DenseNet
使用的是 DenseNet-BC
结构,输入图片尺寸为224x224
,初始卷积尺寸为7x7
、输出通道 2k
、步长为2
,压缩因子 =0.5 。 - 在所有
DenseNet
块的最后接一个全局平均池化层,该池化层的结果作为softmax
输出层的输入。

在ImageNet
验证集的错误率(single-crop/10-crop
):
模型 | top-1 error(%) | top-5 error(%) |
---|
DenseNet-121 | 25.02/23.61 | 7.71/6.66 |
DenseNet-169 | 23.80/22.08 | 6.85/5.92 |
DenseNet-201 | 22.58/21.46 | 6.34/5.54 |
DenseNet-264 | 22.15/20.80 | 6.12/5.29 |
下图是DenseNet
和ResNet
在ImageNet
验证集的错误率的比较(single-crop
)。左图为参数数量,右图为计算量。

从实验可见:DenseNet
的参数数量和计算量相对ResNet
明显减少。
- 具有
20M
个参数的DenseNet-201
与具有 40M
个参数的ResNet-101
验证误差接近。 - 和
ResNet-101
验证误差接近的DenseNet-201
的计算量接近于ResNet-50
,几乎是ResNet-101
的一半。
DenseNet
在CIFAR
和 SVHN
验证集的表现:
从实验可见:
网络可以利用更大、更深的模型提高其表达学习能力,这也表明了DenseNet
不会受到优化困难的影响。
这带来的一个效果是:DenseNet-BC
不容易发生过拟合。
事实上在CIFAR10
上,DenseNet
从 中,参数数量提升了4倍但是验证误差反而 5.77
下降到 5.83
,明显发生了过拟合。而DenseNet-BC
未观察到过拟合。
DenseNet
的参数效率更高,使用了压缩因子和bottleneck
的 DenseNet-BC
的参数利用率极高。- 不考虑压缩因子和
bottleneck
,L 和 k 越大DenseNet
表现更好。这主要是因为模型容量相应地增长。 C10+
和 C100+
:表示对CIFAR10/CIFAR100
执行数据集增强,包括平移和翻转。- 在
C10/C100/SVHN
三列上的DenseNet
采用了 Dropout
。 DenseNet
的Depth
列给出的是 L 参数。
DenseNet
提高准确率的一个可能的解释是:各层通过较短的连接(最多需要经过两个或者三个过渡层)直接从损失函数中接收额外的监督信息。
8.4 内存优化
8.4.1 内存消耗
虽然 DenseNet
的计算效率较高、参数相对较少,但是DenseNet
对内存不友好。考虑到GPU
显存大小的限制,因此无法训练较深的 DenseNet
。
假设DenseNet
块包含 L 层,对于第 l 层有: 。
假设每层的输出feature map
尺寸均为 、通道数为 , 由BN-ReLU-Conv(3x3)
组成,则:
因此除了第 层的输出feature map
需要内存开销之外,第 l 层还需要 的内存开销来存放中间生成的临时feature map
。
整个 DenseNet Block
需要 的内存开销来存放中间生成的临时feature map
。即DenseNet Block
的内存消耗为,是网络深度的平方关系。
- 拼接
Concat
操作 :需要生成临时feature map
作为第 l 层的输入,内存消耗为 。 BN
操作:需要生成临时feature map
作为ReLU
的输入,内存消耗为 。ReLU
操作:可以执行原地修改,因此不需要额外的feature map
存放ReLU
的输出。Conv
操作:需要生成输出feature map
作为第 l 层的输出,它是必须的开销。
DenseNet Block
的这种内存消耗并不是DenseNet Block
的结构引起的,而是由深度学习库引起的。因为Tensorflow/PyTorch
等库在实现神经网络时,会存放中间生成的临时节点(如BN
的输出节点),这是为了在反向传播阶段可以直接获取临时节点的值。
这是在时间代价和空间代价之间的折中:通过开辟更多的空间来存储临时值,从而在反向传播阶段节省计算。
除了临时feature map
的内存消耗之外,网络的参数也会消耗内存。设 H_l 由BN-ReLU-Conv(3x3)
组成,则第 l 层的网络参数数量为: (不考虑 BN
)。
整个 DenseNet Block
的参数数量为 ,即 。因此网络参数的数量也是网络深度的平方关系。
- 由于
DenseNet
参数数量与网络的深度呈平方关系,因此DenseNet
网络的参数更多、网络容量更大。这也是DenseNet
优于其它网络的一个重要因素。 - 通常情况下都有 ,其中 为网络
feature map
的宽、高,k 为网络的增长率。所以网络参数消耗的内存要远小于临时feature map
消耗的内存。
8.4.2 内存优化
论文《Memory-Efficient Implementation of DenseNets》
通过分配共享内存来降低内存需求,从而使得训练更深的DenseNet
成为可能。
其思想是利用时间代价和空间代价之间的折中,但是侧重于牺牲时间代价来换取空间代价。其背后支撑的因素是:Concat
操作和BN
操作的计算代价很低,但是空间代价很高。因此这种做法在DenseNet
中非常有效。
传统的DenseNet Block
实现与内存优化的DenseNet Block
对比如下(第 层,该层的输入feature map
来自于同一个块中早前的层的输出):
该层的临时feature map
需要消耗内存 2WHkl,该层的输出feature map
需要消耗内存 WHk 。
- 左图为传统的
DenseNet Block
的第 l 层。首先将 feature map
拷贝到连续的内存块,拷贝时完成拼接的操作。然后依次执行BN
、ReLU
、Conv
操作。
另外某些实现(如LuaTorch
)还需要为反向传播过程的梯度分配内存,如左图下半部分所示。如:计算 BN
层输出的梯度时,需要用到第 l 层输出层的梯度和BN
层的输出。存储这些梯度需要额外的 的内存。* 另外一些实现(如PyTorch,MxNet
)会对梯度使用共享的内存区域来存放这些梯度,因此只需要 的内存。
右图为内存优化的DenseNet Block
的第 l 层。采用两组预分配的共享内存区Shared memory Storage location
来存Concate
操作和BN
操作输出的临时feature map
。

第一组预分配的共享内存区:Concat
操作共享区。第 层的 Concat
操作的输出都写入到该共享区,第 层的写入会覆盖第 层的结果。
因为Concat
操作的计算效率非常高,因此这种额外的计算代价很低。
对于整个Dense Block
,这个共享区只需要分配 (最大的feature map
)的内存,即内存消耗为 (对比传统DenseNet
的 O(kL^2))。
由于第 层的写入会覆盖第 层的结果,因此这里存放的数据是临时的、易丢失的。因此在反向传播阶段还需要重新计算第
层的Concat
操作的结果。
第二组预分配的共享内存区:BN
操作共享区。第 层的 BN
操作的输出都写入到该共享区,第 层的写入会覆盖第 层的结果。
BN
的计算效率也很高,只需要额外付出大约 5% 的计算代价。
对于整个Dense Block
,这个共享区也只需要分配 (最大的feature map
)的内存,即内存消耗为 (对比传统DenseNet
的 )。
-
与Concat
操作共享区同样的原因,在反向传播阶段还需要重新计算第 l 层的BN
操作的结果。
由于BN
操作和Concat
操作在神经网络中大量使用,因此这种预分配共享内存区的方法可以广泛应用。它们可以在增加少量的计算时间的情况下节省大量的内存消耗。
8.4.3 优化结果
如下图所示,DenseNet
不同实现方式的实验结果:
注意:
如前面的推导过程中,DenseNet Block
参数数量 ,内存消耗 。因此 ,即 。
内存消耗是参数数量的线性函数。因为参数数量本质上是网络深度的二次函数,而内存消耗也是网络深度的二次函数。
Naive Implementation(LuaTorch)
:采用LuaTorch
实现的,不采用任何的内存共享区。Shared Gradient Strorage(LuaTorch)
:采用LuaTorch
实现的,采用梯度内存共享区。Shared Gradient Storage(PyTorch)
:采用PyTorch
实现的,采用梯度内存共享区。Shared Gradient+BN+Concat Strorate(LuaTorch)
:采用LuaTorch
实现的,采用梯度内存共享区、Concat
内存共享区、BN
内存共享区。Shared Gradient+BN+Concat Strorate(PyTorch)
:采用LuaTorch
实现的,采用梯度内存共享区、Concat
内存共享区、BN
内存共享区。
如下图所示,DenseNet
不同实现方式的训练时间差异(NVIDIA Maxwell Titan-X
):
Concat
内存共享区、BN
内存共享区需要额外消耗 15%(LuaTorch
) 或者20% (PyTorch
) 的时间。
如下图所示,不同DenseNet
的不同实现方式在ImageNet
上的表现(single-crop test
):
网络参数数量:232 层DenseNet
:k=48,55M
参数。264 层DenseNet
:k=32,33M
参数;k=48,73M
参数。
经过内存优化的DenseNet
可以在单个工作站(8 NVIDIA Tesla M40 GPU
)上训练 264 层的网络,并取得了top-1 error=20.26%
的好成绩。

九、小型网络
目前神经网络领域的研究基本可以概括为两个方向:探索模型更好的预测能力,关注模型在实际应用中的难点。
事实上卷积神经网络在图像识别领域超越了人类的表现,但是这些先进的网络需要较高的计算资源。这些资源需求超出了很多移动设备和嵌入式设备的能力(如:无人驾驶),导致实际应用中难以在这些设备上应用。
小型网络就是为解决这个难点来设计的。
小型网络的设计和优化目标并不是模型的准确率,而是在满足一定准确率的条件下,尽可能的使得模型小,从而降低对计算资源的需求,降低计算延迟。
小型高效的神经网络的构建方法大致可以归为两类:对已经训练好的网络进行压缩,直接训练小网络模型。
模型参数的数量决定了模型的大小,所谓的小型网络
指的是网络的参数数量较少。
小型网络具有至少以下三个优势:
Worker
与PS
以及 Worker
与Worker
之间的通信是神经网络分布式训练的重要限制因素。在分布式数据并行训练中,通信开销与模型的参数数量成正比。较小的模型需要更少的通信,从而可以更快的训练。
当在tensorflow
等框架中训练好模型并准备部署时,需要将模型导出。如:将训练好的模型导出到自动驾驶汽车上。模型越小,则数据导出需要传输的数据量越少,这样可以支持更频繁的模型更新。
FPGA
通常只有小于10MB
的片上内存,并且没有外部存储。因此如果希望在FPGA
上部署模型,则要求模型足够小从而满足内存限制。
9.1 SqueezeNet 系列
9.1.1 SqueezeNet
squeezenet
提出了Fire
模块,并通过该模型构成一种小型CNN
网络,在满足AlexNet
级别准确率的条件下大幅度降低参数数量。
CNN
结构设计三个主要策略:
其直觉是:在其它不变的情况下,尺寸大的feature map
具有更高的分类准确率。
策略1、2
是关于在尽可能保持模型准确率的条件下减少模型的参数数量,策略3
是关于在有限的参数数量下最大化准确率。
策略 1:部分的使用1x1
卷积替换3x3
卷积。因为1x1
卷积的参数数量比3x3
卷积的参数数量少了 9
倍。
策略 2:减少3x3
卷积输入通道的数量。这会进一步降低网络的参数数量。
策略 3:将网络中下采样的时机推迟到网络的后面。这会使得网络整体具有尺寸较大的feature map
。
9.1.1.1 Fire 模块
一个Fire
模块由一个squeeze
层和一个expand
层组成。
squeeze
层:一个1x1
卷积层,输出通道数为超参数 。
它用于减少expand
层的输入通道数,即:应用策略2 。
expand
层:一个1x1
卷积层和一个3x3
卷积层,它们卷积的结果沿着深度进行拼接。
1x1
卷积输出通道数为超参数 ,3x3
卷积输出通道数为超参数 。

9.1.1.2 网络性能
SqueezeNet
从一个独立的卷积层(conv1
)开始,后跟 8 个Fire
模块(fire2~9
),最后连接卷积层conv10
、全局平均池化层、softmax
输出层。-
从网络开始到末尾,每个
Fire
模块的输出通道数逐渐增加。 - 在
conv1、fire4、fire8
之后执行最大池化,步长为2。这种相对较晚的执行池化操作是采用了策略3。 - 在
expand
层中的3x3
执行的是same
卷积,即:在原始输入上下左右各添加一个像素,使得输出的feature map
尺寸不变。 - 在
fire9
之后使用Dropout
,遗忘比例为 0.5 。

(#1x1 squeeze)
列给出了超参数 ,(#1x1 expand)
列给出了超参数 ,(#3x3 expand)
列给出了超参数 。# parameter before pruning
列给出了模型裁剪之前的参数数量。-
# parameter after pruning
列给出了模型裁剪之后的参数数量。
可以看到,SqueezeNet
在满足同样准确率的情况下,模型大小比AlexNet
压缩了 50 倍。如果使用 Deep Compression
以及 6 bit
精度的情况下,模型大小比AlexNet
压缩了 510 倍。
CNN 网络结构 | 网络压缩方法 | 数据类型 | 模型大小 | 模型压缩比例 | top-1 Accuracy | top-5 Accuracy |
---|
AlexNet | None | 32 bit | 240 MB | 1x | 57.2% | 80.3% |
AlexNet | SVD | 32 bit | 48 MB | 5x | 56.0% | 79.4% |
AlexNet | Network Pruning | 32 bit | 27 MB | 9x | 57.2% | 80.3% |
AlexNet | Deep Compression | 5-8 bit | 6.9 MB | 35x | 57.2% | 80.3% |
SqueezeNet | None | 32 bit | 4.8 MB | 50x | 57.5% | 80.3% |
SqueezeNet | Deep Compression | 8 bit | 0.66 MB | 363x | 57.5% | 80.3% |
SqueezeNet | Deep Compression | 6 bit | 0.47 MB | 510x | 57.5% | 80.3% |
- 网络压缩方法列:给出了网络裁剪方法,包括
SVD(Denton et al. 2014)
、Network pruning (Han et al. 2015b)
、Deep compression (Han et al. 2015a)
。 - 模型压缩比例列:给出了模型相对于原始
AlexNet
的模型大小压缩的比例。 top-1 Accuracy/top-5 Accuracy
列:给出了模型在ImageNet
测试集上的评估结果。
a. 超参数设计
定义 为地一个fire
模块的输出通道数,假设每 个 fire
模块将fire
模块的输出通道数增加 。如:,则网络中所有fire
模块的输出通道数依次为:
因此第 i 个 fire
模块的输出通道数为: 。由于fire
模块的输出就是fire
模块中expand
层的输出,因此 e_i 也就是第 i 个
fire
模块中expand
层的输出通道数。
则有:第 i 个 fire
模块的 squeeze
层的输出通道数为 。
定义 为所有fire
模块的expand
层中,3x3
卷积数量的比例。这意味着:不同fire
模块的expand
层中3x3
卷积数量的占比都是同一个比例。则有:
第 i 个fire
模块的expand
层中的1x1
卷积数量 。
第 i 个fire
模块的expand
层中的3x3
卷积数量 。
定义 SR (squeeze ratio
)为所有 fire
模块中,squeeze
层的输出通道数与expand
层的输出通道数的比例,称作压缩比。这意味着:不同fire
模块的压缩比都相同。
评估超参数 SR: ,SR 从 0.15~1.0
。
在 SR=0.75 时,ImageNet top-5
准确率达到峰值 86.0%
,此时模型大小为 19MB
。此后进一步增加 SR
只会增加模型大小而不会提高模型准确率。

4.评估超参数
从 1%~99%
。
在3x3
卷积占比(相对于expand
层的卷积数量的占比)为 50%
时,ImageNet top-5
准确率达到 85.3%
。此后进一步增加3x3
卷积的占比只会增加模型大小而几乎不会提高模型准确率。

b. 旁路连接
采用ResNet
的思想,可以在SqueezeNet
中添加旁路连接。下图中,左图为标准的SqueezeNet
,中图为引入简单旁路连接的SqueezeNet
,右图为引入复杂旁路连接的SqueezeNet
。
它们在ImageNet
测试集上的表现:
模型结构 | top-1 准确率 | top-5 准确率 | model size |
---|
SqueezeNet | 57.5% | 80.3% | 4.8MB |
SqueezeNet + 简单旁路连接 | 60.4% | 82.5% | 4.8MB |
SqueezeNet + 复杂旁路连接 | 58.8% | 82.0% | 7.7MB |
因此添加简单旁路连接能够提升模型的准确率,还能保持模型的大小不变。
- 简单旁路连接:就是一个恒等映射。此时要求输入
feature map
和残差feature map
的通道数相等。 - 复杂旁路连接:针对输入
feature map
和残差feature map
的通道数不等的情况,旁路采用一个1x1
卷积来调整旁路的输出通道数。
9.1.2 SqueezeNext
- 现有的神经网络在嵌入式系统上部署的主要挑战之一是内存和功耗,
SqueezeNext
针对内存和功耗进行优化,是为功耗和内存有限的嵌入式设备设计的神经网络。
9.1.2.1 SqueezeNext Block
SqueezeNext
块是在Fire
块的基础进行修改:
- 将
expand
层的3x3
卷积替换为1x3 + 3x1
卷积,同时移除了 expand
层的拼接 1x1
卷积、添加了1x1
卷积来恢复通道数。 - 通过两阶段的
squeeze
得到更激进的通道缩减,每个阶段的squeeze
都将通道数减半。
SqueezeNext
块也采用类似ResNet
的旁路连接,从而可以训练更深的网络。
下图中,左图为 ResNet
块,中图为 SqueezeNet
的 Fire
块,右图为SqueezeNext
块。

9.1.2.2 网络性能
网络结构:如下为一个23层的SqueezeNext
网络(记做SqueezeNext-23
)。
- 相同颜色的
SqueezeNext
块具有相同的输入feature map
尺寸和通道数。 - 该网络结构描述为
[6,6,8,1]
,意思是:在第一个conv/pooling
层之后有四组SqueezeNext
块,每组SqueezeNext
分别有6个、6个、8个、1个 SqueezeNext
块。 - 在全连接层之前插入一个
1x1
卷积层来降低全连接层的输入通道数,从而大幅降低全连接层的参数数量。 23层SqueezeNext
网络的另一种结构(记做SqueezeNext-23v5
):结构描述为[2,4,14,1]
。

SqueezeNext
网络在ImageNet
上的预测准确率:
模型 | top-1 准确率 | top-5 准确率 | 参数数量(百万) | 参数降低倍数 |
---|
AlexNet | 57.10% | 80.30% | 60.9 | 1x |
SqueezeNet | 57.50% | 80.30% | 1.2 | 51x |
SqueezeNext-23 | 59.05% | 82.60% | 0.72 | 84x |
G-SqueezeNext-23 | 57.16% | 80.23% | 0.54 | 112x |
SqueezeNext-34 | 61.39% | 84.31% | 1.0 | 61x |
SqueezeNext-44 | 62.64% | 85.15% | 1.2 | 51x |
- 参数降低倍数是相对于
AlexNet
网络的参数而言。 G-SqueezeNext-23
是SqueezeNext-23
采用分组卷积的版本。
更宽和更深版本的SqueezeNext
网络在ImageNet
上的预测准确率:
模型 | top-1 准确率 | top-5 准确率 | 参数数量(百万) |
---|
1.5-SqueezeNext-23 | 63.52% | 85.66% | 1.4 |
1.5-SqueezeNext-34 | 66.00% | 87.40% | 2.1 |
1.5-SqueezeNext-44 | 67.28% | 88.15% | 2.6 |
VGG-19 | 68.50% | 88.50% | 138 |
2.0-SqueezeNext-23 | 67.18% | 88.17% | 2.4 |
2.0-SqueezeNext-34 | 68.46% | 88.78% | 3.8 |
2.0-SqueezeNext-44 | 69.59% | 89.53% | 4.4 |
MobileNet | 67.50%(70.9%) | 86.59%(89.9%) | 4.2 |
2.0-SqueezeNext-23v5 | 67.44%(69.8%) | 88.20%(89.5%) | 3.2 |
1.5/2.0
分别表示将网络拓宽1.5/2
倍。拓宽指的增加网络的feature map
的通道数,做法是增加第一个conv
的输出通道数。- 括号中的准确率是采用了数据集增强和超参数优化之后的最佳结果。
括号中的准确率是采用了数据集增强和超参数优化之后的最佳结果。
Time
表示模型的推断时间(相对耗时),Energy
表示模型的推断功耗。
8x8,32KB
和16x16,128KB
表示仿真硬件的配置:
NxN
表示硬件具有NxN
个PE
阵列。processing element:PE
是单个计算单元。
深度可分离卷积的计算密集性较差,因为其计算/带宽
比例较低,所以在某些移动设备上表现较差。
一个可分离卷积的计算需要多次 IO
和计算才能完成,相比而言普通卷积只需要一次IO
和计算。
9.2 MobileNet 系列
9.2.1 MobileNet
MobileNet
应用了Depthwise
深度可分离卷积来代替常规卷积,从而降低计算量,减少模型参数。
MobileNet
不仅产生了小型网络,还重点优化了预测延迟。
与之相比,有一些小型网络虽然网络参数较少,但是预测延迟较大。
9.2.1.1 深度可分离卷积
对于传统的卷积层,单个输出feature
这样产生:
这里不同位置处的通道加权和的权重不同,这意味着在空间相关性的基础上,叠加了通道相关性。
Depthwise
深度可分离卷积打破了空间相关性和通道相关性的混合:
这里不同位置处的通道加权和的权重都相同,这意味着这一步仅仅考虑通道相关性。
首先由一组滤波器对输入的各通道执行滤波,生成滤波feature
。这一步仅仅考虑空间相关性。
然后执行1x1
卷积来组合不同滤波feature
。
首先由一组滤波器对输入的各通道执行滤波,生成滤波feature
。这一步仅仅考虑空间相关性。
然后计算各通道的滤波feature
的加权和,得到单个feature
。
常规卷积和Depthwise
可分离卷积的结构区别(带BN
和 ReLU
):(左图为常规卷积,右图为Depthwise
可分离卷积)

9.2.1.2 网络结构
Conv
表示标准卷积,Conv dw
表示深度可分离卷积。- 所有层之后都跟随
BN
和 ReLU
(除了最后的全连接层,该层的输出直接送入到softmax
层进行分类)。
MobileNet
大量的参数和计算量都被消耗在 1x1
卷积上:
层类型 | 乘-加运算 | 参数数量 |
---|
Conv 1x1 | 94.86% | 74.59% |
Conv DW 3x3 | 3.06% | 1.06% |
Conv 3x3 | 1.19% | 0.02% |
全连接层 | 0.18% | 24.33% |
Conv 1x1
包含了所有的1x1
卷积层,包括可分离卷积中的1x1
卷积。Conv DW 3x3
仅包括可分离卷积中的 3x3
卷积。
与训练大模型相反,训练MobileNet
时较少的采用正则化和数据集增强技术,因为MobileNet
是小模型,而小模型不容易过拟合。
论文特别提到:在depthwise
滤波器上使用很少或者不使用 L2
正则化,因为它们的参数很少。
9.2.1.3 宽度乘子 & 分辨率乘子
尽管基本的MobileNet
架构已经很小,延迟很低,但特定应用需要更快的模型。为此MobileNet
引入了两个超参数:宽度乘子、分辨率乘子
宽度乘子width multiplier
,记做 。其作用是:在每层均匀的缩减网络(实际上是减小每层网络的输入、输出 feature map
的通道数量)。
这可以通过直接调整第一层的输出通道数来实现。
通常将其设置为:0.25、0.5、0.75、1.0 四档。
- 宽度乘子应用于第一层(是一个全卷积层)的输出通道数上。这也影响了后续所有
Depthwise
可分离卷积层的输入feature map
通道数、输出feature map
通道数。
分辨率乘子resolution multiplier
,记做 \rho 。其作用是:降低输出的feature map
的尺寸。
这可以通过直接调整网络的输入尺寸来实现。
- 它不会改变模型的参数数量,但是大概以 的比例降低计算量。
- 分辨率乘子应用于输入图片上,改变了输入图片的尺寸。这也影响了后续所有
Depthwise
可分离卷积层的输入feature map
尺寸、输出feature map
尺寸。
如果模型同时实施了宽度乘子和分辨率乘子,则模型大概以 的比例减少了参数数量,大概以 的比例降低了计算量。
假设输入feature map
尺寸为14x14
,通道数为 512
;卷积尺寸为3x3
;输出feature map
尺寸为14x14
,通道数为512
。
层类型 | 乘-加操作(百万) | 参数数量(百万) |
---|
常规卷积 | 462 | 2.36 |
深度可分离卷积 | 52.3 | 0.27 |
=0.75 的深度可分离卷积 | 29.6 | 0.15 |
=0.75,\rho=0.714 的深度可分离卷积 | 15.1 | 0.15 |
9.2.1.4 网络性能
常规卷积和深度可分离卷积的比较:使用深度可分离卷积在ImageNet
上只会降低 1% 的准确率,但是计算量和参数数量大幅度降低。
模型 | ImageNet Accuracy | 乘-加操作(百万) | 参数数量(百万) |
---|
常规卷积的MobileNet | 71.7% | 4866 | 29.3 |
MobileNet | 70.6% | 569 | 4.2 |
更瘦的模型和更浅的模型的比较:在计算量和参数数量相差无几的情况下,采用更瘦的MobileNet
比采用更浅的MobileNet
更好。
模型 | ImageNet Accuracy | 乘-加操作(百万) | 参数数量(百万) |
---|
更瘦的MobileNet | 68.4% | 325 | 2.6 |
更浅的MobileNet | 65.3% | 307 | 2.9 |
- 更瘦的模型:采用 =0.75 宽度乘子(
瘦
表示模型的通道数更小)。 - 更浅的模型:删除了
MobileNet
中5x Conv dw/s
部分(即:5层 feature size=14x14@512
的深度可分离卷积)。
不同宽度乘子的比较:随着 降低,模型的准确率一直下降( 表示基准 MobileNet
)。
with multiplier | ImageNet Accuracy | 乘-加 操作(百万) | 参数数量(百万) |
---|
1.0 | 70.6% | 569 | 4.2 |
0.75 | 68.4% | 325 | 2.6 |
0.5 | 63.7% | 149 | 1.3 |
0.25 | 50.6% | 41 | 0.5 |
不同分辨率乘子的比较:随着 的降低,模型的准确率一直下降( 表示基准MobileNet
)。
resolution | ImageNet Accuracy | 乘-加 操作(百万) | 参数数量(百万) |
---|
224x224 | 70.6% | 569 | 4.2 |
192x192 | 69.1% | 418 | 4.2 |
160x160 | 67.2% | 290 | 4.2 |
128x128 | 64.4% | 186 | 4.2 |
根据 和 分辨率为 {224,192,160,128} 两两组合得到 16 个模型。
绘制这16个模型的accuracy
和计算量的关系:近似于 log
关系,但是在 有一个显著降低。

绘制这16个模型的accuracy
和参数数量的关系:

MobileNet
和其它模型的比较:
模型 | ImageNet Accuracy | 乘-加 操作(百万) | 参数数量(百万) |
---|
1.0 MobileNet-224 | 70.6% | 569 | 4.2 |
GoogleNet | 69.8% | 1550 | 6.8 |
VGG 16 | 71.5% | 15300 | 138 |
0.50 MobileNet-160 | 60.2% | 76 | 1.32 |
Squeezenet | 57.5% | 1700 | 1.25 |
AlexNet | 57.2% | 720 | 60 |
MobileNet
和 VGG 16
准确率相近,但是模型大小小了32倍,计算量小了27倍。- 瘦身的
MobileNet
(宽度乘子 ,分辨率乘子 )和 Squeezenet
模型大小差不多,但是准确率更高,计算量小了 22 倍。
文章须知
文章作者:华校专
责任编辑:周岩 Logic 破茧
审核
编辑:阿春
微信编辑:破茧
本文由『运筹OR帷幄』原创发布
如需转载请在公众号后台获取转载须知
原文链接:http://www.huaxiaozhuan.com/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/chapters/5_CNN_1_classfication.html

-
- 机器学习交流qq群955171419,加入微信群请扫码: