卷积神经网络实战经验总结
Posted AI研究日志
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卷积神经网络实战经验总结相关的知识,希望对你有一定的参考价值。
“最近在参与一个时间序列分类的任务,目前仍在继续。在完成任务期间使用各类卷积网络以及很多模块,积累了一些自己的使用心得,在此记录。”
卷积神经网络
卷积神经网络被称为深度学习最成功的领域之一,
是深度学习中重要的一个分支。在众多领域CNN都表现出其优越的性能,在大多数任务背景下,CNN都是
解决图像分类、图像检索、物体检测和语义分割的主流模型。就目前实战感受而言,在我目前参与的时间序列分类任务中,CNN依旧表现出很好的性能。
典型的卷积神经网络包括:AlexNet、VGG、ResNet、Inception全家桶等等。上述模型我在实践过程中都进行了尝试,不得不说随着确实大部分,模型越先进,分类效果越好。这里来细数不同经典网络中所使用的trick。
AlexNet
中包含了 ReLU、Dropout 和 LRN 等几个 Trick,这些trick也是首次在CNN中成功应用。其中LRN
局部归一化技术是一个饱受争议的技术,虽然通过实验确实证明它可以提高模型的泛化能力,但是提升的很少,以至于后面不再使用。
另外还有一点就是数据增强,AlexNet随机从256*256图像中截取224*224大小的区域,以及水平翻转,得到(256-224)
的平方X2=2048倍的数据量,大大减轻了过拟合,提高泛化能力
V
GG提出了数据层堆叠,通过2至3个3*3卷积层堆叠来形成5*5和7*7大小的感受野。其中2个3*3的卷积层可以形成5*5大小的感受野,第一参数量更少,比1个7*7的卷积层拥有更少的参数
量,只有后者的(3*3*3)/ (7*7)=55%的参数量,另外拥有更多的非线性变化,3个卷积层可以进行3次非线性变化,而1个卷积层只能1次。训练和预测时的技巧,训练时先训练简单网络,再复用简单网络的权重来初始化后面的几个复杂模型,这样训练收敛的速度更快。预测时采用Multi-Scale的方法,同时再训练时VGGNet也使用了Multi-Scale的方法做数据增强。
得出LRN层作用不大的结论
,越深的网络效果越好。
1*1的卷积也是很有效的,但是没有3*3的好,大一些的卷
积核可以学习更大的空间特征。
Inception系列最大的特点就是Inception模块,
用多个分支提取不同抽象程度的高
阶特征,可以丰富网络的表达能力,这个在实践过程中效果也很好。还提出Factorization into small convolutions的思想,将n*n的卷积拆分成1*n卷积和n*1卷积,同时比
n*n卷积多了一层非线性扩展模型表达能力。I
nceptionV2提出了提出了著名的Batch Normalization方法,减少了Internal Covariate shift。
此外去除了最后的全连接层,用1*1卷积来取代,这样大大减少了参数量,并且减轻了过拟合。
ResNet
提出残差连接思想,以应对在随着网络的深度增加的时候,网络的退化(不是过拟合)问题。这种退化是由于在反向传播的过程中,由于网络太深,误差传到前面的时候,梯度逐渐消失的问题。特别是随着网络的加深,网络效果反而越来越差。
接下来我会更加详细的记录自己在使用一些Trick时的感受。
首先是大家熟悉的dropout层,dropout通过减轻神经元之间的相互作用来
抗过拟合。但加入dropout会增加网络的训练时间,并且在数据量小的情况下表现并不好。
一般dropout率等于0.5的时候效果最好,原因是0.5的时候dropout随机生成的网络结构最多。另外dropout目前在全连接层中使用较多,原因在于卷积神经网络隐藏层中由于卷积本身的稀疏性,以及ReLU函数带来的稀疏性,使用dropout效果并不好。
dropout还有个兄弟是dropconnect,
其中dropout就是对某个隐藏层的输出进
行随机置0,而dropconnect则是对于某个隐藏层的输入权重进行随机置0,一个是对输出置0一个是对输入置0。dropconnect比dropout做的更绝,dropout训练时置零的神经元权值还可以更新,而dropconnect则不允许置零神经元在梯度更新的时候有更新。
Ba
tch Normalization作为最近一年来DL的重要成果,已经广泛被证明其有效性和重要性。说到BN,就不得不提起机器学习领域著名的IID独立同分布假设
,
就是假设训练数据和测试数据是满足相
同分布的,这是保证模型具有泛化能力的一个基础
。
Batch Normalization的目的就是在深度神经网络训练过程中使得每一层神经网络的
输入保持相同分布的。
而随着网络的加深,隐层不断增加,在训练过程中,各层会参数不停在变化,这导致隐层的输入分布在不断变换,这就是所谓的“Internal Covariate Shift”。例如,随着网络深度加深或者在训练过程中,由于其分布逐渐往非线性函数的取值区间的上下限两端靠近,对于Sigmoid函数而言,意味着激活输入值WU+B是大的负值或正值,所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。
BN则是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布拉回到近似均值为0方差为1的标准正态分布,
这样使得激活输入值落在非线性函数对输入比较敏感的区域,
让梯度变大,来避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。很多论文都是解决这个问题的,比如ReLU激活函数,再比如ResN
et,BN本质上也是解释并从某个不同的角度来解决这个问题的。
但是单纯将输入规范化会使模型非线性能力减弱,所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift)来保证模型的非线性能力,这两个参数跟随着模型训练。
在实际使用中BN通常放在池化层之后;BN也可以放在卷积与激活函数之间形成卷积与BN的融合,这种结构在ResNet中很多。使用BN之后可以使用较大的学习率,模型收敛速度会加快,还有一定的正则化效果。但BN有一点需要注意,就是scale和shift的两个参数,训练时两个参数是跟随每个Batch变化的;而预测时使用的时这两个参数参数整体训练下来的期望,可能会存在一点差异。
1X1卷积在Inception中使用很多,是为了统一维度,从这点上可以看出1X1卷积具有升维和降维以及控制feature map深度的作用;
另一点就是现在有很多网络使用1X1卷积来代替全连接
层,这样有两个优点:一是可以不改变原始feature map的形状,来进行不同通道的特征整合;二是可以在具有全联系层非线性能力的同时,拥有更少的参数。这点我在实际使用时也感受到了。
Inception架构是我在实际使
用的中最有效的,借助它的思想可以在宽度上实现不同尺寸卷积以及不同池化的特征提取,下面是InceptionV1-V3的结构,具体使用时可以进行参考:
时间序列上的注意力机制我在之前的文章中也讲过如何设计,这里说一下卷积中的注意力机制SENet和CBAM。
SENet是最后一届 ImageNet 2017的冠军。很
多网络是从空间维度层面来提升网络的性能,如 Inception 结构中嵌入了多尺度信息,聚合多种不同感受野上的特征来获得性能增益;在 Inside-Outside 网络中考虑了空间中的上下文信息;还有将 Attention 机制引入到空间维度上等等。
而是SENet则是在特征通道维度引入注意力机制,
通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。
上图是SE 模块的示意图。给定一个输入 x,其特征通道数为 c_1,通过一系列卷积等一般变换后得到一个特征通道数为 c_2 的特征。
首先是 Squeeze 操作,从空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。一般使用全局平均池化。
其次是 Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性。这里可以使用全连接层也可以使用上面提到的1X1卷积。
最后是一个 Reweight 的操作,将 Excitation 的输出的权重看做是进行过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上。即加权形成注意力机制。
下图是将 SE 模块嵌入到 Inception 结构的一个示例。
Convolutional Block Attention Module (CBAM) 是2018年的分类冠军,它和SENet一样是一个可嵌入模块。CBAM是一种结合了空间(spatial)和通道(channel)的注意力机制模块。
下图是CBAM嵌入ResNet的示例。
理论上相比于SENet只关注通道(channel)的注意力机制可以取得更好的效果。但是我在实际用的时候SENet模块的嵌入效果更好,还是要根据任务进行模块的嵌入尝试。
1.各种先进的模型思想被提出一定是经过验证的,我们在使用的时候其实可以优先保留原始参数,因为相对于超参数的调整,架构机理上的改进对模型提升能力更大。
2. 嵌入模块一定要明白其原理在进行嵌入,不然可能适得其反,无法发挥模型的真正效果。
3. 模型固然重要,但是相对于模型,对于数据特征工程的设计更为重要,因为再先进的模型也是学习的统计学规律,数据一旦输入,其实结果就已经确定。
总之,无论什么模型,
能让AI落地的工程师才是好的算法工程师
,这点目前深有体会。
感谢你这么帅还给我三连~
以上是关于卷积神经网络实战经验总结的主要内容,如果未能解决你的问题,请参考以下文章
深度学习网络模型介绍及实战
深度学习课程笔记卷积神经网络
项目实战解析:基于深度学习搭建卷积神经网络模型算法,实现图像识别分类
爱科研 | 基于卷积神经网络的验证码识别 (人工智能项目,十一科研实训)
Pytorch Note27 卷积设计的一些经验总结
Keras深度学习实战——卷积神经网络详解与实现