背景
- GoogleNet(也称inception)是2014年Christian Szegedy提出的一种全新的深度学习结构
- AlexNet、VGG等结构都是通过增大网络的深度(层数)来获得更好的训练效果,但层数的增加会带来很多负作用,比如overfit、梯度消失、梯度爆炸等
- 论文:
- inception v1:https://arxiv.org/pdf/1409.4842.pdf
- inception v2:https://arxiv.org/abs/1502.03167.pdf
- inception v3:https://arxiv.org/pdf/1512.00567.pdf
- inception v4:https://arxiv.org/pdf/1602.07261.pdf
原理
- Inception模块结构:多个这样inception模块便串联起GooleNet
- 使用1x1的卷积来进行升降维
- 在多个尺寸上同时进行卷积再聚合
![]() | ![]() |
- inception模块说明
- 采用不同大小的卷积核意味着不同大小的感受野(1×1,3×3,5×5),最后拼接意味着不同尺度特征的融合
- 卷积核大小采用1*1、3*3和5*5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定padding =0、1、2,采用same卷积可以得到相同维度的特征,然后这些特征直接拼接在一起
- 网络在越靠前时,感受野越小,关注到的越细节(细节纹理),所以根本看不出来特征是什么。越到后面特征越抽象,且每个特征涉及的感受野也更大(比如车轮,车身),所以越到后面越能看清特征是什么东西。随着层数的增加,3x3和5x5卷积的比例也要增加。
- 使用5x5的卷积核仍然会带来巨大的计算量,约需要1.2亿次的计算量,为减少计算成本,采用1x1卷积核来进行降维,如下图所示。
![]() | ![]() |
-
GoogleNet-Inception V1结构
-
深度方面:相比Alexnet、 VGG,层数更深,文章采用了22层。为了避免梯度消失问题,googlenet巧妙的在不同深度处增加了两个loss来保证梯度回传消失的现象。
-
宽度方面:增加了多种卷积核 1x1、3x3、5x5以及max pooling的。为了缓解concat起来的feature map厚度,在3x3前,5x5前,max pooling后分别加上了1x1的卷积核降低feature map厚度
-
GoogLeNet采用了Inception模块化(9个)的结构,共22层,方便增添和修改。
-
网络最后采用average pooling来代替全连接层,想法来自NIN,参数量仅为AlexNet的1/12,性能优于AlexNet,事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便finetune。
-
虽然移除了全连接,但是网络中依然使用了Dropout
-
|
-
GoogleNet-Inception V2结构
- 作者给出了一些已经被证明有效的用于放大网络的通用准则和优化方法,这些准则和方法适用但不局限于Inception结构
- 在网络靠前的地方避免表达瓶颈。从input到output,feature map的宽和高基本都会逐渐变小,但是不能一下子就变得很小。比如你上来就来个kernel = 7, stride = 5 ,这样显然不合适。 另外输出的维度channel,一般来说会逐渐增多(每层的num_output),否则网络会很难训练。
- 高维特征更易处理。 高维特征更易区分,会加快训练。
- 可以在低维嵌入上进行空间汇聚而无需担心丢失很多信息。比如在进行3x3卷积之前,可以对输入先进行降维而不会产生严重的后果。假设信息可以被简单压缩,那么训练就会加快。
- 平衡网络的宽度与深度
- Inception V2结构:
- 用2个连续的3x3卷积层(stride=1)组成的小网络来代替单个的5x5卷积层,保持感受野范围的同时又减少了参数量
- 提出了Batch Normalization方法,起到了正则化作用,某种程度可以减少或者取消dropout,简化网络结构
- 作者给出了一些已经被证明有效的用于放大网络的通用准则和优化方法,这些准则和方法适用但不局限于Inception结构
![]() | ![]() |
-
- 任意nxn的卷积都可以通过1xn卷积后接nx1卷积来替代。作者发现在网络的前期使用这种分解效果并不好,还有在中度大小的feature map上使用效果才会更好,对于mxm大小的feature map,建议m在12到20之间。
![]() |
- 将一个较大的二维卷积拆成两个较小的一维卷积,节约了大量参数,可加速运算并减轻过拟合,同时增加非线性扩展模型表达能力,可以处理更丰富的空间特征
- inception module有35*35,17*17,8*8三种不同结构,其中8*8结构中在分支中又使用了分支
![]() | ![]() | ![]() |
-
GoogleNet-Inception V4结构
-
网络结构如下所示
-
| Stem模块 |
Inception-A | Inception-B | Inception-C |
Reduction-A | Reduction-B |
-
Inception—ResNet 网络结构
-
-
Inception—ResNet V1结构
-
Inception Resnet-A
Inception Resnet-B
Inception Resnet-C
Reduction-A
Reduction-B
Stem of Inception-Resnet-V1
-
Inception—ResNet V2结构
-
Stem of Inception-Resnet-V2 | Reduction-A | Reduction-B |
Inception-Resnet-A | Inception-Resnet-B | Inception-Resnet-C |