深度学习经典卷积神经网络分析

前言:本人只是根据论文和大牛的博客,简单的做一个笔记。

1 深度学习相关神经网络分析

1.1 AlexNet

  • 使用了ReLu作为激活函数:可以有效的避免过度拟合和梯度消散,并且可以有效提高卷积神经网络的预测准确率
  • 使用了Dropout技术:选择性的去掉一些不重要的神经元,也可以避免模型过度拟合
  • Overlapping Pooling:带交叠的Pooling,顾名思义这指Pooling单元在总结提取特征的时候,其输入会受到相邻pooling单元的输入影响,也就是提取出来的结果可能是有重复的
  • 双GPU并行运行:大大减少模型训练时间

下图是AlexNet总体结构
在这里插入图片描述

卷积过程计算公式:
output_h = (intput_h + 2×padding - kernel_h)/stride + 1
output_w = (intput_w + 2×padding - kernel_w)/stride + 1

第一层分析:
输入数据为227×227×3的图像,padding=0,stride=4,96个11×11×3的卷积核,卷积生成55×55×48的图像,经过重叠池化层,stride=2,池化尺寸为3*3,经过池化后的图像为27×27×96

第二层分析:
输入数据为第一层的27×27×96,padding=2,stride=1,256个5×5×96的卷积核,卷积生成27×27×256的像素层。经过重叠池化层(参数和第一层一样),池化后的像素大小为13×13×256

第三层分析:
输入数据为第二层的13×13×128,padding=1,stride=1,384个3×3×128的卷积核,卷积生成13×13×384的像素层。

第四层分析:
输入数据为第三层的13×13×384,padding=1,stride=1,384个3×3×384的卷积核,卷积生成13×13×384的像素层。

第五层分析:
输入数据为第四层的13×13×384,padding=1,stride=1,256个3×3×384的卷积核,卷积生成13×13×256的像素层。经过重叠池化层(参数和第一层一样),池化后的像素大小为6×6×256

第六层分析:
采用6×6×256尺寸的滤波器对第六层的输入数据进行卷积运算;每个6×6×256尺寸的滤波器对第六层的输入数据进行卷积运算生成一个运算结果,通过一个神经元输出这个运算结果;共有4096个6×6×256尺寸的滤波器对输入数据进行卷积,通过4096个神经元的输出运算结果;然后通过ReLU激活函数以及dropout运算输出4096个本层的输出结果值。
第五层输出的66256规模的像素层数据与第六层的4096个神经元进行全连接,然后经由relu6进行处理后生成4096个数据,再经过dropout6处理后输出4096个数据。

第七层分析:
第六层输出的4096个数据与第七层的4096个神经元全连接,然后经过ReLU和Dropout进行处理生成4096个数据

第八层分析:
第七层输出的4096个数据与第八层的1000个神经元进行全连接,经过训练后输出被训练的数值。

1.2 VGG

VGG网络模型的设计原则与AlexNet网络模型相反。后者认为网络中较大的卷积核能够捕获图像中较大的特征,可以更有效的进行权值共享。VGG在浅层网络连续使用多个大小为3×3的小卷积核,认为该操作可以模仿大卷积核的特征提取结果,同时还可以降低卷积神经网络的权重参数,减少计算量

  • 为什么小卷积核可以减少计算量?

拿conv3x3、conv5x5、conv7x7、conv9x9和conv11x11,在224x224x3的RGB图上(设置pad=1,stride=4,output_channel=96)做卷积,卷积层的参数规模和得到的feature map的大小如下
在这里插入图片描述
从上图我们可以得到两个结论:
1,同样stride下,不同卷积核大小的特征图和卷积参数(conv+feature)差别不大;
2,越大的卷积核计算量(calc.sum)越大。

-为什么小卷积核可以模仿大卷积核的特征提取效果?

VGG作者在VGGNet的实验中只用了两种卷积核大小:1x1和3x3。作者认为两个3x3的卷积堆叠获得的感受野大小,相当一个5x5的卷积;而3个3x3卷积的堆叠获取到的感受野相当于一个7x7的卷积。在这里插入图片描述
比如一张8×8的图片,分别用3×3,5×5,7×7的卷积核进行卷积,padding=0,stride=1,用一个3×3的卷积核得到6×6的图片,用两个得到4×4的图片,用三个得到2×2的图片。用一个5×5的卷积核得到4×4的图片,用7×7的卷积核得到2×2的图片,由此可以得出,2个3x3的卷积堆叠获得的感受野大小,相当1层5x5的卷积;而3层的3x3卷积堆叠获取到的感受野相当于一个7x7的卷积。

优点

1,连续多层小卷积核的网络结构比单卷积层的网络结构能更有效地提取图像中的高维特征。因为卷积神经网络中每一层都经过独立的训练,所提取的特征均不一样,层数越深,所提取特征维度越高。
2,大幅度地减少卷积神经网络中的权重参数。
3,有效的减少边界特征的损失。
4,更多的激活函数、更丰富的特征,更强的辨别能力。卷积后都伴有激活函数,更多的卷积核的使用可使决策函数更加具有辨别能力。

网络结构
在这里插入图片描述
在这篇论文中分别使用了A、A-LRN、B、C、D、E这6种网络结构进行测试,这6种网络结构相似,都是由5层卷积层、3层全连接层组成,其中区别在于每个卷积层的子层数量不同,从A至E依次增加(子层数量从1到4),总的网络深度从11层到19层(添加的层以粗体显示),表格中的卷积层参数表示为“conv⟨感受野大小⟩-通道数⟩”,例如con3-128,表示使用3x3的卷积核,通道数为128。为了简洁起见,在表格中不显示ReLU激活功能。其中,网络结构D就是著名的VGG16,网络结构E就是著名的VGG19。
在这里插入图片描述
1、输入224x224x3的图片,经64个3x3的卷积核作两次卷积+ReLU,卷积后的尺寸变为224x224x64
2、作max pooling(最大化池化),池化单元尺寸为2x2(效果为图像尺寸减半),池化后的尺寸变为112x112x64
3、经128个3x3的卷积核作两次卷积+ReLU,尺寸变为112x112x128
4、作2x2的max pooling池化,尺寸变为56x56x128
5、经256个3x3的卷积核作三次卷积+ReLU,尺寸变为56x56x256
6、作2x2的max pooling池化,尺寸变为28x28x256
7、经512个3x3的卷积核作三次卷积+ReLU,尺寸变为28x28x512
8、作2x2的max pooling池化,尺寸变为14x14x512
9、经512个3x3的卷积核作三次卷积+ReLU,尺寸变为14x14x512
10、作2x2的max pooling池化,尺寸变为7x7x512
11、与两层1x1x4096,一层1x1x1000进行全连接+ReLU(共三层)
12、通过softmax输出1000个预测结果
在这里插入图片描述
在这里插入图片描述

全连接层转卷积层

作者在测试阶段把网络中原本的三个全连接层依次变为1个conv7x7,2个conv1x1,也就是三个卷积层。改变之后,整个网络由于没有了全连接层,网络中间的feature map不会固定,所以网络对任意大小的输入都可以处理,因而作者在紧接着的后一句说到: The resulting fully-convolutional net is then applied to the whole (uncropped) image。
在这里插入图片描述
上图是VGG网络最后三层的替换过程,上半部分是训练阶段,此时最后三层都是全连接层(输出分别是4096、4096、1000),下半部分是测试阶段(输出分别是1x1x4096、1x1x4096、1x1x1000),最后三层都是卷积层。

先看训练阶段,有4096个输出的全连接层FC6的输入是一个7x7x512的特征图。25508(=7x7x512)个输入的每个元素都会与输出的每个元素(或者说是神经元)产生连接,所以每个输入都会有4096个系数对应4096个输出,所以网络的参数规模就是7x7x512x4096。对于FC7,输入是4096个,输出是4096个,因为每个输入都会和输出相连,那么4096个输入总共有4096x4096条连线(系数),最后一个FC8计算方式一样,略。

再看测试阶段,由于换成了卷积,第一个卷积后要得到4096(或者说是1x1x4096)的输出,那么就用4096个7×7×512卷积核进行卷积就可以得到那么总共的卷积参数量就是:[7x7x512]x4096。第二个卷积依旧得到1x1x4096的输出,因为输入也是1x1x4096,用4096个1x1x4096卷积核就可以得到相应输出。第三个卷积的计算一样,略。

1.3 GoogLeNet

GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择。

那么,GoogLeNet是如何进一步提升性能的呢?

一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题:
(1)参数太多,如果训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。

解决上述缺点的根本方法是将全连接甚至一般的卷积都转化为稀疏连接。为了打破网络对称性和提高学习能力,传统的网络都使用了随机稀疏连接。但是,计算机软硬件对非均匀稀疏数据的计算效率很差,所以在AlexNet中又重新启用了全连接层,目的是为了更好地优化并行运算。现在的问题是有没有一种方法,既能保持网络结构的稀疏性(并不明白什么是网络结构的稀疏性),又能利用密集矩阵的高计算性能。GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。

Inception网络结构
在这里插入图片描述
该结构将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。设定卷积步长stride=1,然后分别设定padding =0、1、2,采用same卷积可以得到相同维度的特征,然后这些特征直接拼接在一起。

网络卷积层中的网络能够提取输入的每一个细节信息,同时5x5的滤波器也能够覆盖大部分接受层的的输入。还可以进行一个池化操作,以减少空间大小,降低过度拟合。在这些层之上,在每一个卷积层后都要做一个ReLU操作,以增加网络的非线性特征。
在这里插入图片描述
然而这个Inception原始版本,所有的卷积核都在上一层的所有输出上来做,而那个5x5的卷积核所需的计算量就太大了(比如,上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256,其中,卷积层的参数为128x5x5x256= 819200),造成了特征图的厚度很大,为了避免这种情况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用,这也就形成了Inception v1的网络结构。

Inception v1

在这里插入图片描述
为什么加入1×1的卷积核,就能够降低特征图的厚度?
举个例子,假如上一层输出为100x100x128先经过具有32个128通道的1x1卷积层,输出的特征图为100x100x32,再经过具有256个输出的5x5x32卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,比没有加1×1卷积核的819200个卷积参数,大约减少了4倍。

GoogLeNet的网络结构
在这里插入图片描述
对上图说明如下:
(1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
(2)网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
(3)虽然移除了全连接,但是网络中依然使用了Dropout ;
(4)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。
在这里插入图片描述
为什么输入224×224的图像,经过第一层卷积层输出为112×112?
如果padding设置为’VALID’,就是向下取舍,也就是111,如果padding设置为’SAME’模式,那么就是向上取舍,这样就是112了。关键在于padding模式的设置。

Inception v2
Inception v2的思路跟VGG很相似,都是认为连续多个小卷积核可以替代大尺寸的卷积核,并且产生同样的效果。为此,作者提出可以用2个连续的3x3卷积层(stride=1)组成的小网络来代替单个的5x5卷积层,保持感受野范围的同时又减少了参数量。Inception v2结构如下图所示
在这里插入图片描述
Inception v3

Inception v2将大卷积核完全可以由一系列的3x3卷积核来替代,那能不能再分解得更小一点呢?
GoogLeNet团队考虑了nx1的卷积核,用3个3x1取代3x3卷积,实际上,团队发现在网络的前期使用这种分解效果并不好,还有在中度大小的feature map上使用效果才会更好,对于mxm大小的feature map,建议m在12到20之间。
在这里插入图片描述
Inception V3网络主要有两个方面的改进:第一是将较大的二维卷积拆成两个较小的一维卷积,比如将7×7卷积拆成1×7卷积和7×1卷积,一方面节约大量参数,加速运算并减轻过拟合,同时也增加了非线性扩展模型的表达能力。第二是优化了Inception Module的结构。

Inception v4

Inception V4研究了Inception模块与残差连接的结合,主要利用残差连接(Residual Connection)来改进V3结构,得到Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4网络。ResNet结构大大地加深了网络深度,还极大地提升了训练速度,同时性能也有提升(接下来叙述一下ResNet网络)。

1.4 ResNet

这里不得不佩服华人何凯明大牛了,太优秀了,放张图片膜拜一下
2003年广东省理科高考状元,清华基础科学班,香港中文大学攻读研究生,微软亚研院实习,现在FAIR工作。
在这里插入图片描述
首先要交待一下ResNet产生的背景。这里有几个问题需要说明

- 为什么要加深神经网络的深度?
在深度网络中,各个特征会不断的经过线性非线性的综合计算,越深的网络输出表示能力越强的特征,并且,越深的网络提取的特征越抽象,越具有语义信息。

- 为什么简单的增加神经网络的层数行不通?
如果简单的增加层数,就会产生梯度消失或者梯度爆炸。由于随着层数的增多,在网络中反向传播的梯度会随着连乘变得不稳定,变得特别大或者特别小。解决梯度消失的问题,也提出了很多方法,比如使用BatchNorm,将激活函数换为ReLu,使用Xaiver初始化等。但是就算是使用这些方法,也只能将网络层数增加至几十层。

- 为什么神经网络会产生性能退化问题?
当解决了梯度消失的问题,继续往上增加层数,便会产生性能退化问题,分类误差会变大,下图就很好的表达出来。有人认为,这可能因为过拟合问题,但是性能退化问题是在训练阶段就产生了,不能解释为overfitting,因为overfit应该表现为在训练集上表现更好才对。作者认为退化问题可能是因为深层的网络并不是那么好训练,也就是求解器很难去利用多层网络拟合同等函数。ResNet就是为了解决退化问题,并且增加网络层数而产生的。
在这里插入图片描述
我们可以假想一下,把网络层数增加,然后假设其中的某一层已经达到了最低的分类误差,那么剩下的层将不对特征做成任何改变,直接恒等映射输出。也就是说,相对于浅层网络更深的网络至少不会有更差的效果,但是因为网络退化的问题,这并不成立。那么,我们退而求其次,不求加深度能提高准确性,也希望网络不会产生退化的问题,让深度网络后面的层至少实现恒等映射的作用,根据这个想法,作者提出了residual模块来帮助网络实现恒等映射。

何为残差网络
在这里插入图片描述
如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。 但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,拟合残差肯定更加容易。
在这里插入图片描述
看到上图,肯定有不少的困惑,F(x)到底是什么?
假设F是求和前网络映射,H是从输入到求和后的网络映射。比如把5映射到5.1,那么引入残差前是F’(5)=5.1,引入残差后是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。这里的F’和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如原来是从5.1到5.2,映射F’的输出增加了1/51=2%,而对于残差结构从5.1到5.2,映射F是从0.1到0.2,增加了100%。明显后者输出变化对权重的调整作用更大,所以效果更好。更多解释可以参考知乎

残差学习

根据多层的神经网络理论上可以拟合任意函数,那么可以利用一些层来拟合函数。问题是直接拟合H(x)还是残差函数,由前文,拟合残差函数F(x) = H(x) - x更简单。虽然理论上两者都能得到近似拟合,但是后者学习起来显然更容易。
作者说,这种残差形式是由退化问题激发的。根据前文,如果增加的层被构建为同等函数,那么理论上,更深的模型的训练误差不应当大于浅层模型,但是出现的退化问题表面,求解器很难去利用多层网络拟合同等函数。但是,残差的表示形式使得多层网络近似起来要容易的多,如果同等函数可被优化近似,那么多层网络的权重就会简单地逼近0来实现同等映射,即F(x) = 0。
实际情况中,同等映射函数可能不会那么好优化,但是对于残差学习,求解器根据输入的同等映射,也会更容易发现扰动,总之比直接学习一个同等映射函数要容易的多。根据实验,可以发现学习到的残差函数通常响应值比较小,同等映射(shortcut)提供了合理的前提条件。

在这里插入图片描述
作者探索的更深的网络。 考虑到时间花费,将原来的building block(残差学习结构)改为瓶颈结构,如上图。首端和末端的1x1卷积用来削减和恢复维度,相比于原本结构,只有中间3x3成为瓶颈部分。这两种结构的时间复杂度相似。此时投影法映射带来的参数成为不可忽略的部分(以为输入维度的增大),所以要使用zero padding的同等映射。
替换原本ResNet的残差学习结构,同时也可以增加结构的数量,网络深度得以增加。生成了ResNet-50,ResNet-101,ResNet-152. 随着深度增加,因为解决了退化问题,性能不断提升。
作者最后在Cifar-10上尝试了1202层的网络,结果在训练误差上与一个较浅的110层的相近,但是测试误差要比110层大1.5%。作者认为是采用了太深的网络,发生了过拟合。

shortcut同等映射
F(x)与x相加就是就是逐元素相加,但是如果两者维度不同,需要给x执行一个线性映射来匹配维度:
在这里插入图片描述
xx 和FF的维度必须是相等的。如果不是这种情况,我们可以通过快捷连接执行线性投影Ws来匹配维度。(Ws仅在匹配维度时使用)

网络结构

在这里插入图片描述
左边为基础的VGG,中间为基于VGG作出的扩增至34层的普通网络,右边为34层的残差网络,不同的是每隔两层就会有一个residual模块。
对于残差网络,维度匹配的shortcut连接为实线,反之为虚线。维度不匹配时,同等映射有两种可选方案:

  • 直接通过zero padding 来增加维度(channel)。
  • 乘以W矩阵投影到新的空间。实现是用1x1卷积实现的,直接改变1x1卷积的filters数目。这种会增加参数。

模型构建好后进行实验,在plain上观测到明显的退化现象,而且ResNet上不仅没有退化,34层网络的效果反而比18层的更好,而且不仅如此,ResNet的收敛速度比plain的要快得多。
在这里插入图片描述
参考文献:
AlexNet详细解读
深度学习VGG模型核心拆解
VGGNet网络结构
大话CNN经典模型:VGGNet
深度学习——卷积神经网络 的经典网络(LeNet-5、AlexNet、ZFNet、VGG-16、GoogLeNet、ResNet)
深度学习之GoogLeNet解读
深度学习网络篇——ResNet
残差网络ResNet笔记
经典分类CNN模型系列其四:Resnet
ResNet论文翻译——中英文对照
知乎

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值