CNN框架介绍(2)GoogleNet和ResNet

1. GoogleNet

论文地址:https://arxiv.org/abs/1409.4842
一般来说,提升网络性能最直接的方法就是增加网络深度和宽度,也就意味着网络存在大量的参数,但是大量的参数量会增加过拟合的可能性,而且会大大增加计算量。
文章认为解决上述问题的根本方法就是将全连接甚至是一般的卷积层转化为稀疏连接,有关研究表明臃肿的稀疏网络可能被不失性能的转化。
现在的目标就是有没有一种方法,既能够保持网络结构的稀疏性,又能利用密度矩阵的高计算性,有关文献表明可以将稀疏矩阵聚类转化为密度较高的子矩阵用于提高性能,由此提出了Inception结构。
在这里插入图片描述
上述为Inception结构,可以看出:

1: 使用1x1,3x3,5x5的卷积核,意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
2: 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了;
3:加入了池化层
4:网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。
但是会出现一个问题,使用5x5的卷积核意味着产生大量的参数量,为此,使用1x1的卷积核进行降维操作。具体改进的模块如下所示:
在这里插入图片描述
上一层的输出为100x100x128,经过具有256个输出的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256。但是假如上一层输出先经过具有32个输出的1x1卷积层,再经过具有256个输出的5x5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。具体参数计算可以看看这篇文章
具体的框架如下所示:
在这里插入图片描述

0、输入
原始输入图像为224x224x3,且都进行了零均值化的预处理操作(图像每个像素减去均值)。
1、第一层(卷积层)
使用7x7的卷积核(滑动步长2,padding为3),64通道,输出为112x112x64,卷积后进行ReLU操作
经过3x3的max pooling(步长为2),输出为((112 - 3+1)/2)+1=56,即56x56x64,再进行ReLU操作
2、第二层(卷积层)
使用3x3的卷积核(滑动步长为1,padding为1),192通道,输出为56x56x192,卷积后进行ReLU操作
经过3x3的max pooling(步长为2),输出为((56 - 3+1)/2)+1=28,即28x28x192,再进行ReLU操作
3a、第三层(Inception 3a层)
分为四个分支,采用不同尺度的卷积核来进行处理
(1)64个1x1的卷积核,然后RuLU,输出28x28x64
(2)96个1x1的卷积核,作为3x3卷积核之前的降维,变成28x28x96,然后进行ReLU计算,再进行128个3x3的卷积(padding为1),输出28x28x128
(3)16个1x1的卷积核,作为5x5卷积核之前的降维,变成28x28x16,进行ReLU计算后,再进行32个5x5的卷积(padding为2),输出28x28x32
(4)pool层,使用3x3的核(padding为1),输出28x28x192,然后进行32个1x1的卷积,输出28x28x32。
将四个结果进行连接,对这四部分输出结果的第三维并联,即64+128+32+32=256,最终输出28x28x256
3b、第三层(Inception 3b层)
(1)128个1x1的卷积核,然后RuLU,输出28x28x128
(2)128个1x1的卷积核,作为3x3卷积核之前的降维,变成28x28x128,进行ReLU,再进行192个3x3的卷积(padding为1),输出28x28x192
(3)32个1x1的卷积核,作为5x5卷积核之前的降维,变成28x28x32,进行ReLU计算后,再进行96个5x5的卷积(padding为2),输出28x28x96
(4)pool层,使用3x3的核(padding为1),输出28x28x256,然后进行64个1x1的卷积,输出28x28x64。
将四个结果进行连接,对这四部分输出结果的第三维并联,即128+192+96+64=480,最终输出输出为28x28x480

第四层(4a,4b,4c,4d,4e)、第五层(5a,5b)……,与3a、3b类似,在此就不再重复。

辅助分类器
根据实验数据,发现神经网络的中间层也具有很强的识别能力,为了利用中间层抽象的特征,在某些中间层中添加含有多层的分类器。如下图所示,黄色边框内部代表添加的辅助分类器。

GoogLeNet神经网络中,使用了上面提到的Inception模块和辅助分类器,而且由于全连接网络参数多,计算量大,容易过拟合,所以GoogLeNet没有采用AlexNet
(2012年ImageNet冠军队使用的网络结构,前五层是卷积层,后三层是全连接层)中的全连接结构,直接在Inception模块之后使用Average Pool和Dropout方法,不仅起到降维作用,还在一定程度上防止过拟合。
在Dropout层之前添加了一个7×7的Average Pool,一方面是降维,另一方面也是对低层特征的组合。我们希望网络在高层可以抽象出图像全局的特征,那么应该在网络的高层增加卷积核的大小或者增加池化区域的大小,GoogLeNet将这种操作放到了最后的池化过程,前面的Inception模块中卷积核大小都是固定的,而且比较小,主要是为了卷积时的计算方便。
第二幅图中蓝色部分是卷积块,每个卷积块后都会跟一个ReLU(受限线性单元)层作为激活函数(包括Inception内部的卷积块)
参考链接 :https://blog.csdn.net/songguangfan/article/details/98035644

2. ResNet

2.1 背景-----因网络深度而导致的问题
  1. 梯度爆炸和梯度消散问题,由于网络层数的增加,在网络中反向传播的梯度会随着连乘变得不稳定,变得特别小,也就是梯度消散问题
  2. 克服上述问题提出了很多有效的方法,比如BatchNorm,ReLu激活函数等等,得到了有效的处理
  3. 最后一个问题就是网络的退化,也就是随着网络深度的加深,网络的性能会越来越差,直接体现在训练集的准确率会下降,残差网络的提出就是为了解决这个问题。
    在这里插入图片描述
    上图是论文中随着网络深度的增加网络在CIFAR10-数据集上分类的训练集的错误率,可以看到如果我们直接堆叠卷积层,随着层数的增多,错误率有明显上升的趋势,其中最深的56层网络得到了最差的准确率,我们在VGG网络上验证了一下,对于CIFAR-10数据集在18层的VGG网络上耗费5分钟时间在网络训练充分的情况下得到了80%正确率,而34层的VGG模型花费8分钟得到了72%正确率,网络衰退问题确实存在。
    在作者的另一篇论文《Identity Mappings in Deep Residual Networks
    》中证明了degradation的产生是由于优化性能不好,这说明越深的网络反向梯度越难传导。

Residual Module
在这里插入图片描述
如上图所示:复制一个浅层网络的输出,这样的话当网络特征达到最佳的时候,更深层的恒等映射的任务就从原先堆叠的层当中释放到新建的恒等映射当中,而原来的层的任务就从恒等映射转为0。
F(x)=H(x)-x,x为浅层的输出,H(x)为深层的输出,F(x)为夹在两层中间的两层代表的转换,如果x已经学习到了最佳的特征了,那么任何对于x的改变都会使得loss的值的增加,那么F(x)就会趋近于0,x则从恒等映射的路径继续传递,这样的话就在不增加计算成本的情况下实现我们的目标:在前向过程中,当浅层的输出已经足够成熟(optimal),让深层网络后面的层能够实现恒等映射的作用。

那么从另一个角度看,在反向传播中,residual模块会起到什么样的作用呢?

residual模块将输出分成F(x)+x两部分,其中F依然是x的函数,也就是说F实际上是对于x的补充,是对于x的fun-tuning,这样就把任务从根据x映射成一个新的y转为了根据x求x和y之间的差距,这明显是一个相对更加简单的任务,论文是这么写的,到底怎么简单的,我们来分析一下。
举个例子,假设不加residual模块的输出为h(x)。x=10,h(x)=11,h简化为线性运算Wh 明显为1.1,
加了redidual模块后,F(x)=1,H(x)=F(x)+x=11,F也简化为线性运算,对应的WF 为0.1。当标签中的真实值为12,反向传播的损失为1,而对于F中的参数和h中参数回传的损失实际上是一样大的而且梯度都是x的值,但是对于F的参数就从0.1到0.2,而h的参数是从1.1到1.2,因此redidual模块会明显减小模块中参数的值从而让网络中的参数对反向传导的损失值有更敏感的响应能力,虽然根本上没有解决回传的损失小得问题,但是却让参数减小,相对而言增加了回传损失的效果,也产生了一定的正则化作用。
其次,因为前向过程中有恒等映射的支路存在,因此在反向传播过程中梯度的传导也多了更简便的路径,仅仅经过一个relu就可以把梯度传达给上一个模块。
所谓反向传播就是网络输出一个值,然后与真实值做比较得到一个误差损失,同时将这个损失做差改变参数,返回的损失大小取决于原来的损失和梯度,既然目的是为了改变参数,而问题是改变参数的力度过小,则可以减小参数的值,使损失对参数改变的力度相对更大。
因此残差模块最重要的作用就是改变了前向和反向信息传递的方式从而很大程度上促进了网络的优化
在这里插入图片描述
如上图所示:利用Inception3模块在空间聚合之前先进行降维不会发生信息丢失,所以这里也采用了同样的方法,加入1*1的卷积核用来增加非线性和减小输出的深度以减小计算成本。就得到了成为bottleneck的residual模块形式。上图左为basic形式,右为bottleneck的形式

综合上述:也就是shortcut模块会在前向过程中帮助网络中的特征进行恒等映射,在反向过程中帮助传导梯度,让更深的模型能够成功训练
在这里插入图片描述
上述左边为VGG19模块,中间为根据VGG19扩增的34层的普通网络,右边为34层的残差网络,不同的是每隔两层就会有一个residual模块。

结果:
在这里插入图片描述

参考链接:https://blog.csdn.net/weixin_43624538/article/details/85049699

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值