卷积神经网络的结构发展概述,主要包括:
这篇博客并没有详细讲述各种卷积神经网络架构,只是简单记录对卷积神经网发展的印象,是对卷积神经网络框架的简单了解。在后续的学习过程中,注意力应放在几个主要的基本框架上。
卷积神经网络之LeNet
LeNet网络结构:
理解难点:S2到C3的详细解释过程,参照下文的解释
LeNet详解
卷积神经网络(CNN)Python的底层实现——以LeNet为例
卷积神经网络之AlexNet
卷积神经网络模型(2)-AlexNet解读
初探Alexnet网络结构
卷积神经网络中的padding理解
卷积神经网络 通道数与卷积核数
https://blog.csdn.net/briblue/article/details/83063170
卷积核的尺寸,数量,通道数(网上资料整合)
Dropout的Bagging思想以及使用要点:
从《百面深度学习》这本书中的相关内容介绍领悟到,Dropout这种以一定比例随机丢弃神经元的方式是一种Bagging的思想:神经网络通过Dropout层以一定比例随机丢弃神经元,使得每次训练的网络模型都不相同,多个Epoch下来相当于训练了多个模型,同时每一个模型都参与了对最终结果的投票,从而提高了模型的泛化能力。在此注意,Dropout与Bagging有一点不同是:Bagging的各个模型之间是相互独立的, 而Dropout各个模型之间是共享权重的。
卷积神经网络之VGG
一文读懂VGG网络
VGGNet介绍
VGG16可视化
各种网络结构可视化网址:https://dgschwend.github.io/netscope/quickstart.html
经典的AlexNet虽然它在识别效果方面非常令人惊艳,但是这些都是建立在对超参数进行大量的调整的基础上,而它并没有提出一种明确的模型设计规则以便指导后续的新网络模型设计,这也限制了它的迁移能力。因此,虽然它很知名,但是在近几年的模型基础框架却很少出现AlexNet的身影,反观VGG则成为了很多新模型基础框架的必选项之一,这也是它相对于AlexNet的优势之一:VGG提出用基础块代替网络层的思想,这使得它在构建深度网络模型时可以重复使用这些基础块。
正如前面所说,VGG使用了块代替层的思想,具体的来说,它提出了构建基础的卷积块和全连接块来替代卷积层和全连接层,而这里的块是由多个输出通道相同的层组成。
因为 VGG非常经典,所以网络上有VGG的预训练权重,我们可以直接读取预训练的权重去搭建模型,这样就可以忽略对输入和输出通道数的感知,要简单很多,但是为了更加清楚的理解网络模型,在这里还是从最基本的部分开始搭建,自己初始化权重和偏差,这样能够更加清楚每层输入和输出的结构。
理解卷积神经网络中的通道 channel
大话深度残差网络(DRN)ResNet网络原理
假设现有一个比较浅的网络(Shallow Net)已达到了饱和的准确率,这时在它后面再加上几个恒等映射层(Identity mapping,也即y=x,输出等于输入),这样就增加了网络的深度,并且起码误差不会增加,也即更深的网络不应该带来训练集上误差的上升。而这里提到的使用恒等映射直接将前一层输出传到后面的思想,便是著名深度残差网络ResNet的灵感来源。
残差网络的基本结构如下图所示:
除了上面提到的两层残差学习单元,还有三层的残差学习单元,如下图所示:
DenseNet算法详解
先列下DenseNet的几个优点,感受下它的强大:
1、减轻了vanishing-gradient(梯度消失)
2、加强了feature的传递
3、更有效地利用了feature
4、一定程度上较少了参数数量
如下图: x 0 x_0 x0是input, H 1 H_1 H1的输入是 x 0 x_0 x0(input), H 2 H_2 H2的输入是 x 0 x_0 x0和 x 1 x_1 x1( x 1 x_1 x1是 H 1 H_1 H1的输出)……
DenseNet的一个优点是网络更窄,参数更少,很大一部分原因得益于这种dense block的设计,后面有提到在dense block中每个卷积层的输出feature map的数量都很小(小于100),而不是像其他网络一样动不动就几百上千的宽度。同时这种连接方式使得特征和梯度的传递更加有效,网络也就更加容易训练。原文的一句话非常喜欢:Each layer has direct access to the gradients from the loss function and the original input signal, leading to an implicit deep supervision.直接解释了为什么这个网络的效果会很好。前面提到过梯度消失问题在网络深度越深的时候越容易出现,原因就是输入信息和梯度信息在很多层之间传递导致的,而现在这种dense connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深网络不是问题。另外作者还观察到这种dense connection有正则化的效果,因此对于过拟合有一定的抑制作用,博主认为是因为参数减少了(后面会介绍为什么参数会减少),所以过拟合现象减轻。
第一个公式是ResNet的。这里的 l l l表示层, x l x_l xl表示 l l l层的输出, H l H_l Hl表示一个非线性变换。所以对于ResNet而言, l l l层的输出是 l − 1 l-1 l−1层的输出加上对 l − 1 l-1 l−1层输出的非线性变换。
x l = H l ( x l − 1 ) + x l − 1 x_l=H_l(x_{l-1})+x_{l-1} xl=Hl(xl−1)+xl−1
第二个公式是DenseNet的。 [ x 0 , x 1 , … , x l − 1 ] [x_0,x_1,…,x_{l-1}] [x0,x1,…,xl−1]表示将0到 l − 1 l-1 l−1层的输出feature map做concatenation。concatenation是做通道的合并,就像Inception那样。而前面resnet是做值的相加,通道数是不变的。 H l H_l Hl包括BN,ReLU和3*3的卷积。
x l = H l ( [ x 0 , x 1 , … , x l − 1 ] ) x_l=H_{l}([x_0,x_1,\dots,x_{l-1}]) xl=Hl([x0,x1,…,xl−1])
所以从这两个公式就能看出DenseNet和ResNet在本质上的区别.
DenseNet的结构图:
大话CNN经典模型:GoogLeNet(从Inception v1到v4的演进)
最原始Inception的基本结构:
Inception v1的网络结构,如下图所示:
基于Inception v1构建了GoogLeNet的网络结构如下(共22层):
为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。
Inception V3一个最重要的改进是分解(Factorization),将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加速计算,又可以将1个卷积拆成2个卷积,使得网络深度进一步增加,增加了网络的非线性(每增加一层都要进行ReLU)。
Inception V4研究了Inception模块与残差连接的结合。
Inception V4主要利用残差连接(Residual Connection)来改进V3结构,得到Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4网络。
将该结构与Inception相结合,变成下图:
通过20个类似的模块组合,Inception-ResNet构建如下:
ResNext与Xception——对模型的新思考
ResNeXt 深入解读与模型实现
https://www.zhihu.com/question/323424817?sort=created
经典分类CNN模型系列其八:ResNeXt
左侧为ResNet的block结构,右侧的是ResNeXt的block结构。
除此之外,ResNeXt还存在者另外两种等价形式。
Xception
Xception算法详解
精简CNN模型系列之七:Xception
Xception是google继Inception后提出的对Inception v3的另一种改进,主要是采用depthwise separable convolution来替换原来Inception v3中的卷积操作。
要介绍Xception的话,需要先从Inception讲起,Inception v3的结构图如下Figure1。当时提出Inception的初衷可以认为是:特征的提取和传递可以通过 1 ∗ 1 1*1 1∗1卷积, 3 ∗ 3 3*3 3∗3卷积, 5 ∗ 5 5*5 5∗5卷积,pooling等,到底哪种才是最好的提取特征方式呢?Inception结构将这个疑问留给网络自己训练,也就是将一个输入同时输给这几种提取特征方式,然后做concat。Inception v3和Inception v1(googleNet)对比主要是将 5 ∗ 5 5*5 5∗5卷积换成两个 3 ∗ 3 3*3 3∗3卷积层的叠加。
于是从Inception v3联想到了一个简化的Inception结构,就是Figure 2。
再将Figure2延伸,就有了Figure3,Figure3表示对于一个输入,先用一个统一的 1 ∗ 1 1*1 1∗1卷积核卷积,然后连接3个 3 ∗ 3 3*3 3∗3的卷积,这3个卷积操作只将前面 1 ∗ 1 1*1 1∗1卷积结果中的一部分作为自己的输入(这里是将1/3channel作为每个 3 ∗ 3 3*3 3∗3卷积的输入)。
再从Figure3延伸就得到Figure4,也就是 3 ∗ 3 3*3 3∗3卷积的个数和 1 ∗ 1 1*1 1∗1卷积的输出channel个数一样,每个 3 ∗ 3 3*3 3∗3卷积都是和1个输入channel做卷积。
铺垫了这么多,终于要讲到Xception了。在Xception中主要采用depthwise separable convolution. depthwise separable convolution分成两步,一步叫depthwise convolution,就是下图的(b),另一步是pointwise convolution,就是下图的(c)
其实depthwise separable convolution和上面的Figure4是很像的。差别有两个:1、顺序不一样,在depthwise separable convolution中是先进行一个channel-wise的spatial convolution,也就是上图的(b),然后是 1 ∗ 1 1*1 1∗1的卷积。而在Figure4中是先进行 1 ∗ 1 1*1 1∗1的卷积,再进行channel-wise的spatial convolution,最后concat。2、在Figure4中,每个操作后都有一个ReLU的非线性激活,但是在depthwise separable convolution中没有。
那么作者为什么要采用depthwise separable convolution操作呢?就是从Figure1到Figure4的关于Inception v3结构的不断延伸,然后Figure4基本上和depthwise separable convolution没有太大的区别,于是就有了引入depthwise separable convolution修改Inception v3结构的Xception。
Figure5是Xception的结构图。这里的sparsableConv就是depthwise separable convolution。另外,每个小块的连接采用的是residule connection(图中的加号),而不是原Inception中的concat。
同一向复杂的Inception系列模型一样,它也引入了Entry/Middle/Exit三个flow,每个flow内部使用不同的重复模块,当然最最核心的属于中间不断分析、过滤特征的Middel flow。
Entry flow主要是用来不断下采样,减小空间维度;中间则是不断学习关联关系,优化特征;最终则是汇总、整理特征,用于交由FC来进行表达。
Momenta详解ImageNet 2017夺冠架构SENet
https://zhuanlan.zhihu.com/p/65459972/
SE模块首先对卷积得到的特征图进行Squeeze操作,得到channel级的全局特征,然后对全局特征进行Excitation操作,学习各个channel间的关系,也得到不同channel的权重,最后乘以原来的特征图得到最终特征。本质上,SE模块是在channel维度上做attention或者gating操作,这种注意力机制让模型可以更加关注信息量最大的channel特征,而抑制那些不重要的channel特征。另外一点是SE模块是通用的,这意味着其可以嵌入到现有的网络架构中。
Spatial-Channel Sequeeze & Excitation
https://blog.csdn.net/qq_41174201/article/details/88577287
卷积层中的注意力模块
https://zhuanlan.zhihu.com/p/73927413
SqueezeNet详解
在大幅降低模型精度的前提下,最大程度的提高运算速度
提高运算速度有两个可以调整的方向:
这个方向带来的效果是非常明显的:
SqueezeNet正是诞生在这个环境下的一个精度的网络,它能够在ImageNet数据集上达到AlexNet[2]近似的效果,但是参数比AlexNet少50倍,结合他们的模型压缩技术 Deep Compression[3],模型文件可比AlexNet小510倍。
SqueezeNet是由若干个Fire模块结合卷积网络中卷积层,降采样层,全连接等层组成的。一个Fire模块由Squeeze部分和Expand部分组成(注意区分和Momenta的SENet[4]的区别)。Squeeze部分是一组连续的 [公式] 卷积组成,Expand部分则是由一组连续的 [公式] 卷积和一组连续的 [公式] 卷积cancatnate组成,因此 [公式] 卷积需要使用same卷积,Fire模块的结构见下图。
MobileNet
CNN模型之MobileNet
『高性能模型』轻量级网络ShuffleNet_v1及v2
ShuffleNet算法详解
channel shuffle
为达到特征通信目的,我们不采用dense pointwise convolution,考虑其他的思路:channel shuffle。如图b,其含义就是对group convolution之后的特征图进行“重组”,这样可以保证接下了采用的group convolution其输入来自不同的组,因此信息可以在不同组之间流转。图c进一步的展示了这一过程并随机,其实是“均匀地打乱”。
在程序上实现channel shuffle是非常容易的:假定将输入层分为 g g g 组,总通道数为 g × n g\times n g×n,首先你将通道那个维度拆分为 ( g , n ) (g,n) (g,n) 两个维度,然后将这两个维度转置变成 ( n , g ) (n,g) (n,g) ,最后重新reshape成一个维度 g × n g\times n g×n。
ShuffleNet的核心是采用了两种操作:pointwise group convolution和channel shuffle,这在保持精度的同时大大降低了模型的计算量。其基本单元则是在一个残差单元的基础上改进而成。
ShuffleNet基本单元
下图a展示了基本ResNet轻量级结构,这是一个包含3层的残差单元:首先是1x1卷积,然后是3x3的depthwise convolution(DWConv,主要是为了降低计算量),这里的3x3卷积是瓶颈层(bottleneck),紧接着是1x1卷积,最后是一个短路连接,将输入直接加到输出上。
下图b展示了改进思路:将密集的1x1卷积替换成1x1的group convolution,不过在第一个1x1卷积之后增加了一个channel shuffle操作。值得注意的是3x3卷积后面没有增加channel shuffle,按paper的意思,对于这样一个残差单元,一个channel shuffle操作是足够了。还有就是3x3的depthwise convolution之后没有使用ReLU激活函数。
下图c展示了其他改进,对原输入采用stride=2的3x3 avg pool,在depthwise convolution卷积处取stride=2保证两个通路shape相同,然后将得到特征图与输出进行连接(concat,借鉴了DenseNet?),而不是相加。极致的降低计算量与参数大小。
NAS详解
文章提出了Neural Architecture Search(NAS),算法的主要目的是使用强化学习寻找最优网络,包括一个图像分类网络的卷积部分(表示层)和RNN的一个类似于LSTM的cell。由于现在的神经网络一般采用堆叠block的方式搭建而成,这种堆叠的超参数可以通过一个序列来表示。而这种序列的表示方式正是RNN所擅长的工作。
首先我们考虑最简单的CNN,即只有卷积层构成。那么这种类型的网络是很容易用控制器来表示的。即将控制器分成 N N N 段,每一段由若干个输出,每个输出表示CNN的一个超参数,例如Filter的高,Filter的宽,横向步长,纵向步长以及Filter的数量,如图所示。
令人拍案叫绝的EfficientNet和EfficientDet
细说EfficientNet
对网络的扩展可以通过增加网络层数(depth,比如从 ResNet (He et al.)从resnet18到resnet200 ), 也可以通过增加宽度,比如WideResNet (Zagoruyko & Komodakis, 2016)和Mo-bileNets (Howard et al., 2017) 可以扩大网络的width (#channels), 还有就是更大的输入图像尺寸(resolution)也可以帮助提高精度。如下图所示: (a)是基本模型,(b)是增加宽度,(c)是增加深度,(d)是增大图像分辨率,(d)是EfficientNet,它从三个维度均扩大了,但是扩大多少,就是通过作者提出来的复合模型扩张方法结合神经结构搜索技术获得的。
[总结] 卷积神经网络发展历程
经典CNN结构简析:AlexNet、VGG、NIN、GoogLeNet、ResNet etc.