经典卷积神经网络(CNN)结构总结----AlexNet、VGGNet、GoogleNet和ResNet

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Rulixiang/article/details/84797619


最近要开始做场景方面的内容了,工作基础当然是CNN。现在对一些经典的卷积神经网络CNN结构简单的总结一下。主要介绍的CNN网络结构包括Alexnet、VggNet、GoogleNet和ResNet(ResNet以后再说)。

一、AlexNet

AlexNet 网络结构

首先是Alexnet,来自NIPS2012的论文:ImageNet Classification with Deep Convolutional Neural Networks。我们首先来看它的网络结构:

输入图像的尺寸大小为224 × \times 224的RGB图像,网络的各个层次分别是11 × \times 11的96个卷积核的卷积层、5 × \times 5的256个卷积核的卷积层、最大池化层、3 × \times 3的384个卷积核的卷积层、最大池化层、3 × \times 3的384个卷积核的卷积层、3 × \times 3的256个卷积核的卷积层、最大池化层,后面是两个4096节点的全连接层以及一个softmax层。具体的网络层次计算方法就不说了,大家都懂。

AlexNet 改进方法

然后是Alexnet成功的原因,大致是如下:

1. 大量数据训练

主要就是Fei-Fei Li团队做出来的巨大的标注数据集合ImageNet;而在此基础上,Alexnet的作者在训练时也还是用了数据增强的技术,进一步扩充训练集。增强的方式包括对输入图像的翻转、随机裁剪等。

2. ReLU 激活函数

使用ReLU非线性激活函数而不选择sigmoid或tanh函数,ReLU优势在于:

  • 速度快 和sigmoid函数需要计算指数和倒数相比,relu函数其实就是一个max(0,x),计算代价小很多。
  • 减轻梯度消失问题,从而可以训练更深的网络。
  • 稀疏性。 通过对大脑的研究发现,大脑在工作的时候只有大约5%的神经元是激活的,而采用sigmoid激活函数的人工神经网络,其激活率大约是50%。有论文声称人工神经网络在15%-30%的激活率时是比较理想的。因为relu函数在输入小于0时是完全不激活的,因此可以获得一个更低的激活率。

3. Dropout

结合多个训练模型可以减少测试误差,但是在神经网络中,训练每个模型都需要大量的时间,代价昂贵。Dropout通过在隐藏层中以rate概率随机将部分神经元输出设置为0,这些神经元既不参于前向传播,也不参与反向传播。所以每次提出一个输入,该神经网络就尝试一个不同的结构,但是所有这些结构之间共享权重。因为神经元不能依赖于其他特定神经元而存在,所以这种技术降低了神经元复杂的互适应关系。在测试时只需要除以: 1 1 r a t e \frac{1}{1-rate}

4. 其它

其他方面的改进措施,包括GPU实现,LRN归一化层的使用,数据增强等;

二、VGGNet

VGGNet由牛津大学的视觉几何组(Visual Geometry Group,简称VGG)提出的,来自ICLR2015论文:Very Deep Convolutional Networks for Large-Scale Image Recognition。其突出贡献在于证明使用很小的卷积(3*3)来增加网络深度可以有效提升模型的效果,而且VGGNet对其他数据集具有很好的泛化能力。VGGNet的缺点就是需要更大的存储空间,参数量达到达到140M。

VGG网络结构

VGG16包含16层,VGG19包含19层。一系列的VGG在最后三层的全连接层上完全一样,整体结构上都包含5组卷积层,卷积层之后跟一个MaxPool。所不同的是5组卷积层中包含的级联的卷积层越来越多。

VGGNet改进点总结

VGGNet是从AlexNet发展而来,主要进行了两个方面的改进:(1)在第一个卷积层使用更小的filter尺寸和间隔。(2)在整个图片和multi-scale上训练和测试图片

1. 小卷积核

使用了更小的3*3卷积核,和更深的网络。两个3* 3卷积核的堆叠相对于5*5卷积核的视野,三个3*3卷积核的堆叠相当于7*7卷积核的视野。这样一方面可以有更少的参数(3个堆叠的3*3结构只有7*7结构参数数量的(3*3*3)/(7*7)=55%);另一方面拥有更多的非线性变换,增加了CNN对特征的学习能力。

在VGGNet的卷积结构中,引入1*1的卷积核,在不影响输入输出维度的情况下,引入非线性变换,增加网络的表达能力,降低计算量。

训练时,先训练级别简单(层数较浅)的VGGNet的A级网络,然后使用A网络的权重来初始化后面的复杂模型,加快训练的收敛速度。

2. 多尺度训练

采用了Multi-Scale的方法来训练和预测。可以增加训练的数据量,防止模型过拟合,提升预测准确率 。

三、GoogleNet

GoogleNet和VGG是2014年imagenet竞赛的双雄,这两类模型结构有一个共同特点是go deeper。跟VGG不同的是,GoogleNet做了更大胆的网络上的尝试而不是像VGG继承了Lenet以及AlexNet的一些框架,该模型虽然有22层,但大小却比AlexNet和VGG都小很多,性能优越。原论文来自CVPR2015:Going Deeper with Convolutions

GoogleNet网络结构

1. 基本结构

GoogleNet的基本网络结构如下:

(下面的内容引自 https://blog.csdn.net/Chenyukuai6625/article/details/77930438)

总体结构:

  • 包括Inception模块的所有卷积,都用了修正线性单元(ReLU);
  • 网络的感受野大小是224x224,采用RGB彩色通道,且减去均值;
  • #3x3 reduce和#5x5 reduce分别表示3x3和5x5的卷积前缩减层中1x1滤波器的个数;pool proj表示嵌入的max-pooling之后的投影层中1x1滤波器的个数;缩减层和投影层都要用ReLU;
  • 网络包含22个带参数的层(如果考虑pooling层就是27层),独立成块的层总共有约有100个;
  • 网络中间的层次生成的特征会非常有区分性,给这些层增加一些辅助分类器。这些分类器以小卷积网络的形式放在Inception(4a)和Inception(4b)的输出上。在训练过程中,损失会根据折扣后的权重(折扣权重为0.3)叠加到总损失中。

2. Inception模块

在GoogleNet中,最著名的就是所提出的Inception模块,

Inception结构的主要思想是找出如何让已有的稠密组件接近与覆盖卷积视觉网络中的最佳局部稀疏结构。有文献提出一个层与层的结构,在结构的最后一层进行相关性统计,将高相关性的聚集到一起。这些聚类 构成下一层的单元,且与上一层单元连接。假设前面层的每个单元对应于输入图像的某些区域,这些单元被分为滤波器组。低层的单元集中在某些局部区域,最终得到在单个区域中的大量聚类,它们能在下一层通过1x1的卷积覆盖。
总的来说,Inception结构的主要思路是用密集成分来近似最优的局部稀疏结构。Google团队首先提出来的是Inception模型A,如下图所示:

这个模型意在强化基本特征提取模块的功能,一般的卷积层只是增加卷积层的深度和个数,但是在单层上卷积核却只有一种,比如对于VGG,单层卷积核只有3x3大小的,这样特征提取的功能可能就比较弱。GoogLenet想的就是能不能增加单层卷积层的宽度,即在单层卷积层上使用不同尺度的卷积核,如上图所示基本的Inception module中有1x1卷积核,3x3卷积核,5x5卷积核还有一个3x3下采样。这样尺寸不同的卷积核就可以提取不同尺寸的特征,单层的特征提取能力增强了。
  但是此时会有个疑问,对于像VGG这种网络,自己同样可以通过卷积-下采样-卷积这种方式提取不同尺寸的信息,所以为什么Inception module这种网络会有很好的效果的,具体的原因是采用卷积-下采样-卷积这种方式虽然能够提取不同尺寸的信息,但是由于是通过下采样这种方式实现的,所以必会带来信息的丢失,和Inception module这种方式相比,显然丢失的信息更多。
  针对上面的模型进行一下注释:

  • 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
  • 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了;
  • 很多文献都表明pooling挺有效,所以Inception模型嵌入了poolong层;
  • 网络越到后面,特征越抽象,空间集中性会降低,所以每个特征所涉及的感受野需要更大,因此随着层数的增加,3x3和5x5卷积的比例也要增加

上面Inception module A结构会存在一个问题,就是前一层的输出不经任何处理直接输入到下一层的卷积层中,这样如果前一层的特征图数量很多,有经过5x5这种大尺寸的卷积,带来的计算量也是非常大,所以在修正过后的Inception module在输出到下一层卷积之前,会对数据进行一次降维,那么怎么来实现数据降维,方法是采用1x1卷积核来实现。例如:上一层的输出为100x100x128,经过具有256个输出的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256。假如上一层输出先经过具有32个输出的1x1卷积层,再经过具有256个输出的5x5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。
  改进后的 Inception模型如下图所示:

改进后的Inception module既能大大提升卷积提取特征的能力,又不会使计算量提升很多。实验表明,采用了Inception模块的网络要比没有采用Inception模块的同样架构的网络快2~3倍

GoogleNet 网络改进

GoogLeNet模型采用了Inception结构,不仅进一步提升了预测分类的准确率,而且极大的减小了参数量,分析其原因如下:

  • GoogLeNet采用了模块化的结构,方便增添和修改;
  • 网络最后采用了average pooling来代替全连接层,但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家finetune;
  • 虽然移除了全连接,但是网络中依然使用了Dropout ;
  • 为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。

由于自身水平和时间限制,上面的介绍比较简略和粗糙,下面几个是更好更全面的介绍:

【1】AlexNet
【2】VGGNet
【3】GoogleNet

猜你喜欢

转载自blog.csdn.net/Rulixiang/article/details/84797619