图像分类CNN经典网络(二)GoogLeNet

在GoogLeNet之前,人们一直想着去创造更深层的网络去改善CNN模型,但是这样会导致参数量不断增大也不一定有一个很好的效果;随着网络层数增加可能会导致梯度消失现象。

GoogLeNet

在GoogLeNet之前,人们一直想着去创造更深层的网络去改善CNN模型,但是这样会导致参数量不断增大也不一定有一个很好的效果;随着网络层数增加可能会导致梯度消失现象。

小贴士:梯度消失是什么样?**
在我们卷积网络中层数不断增加时可能会导致梯度消失的情况,比如如果我们选区sigmoid激活函数,其导数的最大值为0.25,如果层数增大,可能会导致随着后向传播,浅层的网络梯度不断减小,对于参数的更改也就变动十分小,甚至没有。当然产生梯度消失的原因不只这一个,这个是由于激活函数的硬伤导致的,可以换用relu、leakrelu、elu等激活函数。也可以加入Batchnorm。*

V1版本

1、Inception结构
GoogLeNet提出了一种Inception结构来解决这个问题。
下图为google团队提出的早起的inception基础结构,该结构将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积池化后的尺寸是一样的,然后把其通道叠在一起即可),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。(不需要我们去实验选择用什么卷积核,让网络自己去优化抉择哪一个卷积层好。)

在这里插入图片描述
然而这个Inception原始版本,所有的卷积核都在上一层的所有输出上来做,而那个5x5的卷积核所需的计算量就太大了,造成了特征图的厚度很大,为了避免这种情况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用,这也就形成了Inception v1的网络结构,如下图所示:

在这里插入图片描述

小贴士:1x1的卷积层作用是什么?**
1x1的卷积层有降低维度的作用,比如上一层网络的输出为100x100x100,如果我们直接用5x5x50去卷积,参数量为100x5
x5x50=125000。如果我们先用1x1x50的卷积降维得到100x100x50再进行5x5x50卷积,参数量为100x1x1x50+50x5x5x50=67500,减少了两倍。所以这样加入一个1x1的卷积层能够在降低维度的情况下又能使用5x5的卷积层输出同样的尺寸。而且中间加了1*1卷积也增加了一个非线性环节提高模型表达能力。

思考:为什么VGG通常作为最基础的网络架构,Inception这么好不能作为基础?
答:主要在于Inception训练好它会更加的适用于某一个场景数据,当换了场景可能需要修改许多参数;而VGG做出的网络更具有普遍性。

2、GAP全局平均池化
第二个问题是如何处理全连接层权重过大,这里googLeNet提出了全局平均池化的方法,就是把得到的最后特征,每一层求平均后用一个点代替原来一层的特征,这样就减少了大量的全连接层参数。比如特征为771024此时要得到14096的特征,那就得用7710244096参数,如果先全局平均池化的话即先得到111024的特征,再用111024*4096即可。

3、辅助分类器
当网络层数过长时会存在 梯度消失的现象,googLeNet引入了两个辅助分类器,它感觉可能在某一层会出现梯度消失时,在这里加了一个分类器,最后的分类结果会有一个权重考虑,最终分类器全重大0.5,两个辅助分类器03。这样也类似于一个模型融合提高了系统的泛化能力。也给系统增加了额外的梯度。
在这里插入图片描述
最终V1版本的googLeNet模型结构图在这里插入图片描述
GoogLeNet网络结构明细表解析如下:
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类似,在此就不再重复。

V2版本

V2版本做了一些小的改动
BatchNormalization
以往的神经网络,我们会对数据的输入做归一化处理,降低数据之间的差异性,来提高网络的收敛速度。BatchNormalization提出普通的网络的隐含层的输出也可以加入标准化,这样也能提高网络的收敛速度,我参考了文献中的几篇博客对BN说明如下:

在我们训练时,隐含层可能训练到后期,输出的数据可能偏向于某一侧,导致sigmoid激活函数梯度减小甚至消失,导致其收敛速度大大减小,这时我们用一个均值方差归一化做处理是数据集中到正态分布中间来,便能提高收敛的速度。
但是这样是不是有了一个问题??
所有数据都归一到中间,中间部位其实是趋于一个线形函数的,那么就导致非线性的操作消失了,模型的表达能力变差。这是我们不想要的!
BN的一个精髓就出来了,他引入一个偏移,让数据便宜一下到非线性区域。
核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。
在这里插入图片描述

整理后BN算法大致思想如下图所示,求取上一级输出的平均值与方差,对所有数据做归一化处理,但是这样搞完后,数据都偏移了,所以这里还要加入一个尺度变换纠正偏移。
在这里插入图片描述

V3版本

V3版本相比之前增加了卷积拆解的思想。具体怎么说呢?

大卷积拆解为小卷积
在实际我们设计网络时,用大的卷积核会有比较好的视野,每一个点所综合考虑的因素多一些,但是这样的话,参数量就会提升。为此V2提出了一种将nn的卷积核拆解为1n后再n1卷积的方法,实验证明这个方法在卷积核复杂的时候比较好用(12<n<18)
(下图为参考文献中的一个图,之前VGG中提出过用两个3
3代替5*5的网络。)
在这里插入图片描述

参考文献

[1]大话CNN经典模型:GoogLeNet(从Inception v1到v4的演进)https://my.oschina.net/u/876354/blog/1637819
[2]神经网络中的梯度消失https://www.cnblogs.com/mengnan/p/9480804.html
[3]【深度学习】深入理解Batch Normalization批标准https://www.cnblogs.com/guoyaohua/p/8724433.html
[4]【深度学习】批归一化(Batch Normalization)
https://www.cnblogs.com/skyfsm/p/8453498.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值