一、背景

GoogLeNet、VGGNet分别是2014年ImageNet挑战赛的第一名和第二名,相对于VGGNet的网络结构,GoogLeNet则进行了大胆的尝试,提出了Inception结构,这种结构的最大的特点就是提高了计算资源的利用率。虽然GoogLeNet只有22层,但是整个网络的尺寸却比AlexNet和VGGNet小很多。GoogLeNet在扩大深度和宽度的同时,保持计算预算不变,这是非常难得的。

二、初识Inception结构

2.1 Inception naive version(原始版本Inception)

Inception结构经历了4个版本,其中,由于Inception V4是与残差神经网络进行结合,在此先不讲述。下面对Inception的各个版本进行详细介绍。
一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题:
(1)参数太多,如果训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。
解决这种问题的方式当然是在增加网络的宽度和深度的同时减少参数(减少参数是为了高性能的计算)。因此,Google团队提出了Inception结构,以保持高性能计算的同时增加网络的宽度和深度。
那么。Inception结构具体是什么样的呢?

图(a)中,将1*1、3*3、5*5卷积和3*3池化堆叠在一起,卷积池化后的feature map尺寸相同,对这结构设计的原因,我的理解是:众所周知,卷积核越大,说明感受野越大,提取的信息语义层次特征更高;卷积核越小,感受野越小,提取到的特征更为直观。将不同卷积核提取到的feature map叠加在一起,不仅有直观的特征,而且也有语义层次高的特征,这样特征信息会更加丰富。但设计Inception的初衷是为了保持高性能计算,这样5*5的卷积核的计算量显得未免也太大了,这与Inception设计的初衷相悖。于是Google团队对Inception的原始版本进行了改进,即Inception V1。

2.2 使用1*1卷积的优势

使用1*1卷积的优势:

  • 减少参数量,减少计算量

    • 假设输入feature map的维度是256维,要求输出维度也是256维,有以下两种操作:

      • (1)256维的输入直接经过一个3*3*256的卷积层,输出一个256维的feature map,那么参数量为:(3*3*256)*256 = 589824
      • (2)256维的输入先经过一个1*1*256*64的卷积层,再经过一个3*3*64的卷积层, 最后经过一个1*1*256的卷积层,输出256维,参数量为:(1*1*256*64)+(3*3*64*64)+(1*1*64*256) = 69532 可以看到,参数量减少了大约8.5倍
  • 实现跨通道的信息交互和信息整合
    • 使用1*1卷积核,其实就是对不同的channel间的信息做线性组合的一个变换过程。比如输入为3*3*3的feature map,后面添加一个1*1*3*64个的卷积核,就变成了3*3*64的feature map,原来的3个channels就可以理解为跨通道线性组合变成了64channels,这就是通道间的信息交互。
  • 增加非线性
    • 1*1卷积核,在获得相同感受野(reception feild)、保持feature map尺度不变的情况下,使用1*1卷积核的网络更深,而每一层网络后都会用Relu函数增加非线性,这样就增加了一层非线性特性。

2.3 Inception V1

在3*3卷积和5*5卷积之前,使用1*1卷积主要是为了减少参数量,从而减少计算。至于为什么减少了,上一小节已经描述了,在此不再赘述了。

2.4 GoogLeNet结构

  • 1.网络的最后采用全局平均池化代替全连接层,该想法来自NIN。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整。网络中虽然用全局平均池化替代了全连接层,但是网络模型还是用到了dropout,来减少过拟合现象。
  • 2.为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在推理过程时,这两个额外的softmax会被去掉。(摘自https://my.oschina.net/u/876354/blog/1637819)

2.5 GoogLeNet细节图

三、Batch Normalization

推荐阅读博文(深入了解BN):https://blog.csdn.net/dongjinkun/article/details/109001484

3.1 BN的相关概念

什么是Batch Normalization?在了解什么是Batch Normalization之前,需要先了解3个概念,第一个是IID独立同分布假设,第二个是covariate shift,第三个是internal covariate shift。

  • IID独立同分布假设:假设训练数据和测试数据是满足独立同分布的,这是通过训练数据学得的模型能够在测试集上获得好的效果的一个基本保障。
  • internal covariate shift:神经网络是一个包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临covariate shift的问题,也就是在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是像covariate shift问题只发生在输入层。
  • covariate shift:covariate shift只针对输入层,含义输入的输入分布总是变来变去,这不符合IID独立同分布假设,网络模型很难学习到稳定的特征,结果是网络模型的泛化能力很差。

3.2 BN的本质思想

BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其输入分布逐渐发生偏移或者变动,之所以模型训练收敛慢,一般是输入整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。

BN是要干什么呢?
BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,将,激活输入分布固定下来,这样使得激活输入值落在非线性函数对输入比较敏感的区域(对于Sigmoid函数来说,输入会更大概率的落在[-2,2]区间上,该区间上梯度较为明显),意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

3.3 训练阶段如何做BN变换

对于d维数据,对每一维的数据都做BN变换,使其变为均值为1、方差为0的标准正态分布,下面以第k维举例:

BN变换算法流程(算法1):

未添加BN层:

添加BN层之后:

经过BN变换后,神经元的激活X形成了均值为0,方差为1的正态分布,目的就是把X变换至梯度明显的区域,但是这样会导致网络表达能力下降,为了防止这一点,每个神经元增加两个调节参数(scale和shift),这两个参数是通过训练来学习到的,用来对变换后的激活反变换,使得网络表达能力增强,即对变换后的激活进行如下的scale和shift操作,这其实是BN变换的反操作:

3.4 BN的推理过程

BN在训练的时候可以根据Mini-Batch里的若干训练实例进行激活数值调整,但是在推理(inference)的过程中,输入就只有一个实例,那么这时候怎么对输入做BN呢?可以用从所有训练实例中获得的统计量来代替Mini-Batch里面m个训练实例获得的均值和方差统计量。如何求训练集的均值和方差呢?这里不进行解释了,只提供方法,均值是利用了滑动平均法求得,方差是使用的无偏估计。

对上述算法的一点解释:

  • 1-7行:其实就是算法1,也就是对K维数据分别进行BN变换,使得每一维的数据分布都为均值为1、方差为0的标准正态分布。
  • 8-12行:是模型的推理过程。
  • 第11行公式是具体怎么来的?
    • 其实就是一个简单的恒等变换,推导过程如下:

3.5 添加BN层后的Inception结构

3.6 BN的优势

  • 1.加快模型的收敛速度
  • 2.使用BN,可以设置大的学习率,并且对于权重的初始化要求也不那么严格
  • 3.BN还可以充当正则化器,减缓dropout的使用

四、Inception V2

Inception V2最主要的工作就是对大的卷积(3*3、5*5)进行分解,例如,一个5*5卷积核获得的感受野和两个3*3卷积核叠加获得的感受野相同,但是3*3卷积核的参数量要比5*5卷积核的参数量要少约2.78倍,所以,1个5*5的卷积核可以由2个3*3代替。

4.1 卷积分解(Factorizing Convolutions)


分解5*5卷积后,Inception结构变成如下:

这时,google团队又思考了,能不能进一步的分解卷积,例如,将卷积核分解成2*2卷积,然而,事实证明,使用非对称卷积可以做得比2*2卷积更好。例如:在保持获得相同感受野的前提下,使用1个3*1卷积+1个1*3卷积可以代替3*3卷积。

4.2 非对称卷积( Asymmetric Convolutions)


使用非对称卷积后:

然而,Google团队发现,这种非对称卷积在神经网络早期的效果并不理想,换句话说,这种非对称卷积方式在比较大的feature map(size:n*n,12≤n≤20)上使用时,效果会比较好。在这个层次上,使用1个1*7卷积+1个7*1卷积会得到一个比较好的结果。

4.3 降低feature map的尺寸

原文提到,降低feature map尺寸的方式有2种:

  • 1.先对feature map进行池化,然后再做Inception卷积。这种方式虽然会减少计算量,但是会造成特征信息缺失,也就是会遇到特征瓶颈,因为池化只是提取了最明显的特征(这里以最大池化为例,因为现在最大池化用的较多,平均池化基本不用了)。
  • 2.先对feature map进行Inception卷积,然后再进行池化。这种方式是正常的缩放,但这种方式计算量很大。为了同时保持特征表示且降低计算量,将网络结构改为下图,使用两个并行化的模块来降低计算量(卷积、池化并行执行,再进行合并)

五、Inception V3

5.1 GoogLeNet发展历程

总结一下GoogLeNet的发展历程:

  • 1.Inception的原始版本
  • 2.Inception V1版本
  • 3.Inception-BN版本
  • 4.Inception V2版本(其中,依次包括卷积分解、非对称卷积)
  • 5.Inception V3版本,见下文。

5.2 Inception V3

论文中提到:

红笔标记处提到:表格3中最后一行的模型称之为Inception V3,也就是Inception V2+Batch Normalization = Inception V3。

至此,除Inception V4版本,其余版本已经介绍完,其中,有很多细节由于篇幅问题没有详细说明,详细了解还需要仔细阅读文章。

七、参考文献

  • https://my.oschina.net/u/876354/blog/1637819
  • https://www.cnblogs.com/guoyaohua/p/8724433.html
  • Going deeper with convolutions
  • Rethinking the Inception Architecture for Computer Vision
  • Batch Normalization: Accelerating Deep Network Training by
    Reducing Internal Covariate Shift

白话详细解读(一)-----GoogLeNet(Inception V1-Inception V3)相关推荐

  1. 【模型解读】GoogLeNet中的inception结构,你看懂了吗

    文章首发于微信公众号<与有三学AI> [模型解读]GoogLeNet中的inception结构,你看懂了吗 这是深度学习模型解读第3篇,本篇我们将介绍GoogLeNet v1到v3. 作者 ...

  2. 经典卷积神经系列(Inception v1\v2\v3\v4、ResNet、ResNext、DenseNet、SENet)

    写在前面:此文只记录了下本人感觉需要注意的地方,不全且不一定准确.详细内容可以参考文中帖的链接,比较好!!! 经典的CNN:Inception v1\v2\v3\v4.Resnet.Resnext.D ...

  3. 使用自己的数据集训练GoogLenet InceptionNet V1 V2 V3模型(TensorFlow)

    使用自己的数据集训练GoogLenet InceptionNet V1 V2 V3模型(TensorFlow) [尊重原创,转载请注明出处]https://blog.csdn.net/guyueali ...

  4. 「模型解读」GoogLeNet中的inception结构,你看懂了吗

    https://www.toutiao.com/a6706860769624982020/ 1 Inception V1[1] GoogLeNet首次出现在2014年ILSVRC 比赛中获得冠军.这次 ...

  5. 全局稳定性收敛平衡点为0吗_「模型解读」GoogLeNet中的inception结构,你看懂了吗...

    作者 | 李健(微信号:lijian05170517) 编辑 | 言有三 1 Inception V1[1] GoogLeNet首次出现在2014年ILSVRC 比赛中获得冠军.这次的版本通常称其为I ...

  6. 从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2

    from:https://blog.csdn.net/qq_14845119/article/details/73648100 Inception v1的网络,主要提出了Inceptionmodule ...

  7. 白话详细解读(六)----- BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation

    一.论文简介 论文链接:https://openaccess.thecvf.com/content_ECCV_2018/html/Changqian_Yu_BiSeNet_Bilateral_Segm ...

  8. 白话详细解读(二)-----AlexNet

    一.AlexNet简介 2012年,Alex Krizhevsky可以算作是LeNet的一个更深和更广的版本,可以用来学习更加复杂的对象. Alex的要点 1.用ReLU得到非线性,用ReLU非线性函 ...

  9. 白话详细解读(七)----- CBAM:Convolutional Block Attention Module

    一.CBAM简介 论文链接:https://x.sci-hub.org.cn/scholar?hl=zh-TW&as_sdt=0%2C5&q=CBAM%3A+Convolutional ...

最新文章

  1. TCP_Wrappers 基于TCP的安全控制
  2. Ubuntu16.04 Linux上比较好用的截图工具Flameshot
  3. python中文件位置的书写
  4. 王牌之作 特斯拉国产Model Y明年初下线
  5. 远程屏幕传输“差异截图”的问题。
  6. 多益网络 视频面试面试总结20180816
  7. Python数据分析扩展库pandas的DataFrame排序方法小结
  8. 翼次元空间:智协云店通+BitCOO的4WiN.io全球互贸链 | Fund++
  9. UE4UI制作_MainMenu
  10. Jmeter_基本操作-取样器
  11. [渝粤教育] 西南科技大学 广告学 在线考试复习资料
  12. mysql grant什么意思_MySQL grant 语法的详细解析
  13. 每次发版都搞到晚上11点,我们能不能……
  14. 各种浏览器User-Agent大全
  15. Python学习笔记 day9 堡垒机前戏之paramiko模块
  16. 综合柜台业务基本规范
  17. 用正则表达式实现千分位分隔符
  18. 【FPGA学习记录1】异步FIFO的介绍
  19. 三丰三坐标编程基本步骤_零基础学习工业机器人PLC编程的基本步骤
  20. 图形加速卡技术 [专业的基础技术文章]

热门文章

  1. 18_使用react脚手架构建应用
  2. python第三十二课——队列
  3. 5-3如何设置文件的缓冲
  4. IDA Pro的patch插件 KeyPatch
  5. 【Unity3D自学记录】判断物体是否在镜头内
  6. 正确使用Core Data多线程的3种方式
  7. linux下ioctl遇到的坑
  8. (转)工作了一个星期各位一定累了吧,那我们一起来表单验证一番吧!
  9. self.view = nil 和[self.view release]的区别
  10. 编程的精髓:发现问题,解决问题