LeNet
1998年
LeCun推出了LeNet网络,它是第一个广为流传的卷积神经网络。
LeNet网络包含了卷积层、池化层、全连接层,这些都是现代CNN网络的基本组件。输入层:二维图像,尺寸为
32x32。C1、C3、C5层:二维卷积层。其中
C5将输入的feature map(尺寸16@5x5)转化为尺寸为120x1x1的feature map,然后转换为长度为120的一维向量。这是一种常见的、将卷积层的输出转换为全连接层的输入的一种方法。
S2、S4层:池化层。使用sigmoid函数作为激活函数。后续的
CNN都使用ReLU作为激活函数。F6层:全连接层。输出层:由欧式径向基函数单元组成。
后续的
CNN使用softmax输出单元。下表中,
@分隔了通道数量和feature map的宽、高。网络层 核/池大小 核数量 步长 输入尺寸 输出尺寸 INPUT - - - - 1@32x32 C1 5x5 6 1 1@32x32 6@28x28 S2 2x2 - 2 6@28x28 6@14x14 C3 5x5 16 1 6@14x14 16@10x10 S4 2x2 - 2 16@10x10 16@5x5 C5 5x5 120 1 16@5x5 120@1x1 F6 - - - 120 84 OUTPUT - - - 84 10
AlexNet
2012年Hinton 和他的学生推出了AlexNet 。在当年的ImageNet 图像分类竞赛中,AlexeNet 以远超第二名的成绩夺冠,使得深度学习重回历史舞台,具有重大历史意义。
网络结构
AlexNet有5个广义卷积层和3个广义全连接层。- 广义的卷积层:包含了卷积层、池化层、
ReLU、LRN层等。 - 广义全连接层:包含了全连接层、
ReLU、Dropout层等。

- 广义的卷积层:包含了卷积层、池化层、
网络结构如下表所示:
输入层会将
3@224x224的三维图片预处理变成3@227x227的三维图片。第二层广义卷积层、第四层广义卷积层、第五层广义卷积层都是分组卷积,仅采用本
GPU内的通道数据进行计算。第一层广义卷积层、第三层广义卷积层、第六层连接层、第七层连接层、第八层连接层执行的是全部通道数据的计算。
第二层广义卷积层的卷积、第三层广义卷积层的卷积、第四层广义卷积层的卷积、第五层广义卷积层的卷积均采用
same填充。当卷积的步长为1,核大小为
3x3时,如果不填充0,则feature map的宽/高都会缩减 2 。因此这里填充0,使得输出feature map的宽/高保持不变。其它层的卷积,以及所有的池化都是
valid填充(即:不填充 0 )。第六层广义连接层的卷积之后,会将
feature map展平为长度为 4096 的一维向量。
编号 网络层 子层 核/池大小 核数量 步长 激活函数 输入尺寸 输出尺寸 第0层 输入层 - - - - - - 3@224x224 第1层 广义卷积层 卷积 11x11 96 4 ReLU 3@227x227 96@55x55 第1层 广义卷积层 池化 3x3 - 2 - 96@55x55 96@27x27 第1层 广义卷积层 LRN - - - - 96@27x27 96@27x27 第2层 广义卷积层 卷积 5x5 256 1 ReLU 96@27x27 256@27x27 第2层 广义卷积层 池化 3x3 - 2 - 256@27x27 256@13x13 第2层 广义卷积层 LRN - - - - 256@13x13 256@13x13 第3层 广义卷积层 卷积 3x3 384 1 ReLU 256@13x13 384@13x13 第4层 广义卷积层 卷积 3x3 384 1 ReLU 384@13x13 384@13x13 第5层 广义卷积层 卷积 3x3 256 1 ReLU 384@13x13 256@13x13 第5层 广义卷积层 池化 3x3 - 2 - 256@13x13 256@6x6 第6层 广义连接层 卷积 6x6 4096 1 ReLU 256@6x6 4096@1x1 第6层 广义连接层 dropout - - - - 4096@1x1 4096@1x1 第7层 广义连接层 全连接 - - - ReLU 4096 4096 第7层 广义连接层 dropout - - - - 4096 4096 第8层 广义连接层 全连接 - - - - 4096 1000 网络参数数量:总计约 6237万。
输出
Tensor size采用channel last风格描述。即227x227x3等价于前文的3@227x227。第6层广义连接层的卷积的参数数量最多,约3770万,占整体六千万参数的 60%。
原因是该子层的卷积核较大、输入通道数量较大、输出通道数量太多。该卷积需要的参数数量为:
。
编号 网络层 子层 输出 Tensor size 权重个数 偏置个数 参数数量 第0层 输入层 - 227x227x3 0 0 0 第1层 广义卷积层 卷积 55x55x96 34848 96 34944 第1层 广义卷积层 池化 27x27x96 0 0 0 第1层 广义卷积层 LRN 27x27x96 0 0 0 第2层 广义卷积层 卷积 27x27x256 614400 256 614656 第2层 广义卷积层 池化 13x13x256 0 0 0 第2层 广义卷积层 LRN 13x13x256 0 0 0 第3层 广义卷积层 卷积 13x13x384 884736 384 885120 第4层 广义卷积层 卷积 13x13x384 1327104 384 1327488 第5层 广义卷积层 卷积 13x13x256 884736 256 884992 第5层 广义卷积层 池化 6x6x256 0 0 0 第6层 广义连接层 卷积 4096×1 37748736 4096 37752832 第6层 广义连接层 dropout 4096×1 0 0 0 第7层 广义连接层 全连接 4096×1 16777216 4096 16781312 第7层 广义连接层 dropout 4096×1 0 0 0 第8层 广义连接层 全连接 1000×1 4096000 1000 4097000 总计 - - - - - 62,378,344
设计技巧
AlexNet 成功的主要原因在于:
- 使用
ReLU激活函数。 - 使用
dropout、数据集增强 、重叠池化等防止过拟合的方法。 - 使用百万级的大数据集来训练。
- 使用
GPU训练,以及的LRN使用。 - 使用带动量的
mini batch随机梯度下降来训练。
数据集增强



局部响应规范化


多GPU 训练
AlexNet 使用两个GPU训练。网络结构图由上、下两部分组成:一个GPU运行图上方的通道数据,一个GPU 运行图下方的通道数据,两个GPU 只在特定的网络层通信。即:执行分组卷积。
- 第二、四、五层卷积层的核只和同一个
GPU上的前一层的feature map相连。 - 第三层卷积层的核和前一层所有
GPU的feature map相连。 - 全连接层中的神经元和前一层中的所有神经元相连。
重叠池化
一般的池化是不重叠的,池化区域的大小与步长相同。
Alexnet中,池化是可重叠的,即:步长小于池化区域的大小。重叠池化可以缓解过拟合,该策略贡献了
0.4%的错误率。为什么重叠池化会减少过拟合,很难用数学甚至直观上的观点来解答。一个稍微合理的解释是:重叠池化会带来更多的特征,这些特征很可能会有利于提高模型的泛化能力。
优化算法

VGG-Net
VGG-Net是牛津大学计算机视觉组和DeepMind公司共同研发一种深度卷积网络,并且在2014年在ILSVRC比赛上获得了分类项目的第二名和定位项目的第一名。VGG-Net的主要贡献是:- 证明了小尺寸卷积核(
3x3)的深层网络要优于大尺寸卷积核的浅层网络。 - 证明了深度对网络的泛化性能的重要性。
- 验证了尺寸抖动
scale jittering这一数据增强技术的有效性。
- 证明了小尺寸卷积核(
VGG-Net最大的问题在于参数数量,VGG-19基本上是参数数量最多的卷积网络架构。
网络结构

通用结构:
输入层:固定大小的
224x224的RGB图像。卷积层:卷积步长均为1。
填充方式:填充卷积层的输入,使得卷积前后保持同样的空间分辨率。
3x3卷积:same填充,即:输入的上下左右各填充1个像素。1x1卷积:不需要填充。
卷积核尺寸:有
3x3和1x1两种。3x3卷积核:这是捕获左右、上下、中心等概念的最小尺寸。1x1卷积核:用于输入通道的线性变换。在它之后接一个
ReLU激活函数,使得输入通道执行了非线性变换。
池化层:采用最大池化。
- 池化层连接在卷积层之后,但并不是所有的卷积层之后都有池化。
- 池化窗口为
2x2,步长为 2 。
网络最后四层为::三个全连接层 + 一个
softmax层。- 前两个全连接层都是 4096个神经元,第三个全连接层是 1000 个神经元(因为执行的是 1000 类的分类)。
- 最后一层是
softmax层用于输出类别的概率。
所有隐层都使用
ReLU激活函数。
VGG-Net网络参数数量:其中第一个全连接层的参数数量为:
7x7x512x4096=1.02亿,因此网络绝大部分参数来自于该层。与
AlexNet相比,VGG-Net在第一个全连接层的输入feature map较大:7x7 vs 6x6,512 vs 256。网络 A , A-LRN B C D E 参数数量 1.13亿 1.33亿 1.34亿 1.38亿 1.44
设计技巧




Inception
Inception网络是卷积神经网络的一个重要里程碑。在Inception之前,大部分流行的卷积神经网络仅仅是把卷积层堆叠得越来越多,使得网络越来越深。这使得网络越来越复杂,参数越来越多,从而导致网络容易出现过拟合,增加计算量。而
Inception网络考虑的是多种卷积核的并行计算,扩展了网络的宽度。Inception Net核心思想是:稀疏连接。因为生物神经连接是稀疏的。Inception网络的最大特点是大量使用了Inception模块。
Inception v1
网络结构
InceptionNet V1是一个22层的深度网络。 如果考虑池化层,则有29层。如下图中的depth列所示。
网络具有三组Inception 模块,分别为:inception(3a)/inception(3b)、inception(4a)/inception(4b)/inception(4c)/inception(4d)/inception(4e)、inception(5a)、inception(5b)。三组Inception 模块被池化层分

- 下图给出了网络的层次结构和参数,其中:
type列:给出了每个模块/层的类型。patch size/stride列:给出了卷积层/池化层的尺寸和步长。output size列:给出了每个模块/层的输出尺寸和输出通道数。depth列:给出了每个模块/层包含的、含有训练参数层的数量。#1x1列:给出了每个模块/层包含的1x1卷积核的数量,它就是1x1卷积核的输出通道数。#3x3 reduce列:给出了每个模块/层包含的、放置在3x3卷积层之前的1x1卷积核的数量,它就是1x1卷积核的输出通道数。#3x3列:给出了每个模块/层包含的3x3卷积核的数量,它就是3x3卷积核的输出通道数。#5x5 reduce列:给出了每个模块/层包含的、放置在5x5卷积层之前的1x1卷积核的数量,它就是1x1卷积核的输出通道数。#5x5列:给出了每个模块/层包含的5x5卷积核的数量,它就是5x5卷积核的输出通道数。pool proj列:给出了每个模块/层包含的、放置在池化层之后的1x1卷积核的数量,它就是1x1卷积核的输出通道数。params列:给出了每个模块/层的参数数量。ops列:给出了每个模块/层的计算量。

Inception V1的参数数量为 697.7 万,其参数数量远远小于AlexNet(6千万)、VGG-Net(超过1亿)。
Inception V1 参数数量能缩减的一个主要技巧是:在inception(5b)输出到linear之间插入一个平均池化层avg pool。
- 如果没有平均池化层,则
inception(5b)到linear之间的参数数量为:7x7x1024x1024,约为 5 千万。 - 插入了平均池化层之后,
inception(5b)到linear之间的参数数量为:1x1x1024x1024,约为 1百万。
Inception 模块
原始的
Inception模块对输入同时执行:3个不同大小的卷积操作(1x1、3x3、5x5)、1个最大池化操作(3x3)。所有操作的输出都在深度方向拼接起来,向后一级传递。三种不同大小卷积:通过不同尺寸的卷积核抓取不同大小的对象的特征。
使用
1x1、3x3、5x5这些具体尺寸仅仅是为了便利性,事实上也可以使用更多的、其它尺寸的滤波器。1个最大池化:提取图像的原始特征(不经过过滤器)。

原始
Inception模块中,模块的输出通道数量为四个子层的输出通道数的叠加。这种叠加不可避免的使得Inception模块的输出通道数增加,这就增加了Inception模块中每个卷积的计算量。因此在经过若干个模块之后,计算量会爆炸性增长。解决方案是:在
3x3和5x5卷积层之前额外添加1x1卷积层,来限制输入给卷积层的输入通道的数量。注意:
1x1卷积是在最大池化层之后,而不是之前。这是因为:池化层是为了提取图像的原始特征,一旦它接在1x1卷积之后就失去了最初的本意。1x1卷积在3x3、5x5卷积之前。这是因为:如果1x1卷积在它们之后,则3x3卷积、5x5卷积的输入通道数太大,导致计算量仍然巨大。

辅助分类器
为了缓解梯度消失的问题,
InceptionNet V1给出了两个辅助分类器。这两个辅助分类器被添加到网络的中间层,它们和主分类器共享同一套训练数据及其标记。其中:- 第一个辅助分类器位于
Inception(4a)之后,Inception(4a)模块的输出作为它的输入。 - 第二个辅助分类器位于
Inception(4d)之后,Inception(4d)模块的输出作为它的输入。 - 两个辅助分类器的结构相同,包括以下组件:
- 一个尺寸为
5x5、步长为3的平均池化层。 - 一个尺寸为
1x1、输出通道数为128的卷积层。 - 一个具有
1024个单元的全连接层。 - 一个
drop rate = 70%的dropout层。 - 一个使用
softmax损失的线性层作为输出层。
- 一个尺寸为
- 第一个辅助分类器位于
在训练期间,两个辅助分类器的损失函数的权重是0.3,它们的损失被叠加到网络的整体损失上。在推断期间,这两个辅助网络被丢弃。
在
Inception v3的实验中表明:辅助网络的影响相对较小,只需要其中一个就能够取得同样的效果。事实上辅助分类器在训练早期并没有多少贡献。只有在训练接近结束,辅助分支网络开始发挥作用,获得超出无辅助分类器网络的结果。
两个辅助分类器的作用:提供正则化的同时,克服了梯度消失问题。
Inception v2
Inception v2的主要贡献是提出了Batch Normalization。论文指出,使用了Batch Normalization之后:可以加速网络的学习。
相比
Inception v1,训练速度提升了14倍。因为应用了BN之后,网络可以使用更高的学习率,同时删除了某些层。网络具有更好的泛化能力。
在
ImageNet分类问题的top5上达到4.8%,超过了人类标注top5的准确率。
Inception V2网络训练的技巧有:- 使用更高的学习率。
- 删除
dropout层、LRN层。 - 减小
L2正则化的系数。 - 更快的衰减学习率。学习率以指数形式衰减。
- 更彻底的混洗训练样本,使得一组样本在不同的
epoch中处于不同的mini batch中。 - 减少图片的形变。
Inception v2的网络结构比Inception v1有少量改动:5x5卷积被两个3x3卷积替代。这使得网络的最大深度增加了 9 层,同时网络参数数量增加 25%,计算量增加 30%。
28x28的inception模块从2个增加到3个。在
inception模块中,有的采用最大池化,有的采用平均池化。在
inception模块之间取消了用作连接的池化层。inception(3c),inception(4e)的子层采用步长为 2 的卷积/池化。
Pool+proj列给出了inception中的池化操作。avg+32意义为:平均池化层后接一个尺寸1x1、输出通道32的卷积层。max+pass through意义为:最大池化层后接一个尺寸1x1、输出通道数等于输入通道数的卷积层。

Inception V2的网络参数约为1126万。层 参数数量 conv1 9408 conv2 114688 inception-3a 218094 inception-3b 259072 inception-3c 384000 inception-4a 608193 inception-4b 663552 inception-4c 912384 inception-4d 1140736 inception-4e 1447936 inception-5a 2205696 inception-5b 2276352 fc 1024000 共 11264111 Inception V2在ImageNet测试集上的误差率:
Inception v3
虽然Inception v1 的参数较少,但是它的结构比较复杂,难以进行修改。原因有以下两点:
- 如果单纯的放大网络(如增加
Inception模块的数量、扩展Inception模块的大小),则参数的数量会显著增长,计算代价太大。 Inception v1结构中的各种设计,其对最终结果的贡献尚未明确。
因此Inception v3 的论文重点探讨了网络结构设计的原则。
网络结构
Inception v3的网络深度为42层,它相对于Inception v1网络主要做了以下改动:7x7卷积替换为3个3x3卷积。3个
Inception模块:模块中的5x5卷积替换为2个3x3卷积,同时使用后面描述的网格尺寸缩减技术。5个
Inception模块:模块中的5x5卷积替换为2个3x3卷积之后,所有的nxn卷积进行非对称分解,同时使用后面描述的网格尺寸缩减技术。2个
Inception模块:结构如下。它也使用了卷积分解技术,以及网格尺寸缩减技术。
Inception v3的网络结构如下所示:3xInception表示三个Inception模块,4xInception表示四个Inception模块,5xInception表示五个Inception模块。conv padded表示使用0填充的卷积,它可以保持feature map的尺寸。在
Inception模块内的卷积也使用0填充,所有其它的卷积/池化不再使用填充。

在
3xInception模块的输出之后设有一个辅助分类器。其结构如下:
Inception v3整体参数数量约 23,626,728万(论文Xception: Deep Learning with Depthwise Separable Convolutions)。
设计技巧
Inception v3 总结出网络设计的一套通用设计原则:
避免
representation瓶颈:representation的大小应该从输入到输出缓缓减小,避免极端压缩。在缩小feature map尺寸的同时,应该增加feature map的通道数。representation大小通常指的是feature map的容量,即feature map的width x height x channel。空间聚合:可以通过空间聚合来完成低维嵌入,而不会在表达能力上有较大的损失。因此通常在
nxn卷积之前,先利用1x1卷积来降低输入维度。猜测的原因是:空间维度之间的强相关性导致了空间聚合过程中的信息丢失较少。
平衡网络的宽度和深度:增加网络的宽度或者深度都可以提高网络的泛化能力,因此计算资源需要在网络的深度和宽度之间取得平衡。
卷积尺寸分解
大卷积核的分解:将大卷积核分解为多个小的卷积核。
如:使用2个
3x3卷积替换5x5卷积,则其参数数量大约是1个5x5卷积的 72% 。
nxn卷积核的非对称分解:将nxn卷积替换为1xn卷积和nx1卷积。- 这种非对称分解的参数数量是原始卷积数量的
。随着n的增加,计算成本的节省非常显著。 - 论文指出:对于较大的
feature map,这种分解不能很好的工作;但是对于中等大小的feature map(尺寸在12~20之间),这种分解效果非常好。

- 这种非对称分解的参数数量是原始卷积数量的
网格尺寸缩减


标签平滑正则化

Inception v4 & Inception - ResNet
Inception v4和Inception-ResNet在同一篇论文中给出。论文通过实验证明了:结合残差连接可以显著加速Inception的训练。性能比较:(综合采用了
144 crops/dense评估的结果,数据集:ILSVRC 2012的验证集 )网络 crops Top-1 Error Top-5 Error ResNet-151 dense 19.4% 4.5% Inception-v3 144 18.9% 4.3% Inception-ResNet-v1 144 18.8% 4.3% Inception-v4 144 17.7% 3.8% Inception-ResNet-v2 144 17.8% 3.7% Inception-ResNet-v2参数数量约为 5500万,Inception-ResNet-v1/Inception-v4的参数数量也在该量级。
Inception v4
在
Inception v4结构的主要改动:修改了
stem部分。引入了
Inception-A、Inception-B、Inception-C三个模块。这些模块看起来和Inception v3变体非常相似。Inception-A/B/C模块中,输入feature map和输出feature map形状相同。而Reduction-A/B模块中,输出feature map的宽/高减半、通道数增加。引入了专用的“缩减块”(
reduction block),它被用于缩减feature map的宽、高。早期的版本并没有明确使用缩减块,但是也实现了其功能。
Inception v4结构如下:(没有标记V的卷积使用same填充;标记V的卷积使用valid填充)
stem部分的结构:
Inception-A模块(这样的模块有4个):
Inception-B模块(这样的模块有7个):
Inception-C模块(这样的模块有3个):
Reduction-A模块:(其中
分别表示滤波器的数量)
网络 k l m n Inception-v4 192 224 256 384 Inception-ResNet-v1 192 192 256 384 Inception-ResNet-v2 256 256 256 384 Reduction-B模块:
Inception-ResNet
在
Inception-ResNet中,使用了更廉价的Inception块:inception模块的池化运算由残差连接替代。在
Reduction模块中能够找到池化运算。Inception ResNet有两个版本:v1和v2。v1的计算成本和Inception v3的接近,v2的计算成本和Inception v4的接近。v1和v2具有不同的stem。- 两个版本都有相同的模块
A、B、C和缩减块结构,唯一不同在于超参数设置。
Inception-ResNet-v1结构如下:
stem部分的结构:
Inception-ResNet-A模块(这样的模块有5个):
Inception-B模块(这样的模块有10个):
Inception-C模块(这样的模块有5个):
Reduction-A模块:同inception_v4的Reduction-A模块Reduction-B模块:
Inception-ResNet-v2结构与Inception-ResNet-v1基本相同 :stem部分的结构:同inception_v4的stem部分。Inception-ResNet-v2使用了inception v4的stem部分,因此后续的通道数量与Inception-ResNet-v1不同。Inception-ResNet-A模块(这样的模块有5个):它的结构与Inception-ResNet-v1的Inception-ResNet-A相同,只是通道数发生了改变。
Inception-B模块(这样的模块有10个):它的结构与Inception-ResNet-v1的Inception-ResNet-B相同,只是通道数发生了改变。
Inception-C模块(这样的模块有5个):它的结构与Inception-ResNet-v1的Inception-ResNet-C相同,只是通道数发生了改变。
Reduction-A模块:同inception_v4的Reduction-A模块。Reduction-B模块:它的结构与Inception-ResNet-v1的Reduction-B相同,只是通道数发生了改变。
如果滤波器数量超过1000,则残差网络开始出现不稳定,同时网络会在训练过程早期出现“死亡”:经过成千上万次迭代之后,在平均池化之前的层开始只生成 0 。
解决方案:在残差模块添加到
activation激活层之前,对其进行缩放能够稳定训练。降低学习率或者增加额外的BN都无法避免这种状况。这就是
Inception ResNet中的Inception-A,Inception-B,Inception-C为何如此设计的原因。- 将
Inception-A,Inception-B,Inception-C放置在两个Relu activation之间。 - 通过线性的
1x1 Conv(不带激活函数)来执行对残差的线性缩放。

- 将
Xception
一个常规的卷积核尝试在三维空间中使用滤波器抽取特征,包括:两个空间维度(宽度和高度)、一个通道维度。因此单个卷积核的任务是:同时映射跨通道的相关性和空间相关性。
Inception将这个过程明确的分解为一系列独立的相关性的映射:要么考虑跨通道相关性,要么考虑空间相关性。Inception的做法是:- 首先通过一组
1x1卷积来查看跨通道的相关性,将输入数据映射到比原始输入空间小的三个或者四个独立空间。 - 然后通过常规的
3x3或者5x5卷积,将所有的相关性(包含了跨通道相关性和空间相关性)映射到这些较小的三维空间中。
一个典型的
Inception模块(Inception V3)如下:
可以简化为:

- 首先通过一组
Xception将这一思想发挥到极致:首先使用1x1卷积来映射跨通道相关性,然后分别映射每个输出通道的空间相关性,从而将跨通道相关性和空间相关性解耦。因此该网络被称作Xception:Extreme Inception,其中的Inception块被称作Xception块。
Xception块类似于深度可分离卷积,但是它与深度可分离卷积之间有两个细微的差异:- 操作顺序不同:
- 深度可分离卷积通常首先执行
channel-wise空间卷积,然后再执行1x1卷积。 Xception块首先执行1x1卷积,然后再进行channel-wise空间卷积。
- 深度可分离卷积通常首先执行
- 第一次卷积操作之后是否存在非线性:
- 深度可分离卷积只有第二个卷积(
1x1)使用了ReLU非线性激活函数,channel-wise空间卷积不使用非线性激活函数。 Xception块的两个卷积(1x1和3x3)都使用了ReLU非线性激活函数。
- 深度可分离卷积只有第二个卷积(
其中第二个差异更为重要。
- 操作顺序不同:
对
Xception进行以下的修改,都可以加快网络收敛速度,并获取更高的准确率:- 引入类似
ResNet的残差连接机制。 - 在
1x1卷积和3x3卷积之间不加入任何非线性。
- 引入类似
Xception的参数数量与Inception V3相同,但是性能表现显著优于Inception V3。这表明Xception更加高效的利用了模型参数。根据论文
Xception: Deep Learning with Depthwise Separable Convolutions,Inception V3参数数量为 23626728,Xception参数数量为 22855952 。在
ImageNet上的benchmark为(单个模型,单次crop):模型 top-1 accuracy top-5 accuracy VGG-16 71.5% 90.1% ResNet-152 77.0% 93.3% Inception V3 78.2% 94.1% Xception 79.0% 94.5%
ResNet
ResNet提出了一种残差学习框架来解决网络退化问题,从而训练更深的网络。这种框架可以结合已有的各种网络结构,充分发挥二者的优势。ResNet以三种方式挑战了传统的神经网络架构:ResNet通过引入跳跃连接来绕过残差层,这允许数据直接流向任何后续层。这与传统的、顺序的
pipeline形成鲜明对比:传统的架构中,网络依次处理低级feature到高级feature。ResNet的层数非常深,高达1202层。而ALexNet这样的架构,网络层数要小两个量级。通过实验发现,训练好的
ResNet中去掉单个层并不会影响其预测性能。而训练好的AlexNet等网络中,移除层会导致预测性能损失。
在
ImageNet分类数据集中,拥有152层的残差网络,以3.75% top-5的错误率获得了ILSVRC 2015分类比赛的冠军。很多证据表明:残差学习是通用的,不仅可以应用于视觉问题,也可应用于非视觉问题。
网络退化问题
学习更深的网络的一个障碍是梯度消失/爆炸,该问题可以通过
Batch Normalization在很大程度上解决。ResNet论文作者发现:随着网络的深度的增加,准确率达到饱和之后迅速下降,而这种下降不是由过拟合引起的。这称作网络退化问题。如果更深的网络训练误差更大,则说明是由于优化算法引起的:越深的网络,求解优化问题越难。如下所示:更深的网络导致更高的训练误差和测试误差。

理论上讲,较深的模型不应该比和它对应的、较浅的模型更差。因为较深的模型是较浅的模型的超空间。较深的模型可以这样得到:先构建较浅的模型,然后添加很多恒等映射的网络层。
实际上我们的较深的模型后面添加的不是恒等映射,而是一些非线性层。因此,退化问题表明:通过多个非线性层来近似横等映射可能是困难的。
解决网络退化问题的方案:学习残差。
残差块



ResNet 分析
Veit et al.认为ResNet工作较好的原因是:一个ResNet网络可以看做是一组较浅的网络的集成模型。但是
ResNet的作者认为这个解释是不正确的。因为集成模型要求每个子模型是独立训练的,而这组较浅的网络是共同训练的。论文
《Residual Networks Bahave Like Ensemble of Relatively Shallow Networks》对ResNet进行了深入的分析。- 通过分解视图表明:
ResNet可以被视作许多路径的集合。 - 通过研究
ResNet的梯度流表明:网络训练期间只有短路径才会产生梯度流,深的路径不是必须的。 - 通过破坏性实验,表明:
- 即使这些路径是共同训练的,它们也不是相互依赖的。
- 这些路径的行为类似集成模型,其预测准确率平滑地与有效路径的数量有关。
- 通过分解视图表明:
分解视图


路径长度分析

路径梯度分析



路径破坏性分析



网络性能
plain网络:一些简单网络结构的叠加,如下图所示。图中给出了四种plain网络,它们的区别主要是网络深度不同。其中,输入图片尺寸 224x224 。ResNet简单的在plain网络上添加快捷连接来实现。FLOPs:floating point operations的缩写,意思是浮点运算量,用于衡量算法/模型的复杂度。FLOPS:floating point per second的缩写,意思是每秒浮点运算次数,用于衡量计算速度。
相对于输入的
feature map,残差块的输出feature map尺寸可能会发生变化:输出
feature map的通道数增加,此时需要扩充快捷连接的输出feature map。否则快捷连接的输出feature map无法和残差块的feature map累加。有两种扩充方式:
- 直接通过 0 来填充需要扩充的维度,在图中以实线标识。
- 通过
1x1卷积来扩充维度,在图中以虚线标识。
输出
feature map的尺寸减半。此时需要对快捷连接执行步长为 2 的池化/卷积:如果快捷连接已经采用1x1卷积,则该卷积步长为2 ;否则采用步长为 2 的最大池化 。

计算复杂度:
VGG-19 34层 plain 网络 Resnet-34 计算复杂度(FLOPs) 19.6 billion 3.5 billion 3.6 billion 模型预测能力:在
ImageNet验证集上执行10-crop测试的结果。A类模型:快捷连接中,所有需要扩充的维度的填充 0 。B类模型:快捷连接中,所有需要扩充的维度通过1x1卷积来扩充。C类模型:所有快捷连接都通过1x1卷积来执行线性变换。
可以看到
C优于B,B优于A。但是C引入更多的参数,相对于这种微弱的提升,性价比较低。所以后续的ResNet均采用B类模型。模型 top-1 误差率 top-5 误差率 VGG-16 28.07% 9.33% GoogleNet - 9.15% PReLU-net 24.27% 7.38% plain-34 28.54% 10.02% ResNet-34 A 25.03% 7.76% ResNet-34 B 24.52% 7.46% ResNet-34 C 24.19% 7.40% ResNet-50 22.85% 6.71% ResNet-101 21.75% 6.05% ResNet-152 21.43% 5.71%
ResNet 变种
恒等映射修正
在论文《Identity Mappings in Deep Residual Networks》中,ResNet 的作者通过实验证明了恒等映射的重要性,并且提出了一个新的残差单元来简化恒等映射。
新残差块
- 新的残差单元中,恒等映射添加到
ReLU激活函数之后。它使得训练变得更简单,并且提高了网络的泛化能力。




快捷连接验证




激活函数验证


网络性能
在 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% |
ResNeXt
通常提高模型准确率的方法是加深网络深度或者加宽网络宽度,但这些方法会增加超参数的数量、参数数量和计算量。
ResNeXt网络可以在不增加网络参数复杂度的前提下提高准确率,同时还减少了超参数的数量。ResNeXt的设计参考了VGG和Inception的设计哲学。VGG:网络通过简单地层叠相同结构的层来实现,因此网络结构简单。其缺点是网络参数太多,计算量太大。Inception:通过执行分裂-变换-合并策略来精心设计拓扑结构,使得网络参数较少,计算复杂度较低。这种分裂-变换-合并行为预期能够达到一个大的dense层的表达能力,但是计算复杂度要低的多。其缺点是:
- 每个“变换”中,滤波器的数量和尺寸等超参数都需要精细的设计。
- 一旦需要训练新的任务(如新任务是一个
NLP任务),可能需要重新设计网络结构。因此可扩展性不高。
ResNeXt结合了二者的优点:- 网络结构也是通过简单地层叠相同结构的层来实现。
- 网络的每一层都执行了
分裂-变换-合并策略。
在相同的参数数量和计算复杂度的情况下,
ResNeXt的预测性能要优于ResNet。- 它在
ILSVRC 2016分类任务中取得了第二名的成绩。 101层的ResNeXt就能够获得超过200层ResNet的准确率,并且计算量只有后者的一半。
- 它在
ResNeXt改进了ResNet网络结构,并提出了一个新的维度,称作“基数”cardinality。基数是网络的深度和网络的宽度之外的另一个重要因素。作者通过实验表明:增加基数比增加网络的深度或者网络的宽度更有效。
分裂-变换-合并


ResNeXt 块



通常ResNeXt 模块至少有三层。事实上它也可以有两层,此时它等效于一个宽的、密集模块。
- 此时并没有通过
1x1卷积进行降维与升维,而是在降维的过程中同时进行变换,在升维的过程中也进行变换。 - 如下图所示,它等价于图
(c)中,去掉中间的变换层(128,3x3,128层),同时将第一层、第三层的1x1替换为3x3卷积层。

网络性能
ResNeXt的两种重要超参数是:基数C和颈宽d。- 基数
C:决定了每个ResNeXt模块有多少条路径。 - 颈宽(
bottleneck width)d:决定了ResNeXt模块中第一层1x1卷积降维的维度。
这二者也决定了
ResNeXt模块等价形式中,通道分组卷积的通道数量为Cxd。- 基数
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 基数 vs 深度/宽度:基数越大越好。

与其它模型的预测能力比较(验证集误差,
single crop):ResNet/ResNeXt的图片尺寸为224x224和320x320;Inception的图片尺寸为299x299。
随机深度网络
随机深度网络提出了训练时随机丢弃网络层的思想,从而能够让网络深度增加到超过1000层,并仍然可以减少测试误差。
如图所示:在
CIFAR-10上,1202层的ResNet测试误差要高于110层的ResNet,表现出明显的过拟合。而1202层的随机深度网络(结合了ResNet)的测试误差要低于110层的ResNet。
神经网络的表达能力主要由网络深度来决定,但是过深的网络会带来三个问题:反向传播过程中的梯度消失、前向传播过程中的
feature消失、训练时间过长。虽然较浅的网络能够缓解这几个问题,但是较浅的网络表达能力不足,容易陷入欠拟合。
随机深度网络解决这一矛盾的策略是:构建具有足够表达能力的深度神经网络(具有数百层甚至数千层),然后:
在网络训练期间,对每个
mini batch随机地移除部分层来显著的减小网络的深度。移除操作:删除对应的层,并用跳跃连接来代替。
在网络测试期间,使用全部的网络层。
随机深度的思想可以和
ResNet结合。因为ResNet已经包含了跳跃连接,因此可以直接修改。
随机深度




网络性能


SENet
SENet提出了一种新的架构单元来解决通道之间相互依赖的问题。它通过显式地对通道之间的相互依赖关系建模,自适应的重新校准通道维的特征响应,从而提高了网络的表达能力。SENet以2.251% top-5的错误率获得了ILSVRC 2017分类比赛的冠军。SENet是和ResNet一样,都是一种网络框架。它可以直接与其他网络架构一起融合使用,只需要付出微小的计算成本就可以产生显著的性能提升。
SE 块


squeeze 操作


excitation 操作


SE 块使用



网络性能
网络结构:其中
fc,[16,256]表示SE块中的两个全连接层的输出维度。
在
ImageNet验证集上的计算复杂度和预测误差比较(single-crop)。original列:从各自原始论文中给出的结果报告。re-implementation列:重新训练得到的结果报告。SENet列:通过引入SE块之后的结果报告。GFLOPs/MFLOPs:计算复杂度,单位为G/M FLOPs。MobileNet采用的是1.0 MobileNet-224,ShuffleNet采用的是1.0 ShuffleNet 1x(g=3)。- 数据集增强和归一化:
- 随机裁剪成
224x224大小(Inception系列裁剪成299x299)。 - 随机水平翻转。
- 输入图片沿着通道归一化:每个像素减去本通道的像素均值。
- 随机裁剪成


在
ImageNet验证集上的预测误差比较(single-crop):其中
SENet-154(post-challenge)是采用320x320大小的图片来训练的。
DenseNet
DenseNet不是通过更深或者更宽的结构,而是通过特征重用来提升网络的学习能力。ResNet的思想是:创建从“靠近输入的层” 到 “靠近输出的层” 的直连。而DenseNet做得更为彻底:将所有层以前馈的形式相连,这种网络因此称作DenseNet。DenseNet具有以下的优点:- 缓解梯度消失的问题。因为每层都可以直接从损失函数中获取梯度、从原始输入中获取信息,从而易于训练。
- 密集连接还具有正则化的效应,缓解了小训练集任务的过拟合。
- 鼓励特征重用。网络将不同层学到的
feature map进行组合。 - 大幅度减少参数数量。因为每层的卷积核尺寸都比较小,输出通道数较少 (由增长率 k 决定)。
DenseNet具有比传统卷积网络更少的参数,因为它不需要重新学习多余的feature map。传统的前馈神经网络可以视作在层与层之间传递
状态的算法,每一层接收前一层的状态,然后将新的状态传递给下一层。这会改变
状态,但是也传递了需要保留的信息。ResNet通过恒等映射来直接传递需要保留的信息,因此层之间只需要传递状态的变化。DenseNet会将所有层的状态全部保存到集体知识中,同时每一层增加很少数量的feture map到网络的集体知识中。
DenseNet的层很窄(即:feature map的通道数很小),如:每一层的输出只有 12 个通道。
DenseNet 块


增长率

非线性变换 H_l

bottleneck

过渡层

网络性能




内存优化
内存消耗


内存优化



优化结果



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

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


- 模型性能:
- 网络压缩方法列:给出了网络裁剪方法,包括
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测试集上的评估结果。
可以看到,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% |




它们在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 |
因此添加简单旁路连接能够提升模型的准确率,还能保持模型的大小不变。
SqueezeNext
现有的神经网络在嵌入式系统上部署的主要挑战之一是内存和功耗,SqueezeNext 针对内存和功耗进行优化,是为功耗和内存有限的嵌入式设备设计的神经网络。
SqueezeNext Block
SqueezeNext块是在Fire块的基础进行修改:- 将
expand层的3x3卷积替换为1x3 + 3x1卷积,同时移除了expand层的拼接1x1卷积、添加了1x1卷积来恢复通道数。 - 通过两阶段的
squeeze得到更激进的通道缩减,每个阶段的squeeze都将通道数减半。

- 将
SqueezeNext块也采用类似ResNet的旁路连接,从而可以训练更深的网络。下图中,左图为
ResNet块,中图为SqueezeNet的Fire块,右图为SqueezeNext块。
网络性能
网络结构:如下为一个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上的预测准确率:- 参数降低倍数是相对于
AlexNet网络的参数而言。 G-SqueezeNext-23是SqueezeNext-23采用分组卷积的版本。
模型 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 - 参数降低倍数是相对于
更宽和更深版本的
SqueezeNext网络在ImageNet上的预测准确率:1.5/2.0分别表示将网络拓宽1.5/2倍。拓宽指的增加网络的feature map的通道数,做法是增加第一个conv的输出通道数。- 括号中的准确率是采用了数据集增强和超参数优化之后的最佳结果。
模型 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 硬件仿真结果:
- 括号中的准确率是采用了数据集增强和超参数优化之后的最佳结果。
Time表示模型的推断时间(相对耗时),Energy表示模型的推断功耗。8x8,32KB和16x16,128KB表示仿真硬件的配置:NxN表示硬件具有NxN个PE阵列。processing element:PE是单个计算单元。32KB/128KB表示全局缓存。


深度可分离卷积的计算密集性较差,因为其
计算/带宽比例较低,所以在某些移动设备上表现较差。一个可分离卷积的计算需要多次
IO和计算才能完成,相比而言普通卷积只需要一次IO和计算。
MobileNet 系列
MobileNet
MobileNet应用了Depthwise深度可分离卷积来代替常规卷积,从而降低计算量,减少模型参数。MobileNet不仅产生了小型网络,还重点优化了预测延迟。与之相比,有一些小型网络虽然网络参数较少,但是预测延迟较大
深度可分离卷积



网络结构
MobileNeet网络结构如下表所示。其中:Conv表示标准卷积,Conv dw表示深度可分离卷积。- 所有层之后都跟随
BN和ReLU(除了最后的全连接层,该层的输出直接送入到softmax层进行分类)。

MobileNet大量的参数和计算量都被消耗在1x1卷积上:Conv 1x1包含了所有的1x1卷积层,包括可分离卷积中的1x1卷积。Conv DW 3x3仅包括可分离卷积中的3x3卷积。
层类型 乘-加运算 参数数量 Conv 1x1 94.86% 74.59% Conv DW 3x3 3.06% 1.06% Conv 3x3 1.19% 0.02% 全连接层 0.18% 24.33% 与训练大模型相反,训练
MobileNet时较少的采用正则化和数据集增强技术,因为MobileNet是小模型,而小模型不容易过拟合。论文特别提到:在
depthwise滤波器上使用很少或者不使用L2正则化,因为它们的参数很少。
宽度乘子 & 分辨率乘子


网络性能




MobileNet V2
MobileNet V2 创新性的提出了具有线性bottleneck 的Inverted 残差块。
这种块特别适用于移动设备和嵌入式设备,因为它用到的张量都较小,因此减少了推断期间的内存需求。
线性bottleneck



bottleneck block
bottleneck block:输入feature map首先经过线性bottleneck来扩张通道数,然后经过深度可分离卷积,最后通过线性bottleneck来缩小通道数。输入
bootleneck输出通道数与输入通道数的比例称作膨胀比。- 通常较小的网络使用略小的膨胀比效果更好,较大的网络使用略大的膨胀比效果更好。
- 如果膨胀比小于 1 ,这就是一个典型的
resnet残差块。
可以在
bottleneck block中引入旁路连接,这种bottleneck block称作Inverted残差块,其结构类似ResNet残差块。在
ResNeXt残差块中,首先对输入feature map执行1x1卷积来压缩通道数,最后通过1x1卷积来恢复通道数。这对应了一个输入
feature map通道数先压缩、后扩张的过程。在
Inverted残差块中,首先对输入feature map执行1x1卷积来扩张通道数,最后通过1x1卷积来恢复通道数。这对应了一个输入
feature map通道数先扩张、后压缩的过程。这也是Inverted残差块取名为Inverted的原因。

当深度可分离卷积的步长为
1时,bottleneck block包含了旁路连接。当深度可分离卷积的步长不为
1时,bottleneck block不包含旁路连接。这是因为:输入feature map的尺寸与块输出feature map的尺寸不相同,二者无法简单拼接。虽然可以将旁路连接通过一个同样步长的池化层来解决,但是根据
ResNet的研究,破坏旁路连接会引起网络性能的下降。
事实上旁路连接有两个插入的位置:在两个
1x1卷积的前后,或者在两个Dwise卷积的前后。通过实验证明:在两个
1x1卷积的前后使用旁路连接的效果最好。在Imagenet测试集上的表现如下图:
bottleneck block可以看作是对信息的两阶段处理过程:- 阶段一:对输入
feature map进行降维,这一部分代表了信息的容量。 - 阶段二:对信息进行非线性处理,这一部分代表了信息的表达。
在
MobileNet v2中这二者是独立的,而传统网络中这二者是相互纠缠的。- 阶段一:对输入
网络性能
MobileNet V2的设计基于MobileNet v1,其结构如下:- 每一行代表一个或者一组相同结构的层,层的数量由
给定。 - 相同结构指的是:
- 同一行内的层的类型相同,由
Operator指定。其中bottleneck指的是bottleneck block。 - 同一行内的层的膨胀比相同,由
t指定。 - 同一行内的层的输出通道数相同,由
c指定。 - 同一行内的层:第一层采用步幅
s,其它层采用步幅1。
- 同一行内的层的类型相同,由
- 采用
ReLU6激活函数,因为它在低精度浮点运算的环境下表现较好。 - 训练过程中采用
dropout和BN。
- 每一行代表一个或者一组相同结构的层,层的数量由
与
MobileNet V1类似,MobileNet V2也可以引入宽度乘子、分辨率乘子这两个超参数。网络推断期间最大内存需求(
通道数/内存消耗(Kb)):采用 16 bit 的浮点运算。
网络在
ImageNet测试集上的表现:- 最后一列给出了预测单张图片的推断时间。
网络 Top 1 Params(百万) 乘-加 数量(百万) CPU MobileNet V1 70.6 4.2 575 113ms ShuffleNet (1.5) 71.5 3.4 292 - ShuffleNet (x2) 73.7 5.4 524 - NasNet-A 74.0 5.3 564 183ms MobileNet V2 72.0 3.4 300 75ms MobileNet V2(1.4) 74.7 6.9 585 143ms
ShuffleNet 系列
ShuffleNet
ShuffleNet 提出了 1x1分组卷积+通道混洗 的策略,在保证准确率的同时大幅降低计算成本。
ShuffleNet 专为计算能力有限的设备(如:10~150MFLOPs)设计。在基于ARM 的移动设备上,ShuffleNet 与AlexNet 相比,在保持相当的准确率的同时,大约 13 倍的加速。
ShuffleNet block
在
Xception和ResNeXt中,有大量的1x1卷积,所以整体而言1x1卷积的计算开销较大。如ResNeXt的每个残差块中,1x1卷积占据了乘-加运算的 93.4% (基数为32时)。在小型网络中,为了满足计算性能的约束(因为计算资源不够)需要控制计算量。虽然限制通道数量可以降低计算量,但这也可能会严重降低准确率。
解决办法是:对
1x1卷积应用分组卷积,将每个1x1卷积仅仅在相应的通道分组上操作,这样就可以降低每个1x1卷积的计算代价。1x1卷积仅在相应的通道分组上操作会带来一个副作用:每个通道的输出仅仅与该通道所在分组的输入(一般占总输入的比例较小)有关,与其它分组的输入(一般占总输入的比例较大)无关。这会阻止通道之间的信息流动,降低网络的表达能力。解决办法是:采用通道混洗,允许分组卷积从不同分组中获取输入。
- 如下图所示:
(a)表示没有通道混洗的分组卷积;(b)表示进行通道混洗的分组卷积;(c)为(b)的等效表示。 - 由于通道混洗是可微的,因此它可以嵌入到网络中以进行端到端的训练。

- 如下图所示:
ShuffleNet块的结构从ResNeXt块改进而来:下图中(a)是一个ResNeXt块,(b)是一个ShuffleNet块,(c)是一个步长为2的ShuffleNet块。在
ShuffleNet块中:第一个
1x1卷积替换为1x1分组卷积+通道随机混洗。第二个
1x1卷积替换为1x1分组卷积,但是并没有附加通道随机混洗。这是为了简单起见,因为不附加通道随机混洗已经有了很好的结果。在
3x3 depthwise卷积之后只有BN而没有ReLU。当步长为2时:
恒等映射直连替换为一个尺寸为
3x3、步长为2的平均池化。3x3 depthwise卷积的步长为2。将残差部分与直连部分的
feature map拼接,而不是相加。因为当
feature map减半时,为了缓解信息丢失需要将输出通道数加倍从而保持模型的有效容量。

网络性能
在
Shufflenet中,depthwise卷积仅仅在1x1卷积的输出feature map上执行。这是因为depthwise很难在移动设备上高效的实现,因为移动设备的计算/内存访问比率较低,所以仅仅在1x1卷积的输出feature map上执行从而降低开销。ShuffleNet网络由ShuffleNet块组成。网络主要由三个
Stage组成。- 每个
Stage的第一个块的步长为 2 ,stage内的块在其它参数上相同。 - 每个
Stage的输出通道数翻倍。
- 每个
在
Stage2的第一个1x1卷积并不执行分组卷积,因此此时的输入通道数相对较小。每个
ShuffleNet块中的第一个1x1分组卷积的输出通道数为:该块的输出通道数的1/4。使用较少的数据集增强,因为这一类小模型更多的是遇到欠拟合而不是过拟合。
复杂度给出了计算量(
乘-加运算),KSize给出了卷积核的尺寸,Stride给出了ShuffleNet block的步长,Repeat给出了ShuffleNet block重复的次数,g控制了ShuffleNet block分组的数量。g=1时,1x1的通道分组卷积退化回原始的1x1卷积。

超参数
g会影响模型的准确率和计算量。在ImageNet测试集上的表现如下:ShuffleNet sx表示对ShuffleNet的通道数增加到s倍。这通过控制Conv1卷积的输出通道数来实现。g越大,则计算量越小,模型越准确。其背后的原理是:小模型的表达能力不足,通道数量越大,则小模型的表达能力越强。
g越大,则准确率越高。这是因为对于ShuffleNet,分组越大则生成的feature map通道数量越多,模型表达能力越强。- 网络的通道数越小(如
ShuffleNet 0.25x),则这种增益越大。
随着分组越来越大,准确率饱和甚至下降。
这是因为随着分组数量增大,每个组内的通道数量变少。虽然总体通道数增加,但是每个分组提取有效信息的能力变弱,降低了模型整体的表征能力。
虽然较大
g的ShuffleNet通常具有更好的准确率。但是由于它的实现效率较低,会带来较大的推断时间。

通道随机混洗的效果要比不混洗好。在
ImageNet测试集上的表现如下:- 通道混洗使得分组卷积中,信息能够跨分组流动。
- 分组数
g越大,这种混洗带来的好处越大。

多种模型在
ImageNet测试集上的表现:比较分为三组,每一组都有相差无几的计算量。
给出了在该组中,模型相对于 MobileNet的预测能力的提升。MFLOPs表示乘-加运算量(百万),错误率表示top-1 error。ShuffleNet 0.5x(shallow,g=3)是一个更浅的ShuffleNet。考虑到MobileNet只有 28 层,而ShuffleNet有 50 层,因此去掉了Stage 2-4中一半的块,得到一个教浅的、只有 26 层的ShuffleNet。

在移动设备上的推断时间(
Qualcomm Snapdragon 820 processor,单线程):
ShuffleNet V2
ShuffleNet V2 基于一系列对照实验提出了高效网络设计的几个通用准则,并提出了ShuffleNet V2 的网络结构。
小型网络通用设计准则
目前衡量模型推断速度的一个通用指标是
FLOPs(即乘-加计算量)。事实上这是一个间接指标,因为它不完全等同于推断速度。如:MobileNet V2和NASNET-A的FLOPs相差无几,但是MobileNet V2的推断速度要快得多。如下所示为几种模型在
GPU和ARM上的准确率(在ImageNet验证集上的测试结果)、模型推断速度(通过Batch/秒来衡量)、计算复杂度(通过FLOPs衡量)的关系。在
ARM平台上batchsize=1, 在GPU平台上batchsize=8。准确率与模型容量成正比,而模型容量与模型计算复杂度成成比、计算复杂度与推断速度成反比。
因此:模型准确率越高,则推断速度越低;模型计算复杂度越高,则推断速度越低。

FLOPs和推断速度之间的差异有两个原因:- 除了
FLOPs之外,还有几个因素对推断速度有重要的影响。- 内存访问量(
memory access cost:MAC):在某些操作(如分组卷积)中,其时间开销占相当大比例。因此它可能是GPU这种具有强大计算能力设备的瓶颈。 - 模型并行度:相同
FLOPs的情况下,高并行度的模型比低并行度的模型快得多。
- 内存访问量(
- 即使相同的操作、相同的
FLOPs,在不同的硬件设备上、不同的库上,其推断速度也可能不同。
- 除了
MobileNet V2和ShuffleNet V1这两个网络非常具有代表性,它们分别采用了group卷积和depth-wise卷积。这两个操作广泛应用于其它的先进网络。利用实验分析它们的推断速度(以推断时间开销来衡量)。其中:宽度乘子均为1,
ShuffleNet V1的分组数g=3。从实验结果可知:
FLOPs指标仅仅考虑了卷积部分的计算量。虽然这部分消耗时间最多,但是其它操作包括数据IO、数据混洗、逐元素操作(ReLU、逐元素相加)等等时间开销也较大。
小型网络通用设计准则:


ShuffleNet V2 block


网络性能
ShuffleNet V2的网络结构类似ShuffleNet V1,主要有两个不同:- 用
ShuffleNet v2 block代替ShuffleNet v1 block。 - 在
Global Pool之前加入一个1x1卷积。

- 用
ShuffleNet V2可以结合SENet的思想,也可以增加层数从而由小网络变身为大网络。下表为几个模型在
ImageNet验证集上的表现(single-crop)。
ShuffleNet V2和其它模型的比较:- 根据计算复杂度分成
40,140,300,500+等四组,单位:MFLOPs。 - 准确率指标为模型在
ImageNet验证集上的表现(single-crop)。 GPU上的batchsize=8,ARM上的batchsize=1。- 默认图片尺寸为
224x224,标记为*的图片尺寸为160x160,标记为**的图片尺寸为192x192。

- 根据计算复杂度分成
ShuffleNet V2准确率更高。有两个原因:ShuffleNet V2 block的构建效率更高,因此可以使用更多的通道从而提升模型的容量。在每个
ShuffleNet V2 block,有一半通道的数据(
)直接进入下一层。这可以视作某种特征重用,类似于DenseNet。但是
ShuffleNet v2 block在特征Concat之后又执行通道混洗,这又不同于DenseNet。
IGCV 系列
设计小型化网络目前有两个代表性的方向,并且都取得了成功:
- 通过一系列低秩卷积核(其中间输出采用非线性激活函数)去组合成一个线性卷积核或者非线性卷积核。如用
1x3 +3x1卷积去替代3x3卷积 。 - 使用一系列稀疏卷积核去组成一个密集卷积核。如:交错卷积中采用一系列分组卷积去替代一个密集卷积。
IGCV
简化神经网络结构的一个主要方法是消除结构里的冗余。目前大家都认为现在深度神经网络结构里有很强的冗余性。
冗余可能来自与两个地方:
- 卷积核空间方向的冗余。通过小卷积核替代(如,采用
3x3、1x3、3x1卷积核)可以降低这种冗余。 - 卷积核通道方向的冗余。通过分组卷积、
depth-wise卷积可以降低这种冗余。
IGCV通过研究卷积核通道方向的冗余,从而减少网络的冗余性。- 卷积核空间方向的冗余。通过小卷积核替代(如,采用
事实上解决冗余性的方法有多种:
二元化:将卷积核变成二值的
-1和+1,此时卷积运算的乘加操作变成了加减操作。这样计算量就下降很多,存储需求也降低很多(模型变小)。浮点数转整数:将卷积核的
32位浮点数转换成16位整数。此时存储需求会下降(模型变小)。除了将卷积核进行二元化或者整数化之外,也可以将
feature map进行二元化/整数化。卷积核低秩分解:将大卷积核分解为两个小卷积核 ,如:将
100x100分解为100x10和10x100、将5x5分解为两个3x3。稀疏卷积分解:将一个密集的卷积核分解为多个稀疏卷积核。如分组卷积、
depth-wise卷积。
IGCV block
IGCV提出了一种交错卷积模块,每个模块由相连的两层分组卷积组成,分别称作第一层分组卷积primary group conv、第二层分组卷积secondary group conv。第一层分组卷积采用
3x3分组卷积,主要用于处理空间相关性;第二层分组卷积采用1x1分组卷积,主要用于处理通道相关性。每层分组卷积的每个组内执行的都是标准的卷积,而不是
depth-wise卷积。这两层分组卷积的分组是交错进行的。假设第一层分组卷积有
L个分组、每个分组M个通道,则第二层分组卷积有M个分组、每个分组L个通道。第一层分组卷积中,同一个分组的不同通道会进入到第二层分组卷积的不同分组中。
第二层分组卷积中,同一个分组的不同通道来自于第一层分组卷积的不同分组。
这两层分组卷积是互补的、交错的,因此称作交错卷积
Interleaved Group Convolution:IGCV。
这种严格意义上的互补需要对每层分组卷积的输出
feature map根据通道数重新排列Permutation。这不等于混洗,因为混洗不能保证严格意义上的通道互补。

由于分组卷积等价于稀疏卷积核的常规卷积,该稀疏卷积核是
block-diagonal(即:只有对角线的块上有非零,其它位置均为 0 )。因此
IGCV块等价于一个密集卷积,该密集卷积的卷积核由两个稀疏的、互补的卷积核相乘得到。


网络性能
IGCV网络结构如下表所示,其中:RegConv-Wc表示常规卷积,W表示卷积核的尺寸为WxW,c表示通道数量;Summation表示加法融合层(即常规的1x1卷积,而不是1x1分组卷积)。- 在
IGCV块之后紧跟BN和ReLU,即结构为:IGC block+BN+ReLU。 4x(3x3,8)表示分成4组,每组的卷积核尺寸为3x3输出通道数为 8 。- 网络主要包含3个
stage,B表示每个stage的块的数量。 - 某些
stage的输出通道数翻倍(对应于Output size减半),此时该stage的最后一个block的步长为2(即该block中的3x3卷积的步长为2) 。

- 在
IGCV网络的模型复杂度如下所示。SumFusion的参数和计算复杂度类似RegConv-W16,因此没有给出。
IGCV模型在CIFAR-10和CIFAR-100上的表现:
如果增加恒等映射,则结果为:

所有的模型比较:

IGCV模型在ImageNet上的表现:(输入224x224,验证集,single-crop)
超参数
L和M的选取:通过
IGCV在CIFAR100上的表现可以发现:L占据统治地位,随着
的增加模型准确率先上升到最大值然后缓缓下降。
IGCV2
IGCV2 block 的主要设计思想是:将 IGCV block 两个结构化的稀疏卷积核组成的交错卷积推广到更多个结构化的稀疏卷积核组成的交错卷积,从而进一步消除冗余性。
IGCV2 block


互补条件 & 平衡条件




网络性能





IGCV3
IGCV3 结合了块稀疏的卷积核(如:交错卷积) 和低秩的卷积核(如:bottleneck 模块),并放松了互补条件。
IGCV3 block


loose 互补条件

网络性能



CondenseNet
CondenseNet基于DenseNet网络,它在训练的过程中自动学习一个稀疏的网络从而减少了Densenet的冗余性。这种稀疏性类似于分组卷积,但是
CondenseNet从数据中自动学到分组,而不是由人工硬性规定分组。CondenseNet网络在GPU上具有高效的训练速度,在移动设备上具有高效的推断速度。MobileNet、ShuffleNet、NASNet都采用了深度可分离卷积,这种卷积在大多数深度学习库中没有实现。而CondenseNet采用分组卷积,这种卷积被大多数深度学习库很好的支持。准确的说,
CondenseNet在测试阶段采用分组卷积,在训练阶段采用的是常规卷积。
网络剪枝
有一些工作(
Compressing neural networks with the hashing trick、Deep networks with stochastic depth)表明:CNN网络中存在大量的冗余。DenseNet通过直接连接每个层的输出特征与之后的所有层来特征重用。但是如果该层的输出特征是冗余的或者不需要的,则这些连接会带来冗余。CNN网络可以通过权重剪枝从而在不牺牲模型准确率的条件下实现小型化。有不同粒度的剪枝技术:- 独立的权重剪枝:一种细粒度的剪枝,它可以带来高度稀疏的网络。但是它需要存储大量的索引来记录哪些连接被剪掉,并且依赖特定的硬件/软件设施。
filter级别剪枝:一种粗粒度的剪枝,它得到更规则的网络,且易于实现。但是它带来的网络稀疏性较低。
CondenseNet也可以认为是一种网络剪枝技术,它与以上的剪枝方法都不同:CondenseNet的网络剪枝发生、且仅仅发生在训练的早期。这比在网络整个训练过程中都采用L1正则化来获取稀疏权重更高效。CondenseNet的网络剪枝能产生比filter级别剪枝更高的网络稀疏性,而且网络结构也是规则的、易于实现的。
LGC


训练和测试






IGR 和 FDC



网络性能
CondenseNet与其它网络的比较:(*表示使用cosine学习率训练 600个 epoch)
CondenseNet与其它裁剪技术的比较:
CondenseNet的超参数的实验:(CIFAR-10,DenseNet-50为基准)裁剪策略:(
G=4)Full Model:不进行任何裁剪。Traditional Pruning:在训练阶段(300个epoch)完成时执行裁剪(因此只裁剪一次),裁剪方法与LGC一样。然后使用额外的300个 epoch 进行微调。

分组数量:(
C=8)- 这里的分组值得是
3x3分组卷积的分组数量。 - 随着分组数量的增加,测试误差逐渐降低。这表明
LGC可以降低网络的冗余性。

- 这里的分组值得是
浓缩因子:(
G=4)可以看到:
可以带来更好的效益;但是
时,网络的准确率和网络的FLOPs呈现同一个函数关系。这表明裁剪网络权重会带来更小的模型,但是也会导致一定的准确率损失。
在
ImageNet上的比较:网络结构:
为了降低参数,在
epoch 60时(一共120个epoch)裁剪了全连接层FC layer50% 的权重。思想与1x1卷积的LGC相同,只是
。
CondenseNet与其它网络的比较:
网络在
ARM处理器上的推断时间(输入尺寸为224x224):