经典卷积神经网络模型
1.AlexNet
AlexNet模型是通过2个GPU同时运行,该模型包括:5个卷积层,3个全连接层。其中,在第1、2卷积层后有LRN层(Local Response Normalization,局部响应归一化),在LRN层和第5卷积层后有最大池化层。
AlexNet相对于之前模型(LeNet)的改进:
1)使用ReLU函数替代了Sigmoid函数作为神经元的**函数,减缓了梯度弥散的问题。
2)使用两个GPU进行并行运算,加速模型的训练周期。
3)加入LRN层,增加模型泛化能力(似乎在后面的发展中证明LRN没什么作用,于是又基本不用了)
4)使得池化层的size大于strides,造成赤化重叠。
5)数据增强。取图片四个角和中心部位的部分图片作为新的训练集,或者改变图片RGB通道强度(intensities of the RGB channels)。这样训练集中的一张图片就可以变为多张图片,增加模型的泛化能力,减少过拟合。
6)加入Dropout。模型中的一些神经元在训练阶段有概率的失效,也即是输出为0,不再参与前向和后向传播,但是在测试阶段中每个神经元都输出,不过会将输出乘以0.5。
2.VGGNet
VGGNet主要解决了CNN中的深度问题。相比较之前的卷积网络使用的11x11,7x7的卷积核,VGGNet使用多层更小的卷积核来替代。例如用两层卷积核为3x3的卷积层来替代一层卷积核为5x5的卷积层,用三层卷积核为3x3的卷积层来替代一层卷积核为7x7的卷积层,这样网络就会变深。之所以这样做是因为:
- 增加层数后可以增加模型非线性,使得决策函数更加有识别能力。
- 减少参数数量
模型初始化方法:上图展示了VGGNet中有多种模型,网络层数由11层逐渐发展到19层。但在深层网络中参数初始化值的选定很重要,因为深层网络的梯度很不稳定,糟糕的模型初始化会使得模型效果不好。因此,VGGNet的发明者们先用较浅的网络模型(11层,随机初始化)进行训练(浅网络随机初始化不易出问题),得到稳定的参数,再将这些参数直接赋予更深网络模型作为初始值(主要赋给前四层卷积层和后三层全连接层,中间层随机初始化)。
3.InceptionNet
InceptionNet其实是一个统称,主要包括VI,V2,V3,V4四代模型。
- Inception V1:用到了Network in Network思想,构建出Inception模块。
我们知道,一个滤波器只能提取一类特征。而Inception V1模块中对同一输入进行四种不同的卷积变换,相当于在一层中获得不同的特征,从而使得每个模块输出的结果中包含更多的feature,增加了网络对不同尺度的适应性。模块中大量使用了1x1卷积,是因为1x1卷积可以用很小的计算量增加一层特征变换和非线性化。
Inception V1也用到了数据增强,主要步骤是:将原始图片缩放成256,288,320和352四种尺寸,并分别从左,中,右(或上,中,下)各取一张图片,再从这些取出的图片的四个角和中心部分取出224x224的部分,并将其分别翻转再得到其镜像,且将原始图片缩放到224x224,得到新的图片及其镜像。这样一张原始图片就可以得到3x4x6x2=144张新的图片,降低模型过拟合问题。
- Inception V2:提出了Batch Normalization方法,对每一层的**函数的输入进行normalization处理。
- Inception V3:引入Factorization into small convolutions的思想,将3x3卷积拆成了1x3和3x1卷积,减少了参数数量,增加了一层非线性扩展模型表达能力。
- Inception V4:在V3的基础上结合了ResNet。
参考文献: Inception V1-->Going Deeper With Convolutions
Inception V2-->Batch Normalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift
4.ResNet
ResNet模型主要解决的是深层神经网络模型中出现的degradation,即随着层数的加深,模型准确率反而下降了。解决方法是引进了残差学习模块(residual learning)。
与一般的神经网络不同的是,残差模块中添加了一条shortcut connection,直接将输入x与模块的输出F(x)相加。ResNet直接将输入信息传给输出,一定程度上保护了信息的完整性,同时简化了学习目标和难度。
当F(x)和x维度不同时,主要有两种解决方法:1.对x进行填0操作,这种方法不额外增加参数 2.对x进行一个线性映射,即x-->Wx,这种方法增加了模型复杂度,但是在性能上稍微有所改善。
残差学习模块还有三层的结构(也称Bottleneck Residual Unit):
其中,1x1卷积层的作用是先降维后升维,使得中间的3x3卷积层的输入和输出的维度较小。三层残差学习模块主要用在Deep Bottleneck Architectures中,这种瓶颈设计主要是从实际节约的角度考虑,在性能上相差不大。
残差模块可表示为:y=h(x)+F(x,w)
x=f(y)
当模块中的shortcut为恒等映射,即h(x)=x,此时网络模型更加容易训练,且错误率也是最低的。
而当模块中BN+ReLU在weight层前面时,模型的错误率也是最低的。
因此,可得结论:shortcut为恒等映射以及BN,**函数在weight层前面对于模型中信息的传播很重要,可提高模型训练效率和降低错误率。即可对ResNet单元做以下处理: