本教程是深度学习简明教程系列的第二部分,旨在提取最精炼且必备的深度学习知识点,供读者快速学习及本人查阅复习所用,大多内容是本人结合个人理解补充细节整合而成,参考链接放在文章最后。
目录
第一章 AlexNet
1.1 结构与参数
AlexNet的网络结构如下图所示:
网络参数如下:
- 卷积层:5层
- 全连接层:3层
- 深度:8层
- 参数个数:60M
- 神经元个数:650k
- 分类数目:1000类
1.2 网络细节
1.2.1 分组卷积
由于当时的显卡容量问题,AlexNet 的60M个参数无法全部放在一张显卡上操作,所以采用了两张显卡分开操作的形式,其中在C3,R1,R2,R3层上出现交互,所谓的交互就是通道的合并,是一种串接操作。
1.2.2 全连接层
全连接层负责逻辑推断,所有的参数都需要学习得到。AlexNet中第一层全连接层用于链接卷积层的输出,并去除空间信息(通道数),是一种将三维矩阵变成向量的过程(一种全卷积操作),其操作如下:
输入特征图是W×H×C,那么卷积核的尺寸为W×H×C,这样的话整个输入特征图就变成了一个数,一共有k个数(第一层全连接层的神经元个数),就有K个W×H×C的卷积核,所以全连接层(尤其是第一层)的参数量是非常可怕的。
1.2.3 Softmax层
Softmax层不属于CNN中单独的层,一般要用CNN做分类的话,要将神经元的输出变成概率的形式,Softmax就是做这个的:
通过Softmax输出的就是概率,最后我们按照这个概率的大小确定到底属于哪一类(AlexNet最后的分类数目为1000)。
1.2.4 AlexNet中的参数量
在R1中卷积核尺寸是6×6×256而不是13×13×256,是因为在C1,C2,C5的卷积操作后,图像做了最大池化。可以看到,全连接层(尤其是第一层)参数数量占了绝大部分。
第二章 VGGNet
2.1 VGG简介
VGG 是 Visual Geometry Group 的缩写,它相对于 AlexNet 的改进手段在于两方面:
-
在第一层卷积层上采用更小的的卷积核,和更小的 stride;
-
在 AlexNet 的基础上加深它的卷积层数量。
2.2 网络结构与参数
AlexNet 有 5 层卷积层,而 VGG 就是针对这 5 层卷积层进行改造,共进行了 6 种配置,得到了 6 种网络结构,下面是配置图。
2.3 网络细节
2.3.1 3x3 卷积核
VGG 和 AlexNet 最大的不同就是 VGG 用大量的 3x3 卷积核替换了 AlexNet 的卷积核,3x3 卷积核是能够感受到上下、左右、重点的最小的感受野尺寸, 使用3x3 卷积核的好处在于:相同感受野下,参数更少,层数加深。对于C个通道的卷积核,7x7含有参数7x7xCxN, 3个3x3的参数个数为3x(3x3xCxN),参数大大减少。
2.3.2 1x1 卷积核
引入1x1卷积核的缘由:有的时候,我们想在不增加感受野的情况下,让网络加深,为的就是引入更多的非线性;
1x1卷积核的用处:不改变感受野的情况下,对特征图进行升维和降维,同时也加深了网络的深度(参数比3x3少)。
例如:如果输入图片通道是 3,卷积核的数量是 6 ,那么生成的 feature map 通道就是 6,这就是升维,如果卷积核的数量是 1,那么生成的 feature map 只有 1 个通道,这就是降维度。
2.3.3 其他细节
-
所有的 VGG 网络中,卷积核的 stride 是 1,padding 是 1
-
max-pooling 的滑动窗口大小是 2x2 ,stride 也是 2
2.4 总结
VGG论文给出了一个非常振奋人心的结论:卷积神经网络的深度增加和小卷积核的使用对网络的最终分类识别效果有很大的作用。
第三章 GoogleNet
获得高质量模型最保险的做法就是增加模型的深度(层数)或者是其宽度(层核大小或者神经元数),但是这种设计思路的容易出现如下的缺陷:
- 参数太多,若训练数据集有限,容易过拟合;
- 网络越大计算复杂度越大,难以应用;
- 网络越深,梯度越往后传越容易消失,难以优化模型。
解决上述缺点的根本方法是将全连接甚至一般的卷积都转化为稀疏连接(参数最好大部分为0),但是,计算机软硬件对非均匀稀疏数据的计算效率很差,现在的问题是有没有一种方法,既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。
3.1 Naive Inception
Inception架构的主要思想是找出如何用密集成分来近似最优的局部稀疏解。
Naive Inception 模块的作用:
- Naive Inception 模块一层内采用了不同大小的卷积核,并将输出拼接起来融合了不同尺度的特征;
- 使用这种结构可以让网络自行学习是否需要该层卷积或池化操作,以及使用什么类型的卷积核(部分卷积、池化模块参数为0,于是具有了稀疏性)。
3.2 GoogleNet Inception V1
Naive Inception模块中使用到了5x5的卷积核,计算量极大,为了降低参数量,Inception V1中使用了1x1的卷积核来进行降维,在3x3和5x5的过滤器前面,max pooling后面分别加上了1x1的卷积核,最后将它们全部Concatnate起来,卷积的参数数量比原来减少了4倍,得到的Inception V1模块如下图所示:
GoogleNet Inception V1主要是围绕如下两个思路设计的:
- 深度,文章采用了22层,为了避免梯度消失问题,GoogleNet巧妙的在不同深度处增加了两个loss来减弱梯度回传消失的现象;
- 宽度,增加了多种核 1x1,3x3,5x5,还有直接max pooling的获得特征图,为减少参数采用了Inception V1 模块,最终GoogleNet采用了9个Inception模块化结构。
网络的参数信息如下:
3.3 GoogleNet Inception V2
大尺寸的卷积核可以带来更大的感受野,也意味着更多的参数,为此,作者提出可以用2个连续的3x3卷积层(stride=1)组成的小网络来代替单个的5x5卷积层,这便是Inception V2结构:
同时,在GoogleNet Inception V2中还提出了著名的Batch Normalization。
3.4 GoogleNet Inception V3
任意 nxn 的卷积都可以通过 1xn 卷积后接 nx1 卷积来替代(节约大量参数,同时增加了深度,非线性表达能力增强),Inception V3模块考虑了使用 nx1 卷积核来取代原本3x3卷积:
注意:作者发现在网络的前期使用这种分解效果并不好,在中度大小的feature map上使用效果才会更好(建议feature map尺寸在12到20之间,用nx1卷积来代替大卷积核,文章中设定n=7来应对17x17大小的feature map)。
根据上述研究结果,Inception V3优化了Inception模块的结构,处理35x35、17x17和8x8三种不同输入,这些Inception模块只在网络后部出现,前面还是普通卷积层。
3.5 GoogleNet Inception V4
Inception V4结构结合了残差神经网络ResNet。
3.6 Xception
当时提出Inception的初衷可以认为是:特征的提取和传递可以通过1*1卷积,3*3卷积,5*5卷积,pooling等,到底哪种才是最好的提取特征方式呢?Inception结构将这个疑问留给网络自己训练,也就是将一个输入同时输给这几种提取特征方式,然后做concat。Inception v3和Inception v1对比主要是将5*5卷积换成两个3*3卷积层的叠加。
于是从Inception v3联想到了一个简化的Inception结构,就是Figure 2。
再将Figure2延伸,就有了Figure3,表示对于一个输入,先用一个统一的1*1卷积核卷积,然后连接3个3*3的卷积层吗,每个卷积层的卷积核数量为1/3 channel。再从Figure3延伸就得到Figure4,也就是3*3卷积的个数和1*1卷积的输出channel个数一样,每个3*3卷积核都是和1个输入channel做卷积。
这就是我们常说的深度可分离卷积,其实就是把标准卷积分解成深度卷积(depthwise convolution)和逐点卷积(pointwise convolution),这么做的好处就是可以再损失精度不多的情况下大幅度降低参数量和计算量。
下图是Xception的结构图。这里的sparsableConv就是depthwise separable convolution。
Xception作为Inception v3的改进,主要是在Inception v3的基础上引入了depthwise separable convolution,在基本不增加网络复杂度的前提下提高了模型的效果。
第四章 ResNet
4.1 意义
随着网络的加深,模型参数更难学习,会出现准确率下降的现象。作者针对这个问题提出了一种全新的网络,叫深度残差网络,它允许网络尽可能的加深。ResNet提出了两种mapping:
- 一种是identity mapping,指的就是下图中”弯弯的曲线”;
- 另一种是residual mapping,指的就是除了”弯弯的曲线“那部分;
所以最后的输出是 y=F(x)+x ,identity mapping是指“恒等映射”,也就是公式中的x,而residual mapping是指“残差映射”,也就是y−x,所以残差指的就是F(x)部分。
Q:为什么ResNet可以解决“随着网络加深,准确率下降”的问题?
A:
- 相比于直接学习信号,学习残差在许多研究中被证明更为有效,可以简化学习的过程;
- 使用残差结构,由于它包含了恒等映射,网络加深后仍能够有效的进行梯度反向传播,有利于参数学习;
- ResNet打破了网络的对称性,可以减缓网络退化的问题;
- 深层的残差网络可以看做是不同深度的浅层神经网络的ensemble,这么做可以增强网络的泛化能力。
4.2 网络结构
ResNet使用了shortcut connection,即跳远连接,论文分别针对ResNet34(左图)和ResNet50/101/152(右图)设计了两种结构:
一般称整个结构为一个”building block“。其中右图又称为“bottleneck design”,目的一目了然,就是为了降低参数的数目。
Q:如果F(x)和x的channel个数不同怎么办,channel不同怎么相加呢?
A: 如图所示,我们可以清楚的“实线”和“虚线”两种连接方式
- 实线的的Connection部分(“第一个粉色矩形和第三个粉色矩形”)都是执行3x3x64的卷积,他们的channel个数一致,所以采用计算方式:y=F(x)+x;
- 虚线的的Connection部分(“第一个绿色矩形和第三个绿色矩形”)分别是3x3x64和3x3x128的卷积操作,他们的channel个数不同(64和128),所以采用计算方式:y=F(x)+Wx,其中W是卷积操作,用来调整x的channel维度。
4.3 ResNet50和ResNet101
论文把所有的ResNet网络都分成5部分,分别是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,之后的其他论文也会专门用这个称呼指代ResNet50或者101的每部分。网络结构如下:
4.4 基于ResNet101的Faster RCNN
文章中把ResNet101应用在Faster RCNN上取得了更好的结果,基于ResNet101的Faster RCNN的结构图如下:
上图展示了整个Faster RCNN的架构,其中蓝色的部分为ResNet101,可以发现conv4_x的最后的输出为RPN和RoI Pooling共享的部分,而conv5_x(共9层网络)都作用于RoI Pooling之后的一堆特征图(14 x 14 x 1024),特征图的大小维度也刚好符合原本的ResNet101中conv5_x的输入;一定要记得最后要接一个average pooling,得到2048维特征,分别用于分类和框回归。
第五章 DenseNet
5.1 意义
在深度学习网络中,随着网络深度的加深,梯度消失问题会愈加明显,目前很多论文都针对这个问题提出了解决方案,比如ResNet,Highway Networks,Stochastic depth,FractalNets等,尽管这些算法的网络结构有差别,但是核心都在于:create short paths from early layers to later layers(在前层和后层之间建立捷径)。延续这个思路,DenseNet就是在保证网络中层与层之间最大程度的信息传输的前提下,直接将所有层连接起来,通过对feature的极致利用达到更好的效果和更少的参数。
5.2 网络结构
5.2.1 Dense Block
在传统的卷积神经网络中,如果你有L层,那么就会有L个连接,但是在DenseNet中,会有L(L+1)/2个连接。简单讲,就是每一层的输入来自前面所有层的输出。如下图:x0是input,H1的输入是x0(input),H2的输入是x0和x1(x1是H1的输出)……
这种Dense Connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样就可以使用更深的网络。另外作者还观察到这种Dense Connection有正则化的效果,因此对于过拟合有一定的抑制作用。
注意:与ResNet不同的是,DenseNet对输出的特征图做的是通道合并操作(Concatnate),而ResNet是将输出特征图做值的相加,通道数是不变的。
5.2.2 DenseNet
DenseNet的结构图如下,在这个结构图中包含了3个dense block。作者将DenseNet分成多个dense block,原因是希望各个dense block内的feature map的size统一,这样在做concatenation就不会有大小不统一的问题。
这个表中的k=32,k=48中的k是growth rate,表示每个dense block中每层输出的feature map个数。为了避免网络变得很宽,作者都是采用较小的k,比如32这样,作者的实验也表明小的k可以有更好的效果。根据dense block的设计,后面几层可以得到前面所有层的输入,因此concat后的输入channel还是比较大的。
另外这里每个dense block的3*3卷积前面都包含了一个1*1的卷积操作,就是所谓的bottleneck layer,目的是减少输入的feature map数量,既能降维减少计算量,又能融合各个通道的特征,何乐而不为。另外作者为了进一步压缩参数,在每两个dense block之间又增加了1*1的卷积操作。因此在后面的实验对比中,如果你看到DenseNet-C这个网络,表示增加了这个Translation layer,该层的1*1卷积的输出channel默认是输入channel的一半。如果你看到DenseNet-BC这个网络,表示既有bottleneck layer,又有Translation layer。
综上,DenseNet有如下几个优点:
-
通过密集连接,减轻了梯度消失;
-
加强了feature的传递,可以更有效地利用feature;
-
一定程度上较少了参数数量。
第六章 DetNet
6.1 背景
随着时间推移,基于 CNN 的物体检测器也开始暴漏出一些弊端,其 backbone 往往