经典的CNN架构
一、早期的CNN架构
LeNet
LeNet,(也称为LeNet-5,5代表使用了2个卷积层和3个全连接层)是一个经典的卷积神经网络架构,最初由Yann LeCun等人开发用于MNIST数据集手写数字(灰度图像 输入通道数为1,尺寸为28x28)识别。
二、现代的CNN架构
2.1 AlexNet
深度卷积神经网络 使用了8层(5个卷积层和3个全连接层)卷积神经网络,第一个在ImageNet 2012图像识别挑战赛中击败传统计算机视觉模型的大型神经网络。它首次证明了学习到的特征可以超越手工设计的特征。
深度网络设计思路——规则
2.2 VGG
使用重复块的网络,利用许多重复的神经网络块。
对于给定的感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核优于采用大的卷积核,因为可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少)。
原始VGG网络,称为VGG-11(11代表使用了8个卷积层和3个全连接层),有5个卷积块,其中前两个块各有一个卷积层,后三个块各包含两个卷积层。
VGGNet使用的全部都是3x3的小卷积核和2x2的池化核,通过重复使用简单的基础块来构建深度模型,达到不断加深网络以提升性能的效果。
2.3 NIN
网络中的网络,重复使用由卷积层和1 × 1卷积层(用来代替全连接层)来构建深层网络。
上图是NIN的网络结构图,可以明显的发现每个卷积层之间的多了一些全连接层操作。同时,在NiN最后的分类部分,作者还摒弃了传统的通过多次全连接来进行分类的处理,采用的是将最后输出的特征图以全局平均池化的方式来获得样本属于每个类别的置信度值,接着通过softmax层完成分类。
通过在原始CNN的网络层之间,再插入一些浅层的全连接网络。先利用这个浅层的网络来对各个阶段里所形成的非线性特征元素进行特征表示,然后再通过卷积层来完成分类类别间线性不可分的抽象表示,以此来提高模型最后的任务精度。
①MLP Convolution Layers
在每个像素的通道上分别使用多层感知机MLP。
NiN的想法是在每个像素位置(针对每个高度和宽度)应用一个全连接层,可以将其视为1 × 1卷积层。从另一个角度看,即将空间维度中的每个像素视为单个样本,将通道维度视为不同特征(feature)。
②Global Average Pooling
NiN和AlexNet之间的一个显著区别是NiN完全取消了 全连接层【这样做的弊端在于最后这部分的全连接网络极其容易过拟合(因为最后一个卷积层reshape后的向量可能高达数十万维),进而限制了模型的整体泛化能力。】。相反,NiN使用一个NiN块,其输出通道数等于标签类别的数量。最后放一个全局平均池化层,生成一个对数几率(logits)。全局平均池化的具体做法是取最后卷积输出的特征图中每一个特征图的均值来作为其中一个类别的logit值,然后再将其输入到softmax分类层进行分类。因此,这也就意味着如果你需要完成的是一个k分类的任务,那么模型最后的卷积输出一定得含有k个通道数。
NiN设计的一个优点是,它显著减少了模型所需参数的数量,从而缓解过拟合。
2.4 GoogLeNet
含并行连结的网络,使用并行连结的网络,通过不同窗口大小的卷积层和最大池化层来并行抽取信息。
GoogLeNet吸收了NiN模型中串联网络的思想,并在此基础上做了改进——提出了一个名为Inception的模块。最后,通过多个相互堆叠的Inception模块构成了最后的GoogLeNet网络。
在深度学习中,两个最直接的提高模型精度的方法就是加深模型的深度(如网络的层数)和宽度(如每一层卷积核的个数),但是这些做法就带来了两个弊端:①更大的尺度意味着模型将拥有海量的参数,在标注数据不够的情况下及其容易产生过拟合;②仅仅只是匀速的增加网络的深度都会带来巨大的计算开销。
一个解决上述问题的基本方法就是引入稀疏性(sparsity)。卷积网络既能够使得模型更加稀疏,同时在现有的计算设备上还能高效的进行运算。能够在卷积的层面(filter-level)实现模型的稀疏性,同时还能通过密集矩阵计算来充分的利用现有的设备。
通过多个基于密集矩阵计算的组件(component)来构造一个稀疏的组件。
Inception块基于卷积操作的最优局部稀疏结构:核心思想就是去考虑如何得到一个基于卷积网络的最优局部稀疏结构(optimal local sparse structure),并且这一稀疏结构还能简单的通过现有的密集组件(实际上指的就是密集矩阵乘法)来实现。
其本质上就是采用了 不同尺度的卷积核(不同大小的滤波器可以有效地识别不同范围的图像细节) 对输入进行特征提取,然后再将各个部分得到的结果进行组合,最后在输入到下一层的网络中。
在对原始的输入进行[3,3]或[5,5]的卷积之前,先 用[1,1]的卷积进行降维处理来降低Inception中的计算量。
GoogLeNet一共使用9个Inception块和全局平均池化层的堆叠来生成其估计值。Inception块之间的最大池化层可降低维度。
2.5 ResNet
残差网络,通过残差块构建跨层的数据通道,是计算机视觉中最流行的体系架构。何恺明团队提出了残差网络(ResNet),它在2015年的ImageNet图像识别挑战赛夺魁。ResNet是解决了深度CNN模型难训练的问题。
ResNet详细介绍
ResNet理解
深度网络的退化问题
从经验来看,网络的深度对模型的性能至关重要,当增加网络层数后,网络可以进行更加复杂的特征模式的提取,所以当模型更深时理论上可以取得更好的结果。实验(如下图示)发现深度网络出现了退化问题(Degradation problem):网络深度增加时,网络准确度出现饱和,甚至出现下降。
ResNet采用模块化的集合模式替代整体的卷积层,通过一个个的堆叠来替代不断增加的卷积层。ResNet在图像分类任务、对象检测和人脸识别取得了巨大的性能提升。借鉴了NIN(network in network,网络中的网络)模型思想,引入NIN块的概念。
残差块Residual Block——ResNet的基础架构
残差块是通过学习 残差H(x) - x 而不是直接学习完整的映射函数H(x)来工作的。引入Shortcut直连(Identity Shortcut Connection身份捷径连接)将输入数据x直接传递给输出F(x)。图中 F ( x ) F(x) F(x)表示残差, F ( x ) + x F(x)+x F(x)+x是最终的映射输出,网络的最终输出为 H ( x ) = F ( x ) + x H(x)=F(x)+x H(x)=F(x)+x。
举个例子,当输入x=5时,我们希望找到理想目标函数H(X),将其映射为5.1。即H(x)=5.1=F(x)+x,x=5,此时残差F(x)=0.1;进一步将5→5.2,残差F(x)=0.2。相比于H(x)的变化5.1→5.2,F(x)变化0.1→0.2,增加的百分比大大提高。因此后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化。
左边两层的残差块是Basic Block基本残差块用于浅层网络,主要用来构建ResNet18和ResNet34网络;右边三层的是Bottleneck瓶颈残差块用于深层网络。
经典的ResNet网络
(1) 浅层网络ResNet18, 34,基于BasicBlock块搭成;
(2) 深层网络ResNet50, 101, 152,基于Bottleneck块搭成
2.6 DenseNet
稠密连接网络,计算成本很高,但带来了更好的效果。
DenseNet详细介绍
DenseNet作者提出了这种新的网络结构,利用当前层与后面层的连结(Concatenate)使得每一层的信息得到充分的利用,缓解了梯度消失的同时,极大地减少了参数。
稠密网络主要由2部分构成:稠密块(dense block)和过渡层(transition layer)。前者定义如何连接输入和输出,而后者则控制通道数量,使其不会太复杂。
稠密块Dense Block
网络中的每一层都直接与其前面层相连,实现特征的重复利用。
含有三个Dense Blocks的DenseNet示意图。