对于torch.nn.Conv2d()来说,传入的参数含义如下:
Sigmoid函数将特征压缩到了(0,1)区间,0端对应抑制状态,而1对应激活状态,中间部分梯度较大。Sigmoid函数可以用来做二分类,但其计算量较大,并且容易出现梯度消失现象。
为了缓解梯度消失现象,修正线性单元(Rectified Linear Unit,ReLU)被引入到神经网络中。由于其优越的性能与简单优雅的实现,ReLU已经成为目前卷积神经网络中最为常用的激活函数之一。ReLU函数计算简单,收敛快,并在众多卷积网络中验证了其有效性。
ReLU激活函数虽然高效,但是其将负区间所有的输入都强行置为0,Leaky ReLU函数优化了这一点,在负区间内避免了直接置0,而是赋予很小的权重。虽然从理论上讲,Leaky ReLU函数的使用效果应该要比ReLU函数好,但是从大量实验结果来看并没有看出其效果比ReLU好。此外,对于ReLU函数的变种,除了Leaky ReLU函数之外,还有PReLU和RReLU函数等。
多物体类别较为常用的分类器是Softmax函数。
在卷积网络中,通常会在卷积层之间增加池化(Pooling)层,以降低特征图的参数量,提升计算速度,增加感受野,是一种降采样操作。
池化是一种较强的先验,可以使模型更关注全局特征而非局部出现的位置,这种降维的过程可以保留一些重要的特征信息,提升容错能力,并且还能在一定程度上起到防止过拟合的作用。
Dropout算法,可以比较有效地缓解过拟合现象的发生,起到一定正则化的效果。
在训练时,每个神经元以概率p保留,即以1-p的概率停止工作,每次前向传播保留下来的神经元都不同,这样可以使得模型不太依赖于某些局部特征,泛化性能更强。在测试时,为了保证相同的输出期望值,每个参数还要乘以p。当然还有另外一种计算方式称为Inverted Dropout,即在训练时将保留下的神经元乘以1/p,这样测试时就不需要再改变权重。
至于Dropout为什么可以防止过拟合,可以从以下3个方面解释。
Dropout被广泛应用到全连接层中,一般保留概率设置为0.5,而在较为稀疏的卷积网络中则一般使用下一节将要介绍的BN层来正则化模型,使得训练更稳定。
为了追求更高的性能,卷积网络被设计得越来越深,然而网络却变得难以训练收敛与调参。原因在于,浅层参数的微弱变化经过多层线性变换与激活函数后会被放大,改变了每一层的输入分布,造成深层的网络需要不断调整以适应这些分布变化,最终导致模型难以训练收敛。
由于网络中参数变化导致的内部节点数据分布发生变化的现象被称做ICS(Internal Covariate Shift)。ICS现象容易使训练过程陷入饱和区,减慢网络的收敛。前面提到的ReLU从激活函数的角度出发,在一定程度上解决了梯度饱和的现象,而2015年提出的BN层,则从改变数据分布的角度避免了参数陷入饱和区。由于BN层优越的性能,其已经是当前卷积网络中的“标配”。BN层首先对每一个batch的输入特征进行白化操作,即去均值方差过程。
白化操作可以使输入的特征分布具有相同的均值与方差,固定了每一层的输入分布,从而加速网络的收敛。然而,白化操作虽然从一定程度上避免了梯度饱和,但也限制了网络中数据的表达能力,浅层学到的参数信息会被白化操作屏蔽掉,因此,BN层在白化操作后又增加了一个线性变换操作,让数据尽可能地恢复本身的表达能力。
γ与β为新引进的可学习参数,最终的输出为yi。
BN层可以看做是增加了线性变换的白化操作,在实际工程中被证 明了能够缓解神经网络难以训练的问题。BN层的优点主要有以下3点:
在测试时,由于是对单个样本进行测试,没有batch的均值与方差, 通常做法是在训练时将每一个batch的均值与方差都保留下来,在测试时,使用所有训练样本均值与方差的平均值。
BN层的具体实现:众所周知,BN层的输出Y与输入X之间的关系是:Y = (X - running_mean) / sqrt(running_var + eps) * gamma + beta,此不赘言。其中gamma、beta为可学习参数(在pytorch中分别改叫weight和bias),训练时通过反向传播更新;而running_mean、running_var则是在前向时先由X计算出mean和var,再由mean和var以动量momentum来更新running_mean和running_var。所以在训练阶段,running_mean和running_var在每次前向时更新一次;在测试阶段,则通过net.eval()固定该BN层的running_mean和running_var,此时这两个值即为训练阶段最后一次前向时确定的值,并在整个测试阶段保持不变。(引用自 https://zhuanlan.zhihu.com/p/102710590)
尽管BN层取得了巨大的成功,但仍有一定的弊端,主要体现在以 下两点:
因此,我们能不能避开batch来进行归一化呢?答案是可以的,最新的工作GN(Group Normalization)从通道方向计算均值与方差,使用更为灵活有效,避开了batch大小对归一化的影响。
具体来讲,GN先将特征图的通道分为很多个组,对每一个组内的 参数做归一化,而不是batch。GN之所以能够工作的原因,笔者认为是 在特征图中,不同的通道代表了不同的意义,例如形状、边缘和纹理 等,这些不同的通道并不是完全独立地分布,而是可以放到一起进行归 一化分析。
然而,随着深度学习算法的发展,全连接层的缺点也逐渐暴露了出 来,最致命的问题在于其参数量的庞大。在此以VGGNet为例说明,其 第一个全连接层的输入特征为7×7×512=25088个节点,输出特征是大小 为4096的一维向量,由于输出层的每一个点都来自于上一层所有点的权 重相加,因此这一层的参数量为25088×4096≈108。相比之下,VGGNet 最后一个卷积层的卷积核大小为3×3×512×512≈2.4×106,全连接层的参数量是这一个卷积层的40多倍。
大量的参数会导致网络模型应用部署困难,并且其中存在着大量的 参数冗余,也容易发生过拟合的现象。在很多场景中,我们可以使用全局平均池化层(Global Average Pooling,GAP)来取代全连接层,这种思想最早见于NIN(Network in Network)网络中,总体上,使用GAP有 如下3点好处:
卷积层和池化层都会影响感受野,而激活函数层通常对于感受野没有影响。对于一般的卷积神经网络,感受野可由式(3-9)和式(3-10) 计算得出。
其中,RFl+1与RFl分别代表第l+1层与第l层的感受野,k代表第l+1层 卷积核的大小,Sl代表前l层的步长之积。注意,当前层的步长并不影响 当前层的感受野。
通过上述公式求取出的感受野通常很大,而实际的有效感受野 (Effective Receptive Field)往往小于理论感受野。从图3.10也可以看 出,虽然第三层的感受野是7×7,但是输入层中边缘点的使用次数明显比中间点要少,因此做出的贡献不同。经过多层的卷积堆叠之后,输入 层对于特征图点做出的贡献分布呈高斯分布形状。
理解感受野是理解卷积神经网络工作的基础,尤其是对于使用Anchor作为强先验区域的物体检测算法,如Faster RCNN和SSD,如何 设置Anchor的大小,Anchor应该对应在特征图的哪一层,都应当考虑感 受野。通常来讲,Anchor的大小应该与感受野相匹配,尤其是有效的感 受野,过大或过小都不好。
在卷积网络中,有时还需要计算特征图的大小,一般可以按照式 (3-11)进行计算。
其中,nin与nout分别为输入特征图与输出特征图的尺寸,p代表这一 层的padding大小,k代表这一层的卷积核大小,s为步长。
空洞卷积,顾名思义就是卷积核中间带有一些洞,跳过一些元素进 行卷积。图3.11b代表了空洞数为2的空洞卷积,可以看到,在特征图上每2行或者2列选取元素与卷积核卷积。类似地,图3.11c代表了空洞数为3的空洞卷积。
在代码实现时,空洞卷积有一个额外的超参数dilation rate,表示空洞数,普通卷积dilation rate默认为1,图3.11中的b与c的dilation rate分别 为2与3。
空洞卷积在不增加参数量的前提下,增大了感受野。 假设空洞卷积的卷积核大小为k,空洞数为d,则其等效卷积核大小k'为
在计算感受野时,只需要将原来的卷积核大小k更换为k'即可。
空洞卷积的优点显而易见,在不引入额外参数的前提下可以任意扩 大感受野,同时保持特征图的分辨率不变。这一点在分割与检测任务中 十分有用,感受野的扩大可以检测大物体,而特征图分辨率不变使得物体定位更加精准。
当然,空洞卷积也有自己的一些缺陷,主要表现在以下3个方面:
对于上述问题,有多篇文章提出了不同的解决方法,典型的有图森未来提出的HDC(Hybrid Dilated Convolution)结构。该结构的设计准则是堆叠卷积的dilation rate不能有大于1的公约数,同时将dilation rate设 置为类似于[1,2,5,1,2,5]这样的锯齿类结构。此外各dilation rate之间还需 要满足一个数学公式,这样可以尽可能地覆盖所有空洞,以解决网格效 应与远距离信息的相关性问题,具体细节可参考相关资料。
VGGNet(Visual Geometry Group Network)则将卷积网络进行了改良,探索了网络深度 与性能的关系,用更小的卷积核与更深的网络结构,取得了较好的效果。
VGGNet网络结构组成如图3.12所示,一共有6个不同的版本,最常用的是VGG16。VGGNet采用了五组卷积与三个全连接层,最后使用Softmax做分类。VGGNet有一个显著的特点:每次经过池化层(maxpool)后特征图的尺寸减小一倍,而通道数则增加一 倍(最后一个池化层除外)。
AlexNet中有使用到5×5的卷积核,而在VGGNet中,使用的卷积核 基本都是3×3,而且很多地方出现了多个3×3堆叠的现象,这种结构的优点在于,首先从感受野来看,两个3×3的卷积核与一个5×5的卷积核是一 样的;其次,同等感受野时,3×3卷积核的参数量更少。更为重要的是,两个3×3卷积核的非线性能力要比5×5卷积核强,因为其拥有两个激活函数,可大大提高卷积网络的学习能力。
VGGNet简单灵活,拓展性很强,并且迁移到其他数据集上的泛化能力也很好,因此时至今日有很多检测与分割算法仍采用VGGNet的网络骨架。
一般来说,增加网络的深度与宽度可以提升网络的性能,但是这样做也会带来参数量的大幅度增加,同时较深的网络需要较多的数据,否 则容易产生过拟合现象。除此之外,增加神经网络的深度容易带来梯度消失的现象。Inception v1(又 名GoogLeNet)网络较好地解决了这个问题。
Inception v1网络是一个精心设计的22层卷积网络,并提出了具有良好局部特征结构的Inception模块,即对特征并行地执行多个大小不同的卷积运算与池化,最后再拼接到一起。由于1×1、3×3和5×5的卷积运算 对应不同的特征图区域,因此这样做的好处是可以得到更好的图像表征信息。
Inception模块使用了三个不同大小的卷积核进行卷 积运算,同时还有一个最大值池化,然后将这4部分级联起来(通道拼接),送入下一层。
在上述模块的基础上,为进一步降低网络参数量,Inception又增加 了多个1×1的卷积模块。如图3.14所示,这种1×1的模块可以先将特征图降维,再送给3×3和5×5大小的卷积核,由于通道数的降低,参数量也有了较大的减少。值得一提的是,用1×1卷积核实现降维的思想,在后面的多个轻量化网络中都会使用到。
Inception v1网络一共有9个上述堆叠的模块,共有22层,在最后的 Inception模块处使用了全局平均池化。为了避免深层网络训练时带来的梯度消失问题,作者还引入了两个辅助的分类器,在第3个与第6个 Inception模块输出后执行Softmax并计算损失,在训练时和最后的损失一并回传。
Inception v1的参数量是AlexNet的1/12 ,VGGNet的 1/3,适合处理大规 模数据,尤其是对于计算资源有限的平台。
基本思想是 Inception 网络不需要人为决定使用哪个过滤器或者是否需要池化,而是由网络自行确定这些参数,你可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合。
Inception网络框架中会有额外的两个softmadx预测层,这两个预测层分别是从网络框架中间部分引出的分支,用于反向传播更新梯度,这样就避免了因梯度消失导致浅层的网络参数无法更新。注意这两个分支只在训练的时候防止梯度消失会用到,真正做预测的时候需要删除。
在Inception v1网络的基础上,随后又出现了多个Inception版本。 Inception v2进一步通过卷积分解与正则化实现更高效的计算,增加了BN层,同时利用两个级联的3×3卷积取代了Inception v1版本中的5×5卷 积,如图3.15所示,这种方式既减少了卷积参数量,也增加了网络的非线性能力。
更进一步,Inception v2将n×n的卷积运算分解为1×n与n×1两个卷积,如图3.16所示,这种分解的方式可以使计算成本降低33%。
此外,Inception v2还将模块中的卷积核变得更宽而不是更深,形成 第三个模块,以解决表征能力瓶颈的问题。Inception v2网络正是由上述的三种不同类型的模块组成的,其计算也更加高效。
Inception v3在Inception v2的基础上,使用了RMSProp优化器,在辅助的分类器部分增加了7×7的卷积,并且使用了标签平滑技术。
Inception v4则是将Inception的思想与残差网络进行了结合,显著提升了训练速度与模型准确率。
VGGNet与Inception出现后,学者们将卷积网络不断加深以寻求更优越的性能,然而随着网络的加深,网络却越发难以训练,一方面会产 生梯度消失现象;另一方面越深的网络返回的梯度相关性会越来越差, 接近于白噪声,导致梯度更新也接近于随机扰动。
ResNet(Residual Network,残差网络)较好地解决了这个问题,并获得了2015年ImageNet分类任务的第一名。此后的分类、检测、分割等 任务也大规模使用ResNet作为网络骨架。
ResNet的思想在于引入了一个深度残差框架来解决梯度消失问题, 即让卷积网络去学习残差映射,而不是期望每一个堆叠层的网络都完整地拟合潜在的映射(拟合函数)。如图3.17所示,对于神经网络,如果我们期望的网络最终映射为H(x),左侧的网络需要直接拟合输出H(x), 而右侧由ResNet提出的子模块,通过引入一个shortcut(捷径)分支,将需要拟合的映射变为残差F(x):H(x)-x。ResNet给出的假设是:相较于直接优化潜在映射H(x),优化残差映射F(x)是更为容易的。
在ResNet中,上述的一个残差模块称为Bottleneck。ResNet有不同 网络层数的版本,如18层、34层、50层、101层和152层,这里以常用的 50层来讲解。ResNet-50的网络架构如图3.18所示,最主要的部分在于中 间经历了4个大的卷积组,而这4个卷积组分别包含了3、4、6这3个 Bottleneck模块。最后经过一个全局平均池化使得特征图大小变为1×1, 然后进行1000维的全连接,最后经过Softmax输出分类得分。
由于F(x)+x是逐通道进行相加,因此根据两者是否通道数相同,存在两种Bottleneck结构。对于通道数不同的情况,比如每个卷积组的第 一个Bottleneck,需要利用1×1卷积对x进行Downsample操作,将通道数变为相同,再进行加操作。对于相同的情况下,两者可以直接进行相加。
ResNet论文翻译:https://www.jianshu.com/p/eae07a953727
上一节的ResNet通过前层与后层的“短路连接”(Shortcuts),加强了前后层之间的信息流通,在一定程度上缓解了梯度消失现象,从而可以将神经网络搭建得很深。更进一步,本节的主角DenseNet最大化了这 种前后层信息交流,通过建立前面所有层与后面层的密集连接,实现了特征在通道维度上的复用,使其可以在参数与计算量更少的情况下实现比ResNet更优的性能。
DenseNet的网络架构如图3.19所示,网络由多个Dense Block与中间的卷积池化组成,核心就在Dense Block中。Dense Block中的黑点代表 一个卷积层,其中的多条黑线代表数据的流动,每一层的输入由前面的所有卷积层的输出组成。注意这里使用了通道拼接(Concatnate)操作,而非ResNet的逐元素相加操作。
DenseNet的结构有如下两个特性:
具体的Block实现细节如图3.20所示,每一个Block由若干个 Bottleneck的卷积层组成,对应图3.19中的黑点。Bottleneck由BN、 ReLU、1×1卷积、BN、ReLU、3×3卷积的顺序构成。
关于Block,有以下4个细节需要注意:
DenseNet网络的优势主要体现在以下两个方面:
DenseNet的不足在于由于需要进行多次Concatnate操作,数据需要被复制多次,显存容易增加得很快,需要一定的显存优化技术。另外, DenseNet是一种更为特殊的网络,ResNet则相对一般化一些,因此 ResNet的应用范围更广泛。
为了增强语义性,传统的物体检测模型通常只在深度卷积网络的最 后一个特征图上进行后续操作,而这一层对应的下采样率(图像缩小的倍数)通常又比较大,如16、32,造成小物体在特征图上的有效信息较少,小物体的检测性能会急剧下降,这个问题也被称为多尺度问题。
解决多尺度问题的关键在于如何提取多尺度的特征。传统的方法有 图像金字塔(Image Pyramid),主要思路是将输入图片做成多个尺度, 不同尺度的图像生成不同尺度的特征,这种方法简单而有效,大量使用在了COCO等竞赛上,但缺点是非常耗时,计算量也很大。
从前面几节内容可以知道,卷积神经网络不同层的大小与语义信息 不同,本身就类似一个金字塔结构。2017年的FPN(Feature Pyramid Network)方法融合了不同层的特征,较好地改善了多尺度检测问题。FPN的总体架构如图3.21所示,主要包含自下而上网络、自上而下网络、横向连接与卷积融合4个部分。
对于实际的物体检测算法,需要在特征图上进行RoI(Region of Interests,感兴趣区域)提取,而FPN有4个输出的特征图,选择哪一个 特征图上面的特征也是个问题。FPN给出的解决方法是,对于不同大小 的RoI,使用不同的特征图,大尺度的RoI在深层的特征图上进行提取, 如P5,小尺度的RoI在浅层的特征图上进行提取,如P2,具体确定方 法,感兴趣的读者可以自行查看。
FPN将深层的语义信息传到底层,来补充浅层的语义信息,从而获得了高分辨率、强语义的特征,在小物体检测、实例分割等领域有着非常不俗的表现。
前面几节的网络骨架,如VGGNet和ResNet等,虽从各个角度出发提升了物体检测性能,但究其根本是为ImageNet的图像分类任务而设计的。而图像分类与物体检测两个任务天然存在着落差,分类任务侧重于全图的特征提取,深层的特征图分辨率很低;而物体检测需要定位出物体位置,特征图分辨率不宜过小,因此造成了以下两种缺陷:
针对以上问题,旷视科技提出了专为物体检测设计的DetNet结构, 引入了空洞卷积,使得模型兼具较大感受野与较高分辨率,同时避免了 3.6节中FPN的多次上采样,实现了较好的检测效果。
DetNet的网络结构如图3.22所示,仍然选择性能优越的ResNet-50作为基础结构,并保持前4个stage与ResNet-50相同,具体的结构细节有以 下3点:
DetNet这种精心设计的结构,在增加感受野的同时,获得了较大的特征图尺寸,有利于物体的定位。与此同时,由于各Stage的特征图尺寸相同,避免了上一节的上采样,既一定程度上降低了计算量,又有利于小物体的检测。
DetNet中Bottleneck的细节如图3.23所示,左侧的两个Bottleneck A 与Bottleneck B分别对应图3.22的A与B,右侧的为原始的ResNet残差结构。DetNet与ResNet两者的基本思想都是卷积堆叠层与恒等映射的相加,区别在于DetNet使用了空洞数为2的3×3卷积,这样使得特征图尺寸保持不变,而ResNet是使用了步长为2的3×3卷积。B相比于A,在恒等映射部分增加了一个1×1卷积,这样做可以区分开不同的Stage,并且实验发现这种做法对于特征金字塔式的检测非常重要。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。