GoogLeNet (二) Inception 相关概念

文章目录

  • 一、原始Inception的基本结构
    • 1.1 Filter concatenation
    • 1.2 降低特征图厚度演进出V1、V2、V3、V4
    • 1.3 1x1的卷积核有什么用呢?
    • 1.4 搭建Inception网络问题
    • 1.5 InceptionV1参数少但是效果好的原因
  • 二、Inception 知识点
    • 2.1 MLP 多层神经网络
    • 2.2 Network In Network 瓶颈层降低网络的计算成本
    • 2.3 全局平均池化
    • 2.4 DepthConcat
    • 2.5 LRN (Local RespNorm)
    • 2.6 GAP(全局平局均池化)
    • 2.7 全连接FC 目的
  • 三、GoogLeNet网络结构明细表解析
    • 3.0 输入
    • 3.1 第一层(卷积层)
    • 3.2 第二层(卷积层)
    • 3.3 第三层
      • 3.1.1 Inception 3a层
      • 3.1.1 Inception3b
    • 3.4 第四层
  • 四、Inception网络原理
    • 4.1 原始 Inception网络原理
    • 4.2 previous layer
    • 4.3 Inception v1的亮点总结
    • 4.4 GoogleNet网络结构
  • 有趣的事,Python永远不会缺席
  • 培训说明

GoogLeNet (一)VGG、AlexNet和Inception关系\GoogLeNet从Inception v1到v4的演进 https://blog.csdn.net/u010986753/article/details/98980390

一、原始Inception的基本结构

Inception网络即是Inception模块的重复拼接,其中插有额外的有池化层来改变模型的宽度和高度。 所有卷积和池化操作均使用Padding=”SAME”卷积/池化方式 。

  • AleXNet (8层)
  • VGGNet(19层)
  • inception V1 具有22层。包括池化层的话是 27 层,该模型在最后一个 inception 模块处使用全局平均池化。

1.1 Filter concatenation

  Filter concatenation不需要混合不同大小的图。换句话说就是Filter concatenation混合的是相同的尺寸的图。 确切地说,Filter Concatenation其实很简单,就是把图按深度链接起来。举个例子,如有2个3×3×4的输入,1个3×3×2的输入,3个3×3×1的输入,可以看到输入中一共有2×4+1×2+3×1 =13个通道那么经过Filter Concatenation后就是3×3×13。

  通过设计一个稀疏网络结构,但是能够产生稠密的数据,既能增加神经网络表现,又能保证计算资源的使用效率。谷歌提出了最原始Inception的基本结构:

GoogLeNet (二) Inception 相关概念_第1张图片

1.2 降低特征图厚度演进出V1、V2、V3、V4

  该结构将CNN中常用的卷积(1x1,3x3,5x5)、 池化(3x3) 操作堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。

  网络卷积层中的网络能够提取输入的每一个细节信息,同时5x5的滤波器也能够覆盖大部分接受层的的输入。还可以进行一个池化操作,以减少空间大小,降低过度拟合。在这些层之上,在每一个卷积层后都要做一个 ReLU操作,以增加网络的非线性特征。

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

GoogLeNet (二) Inception 相关概念_第2张图片

原始结构:

  • 参数:(1×1×192×64) + (3×3×192×128) + (5×5×192×32) = 153600
  • 最终输出的feature map:64+128+32+192 = 416

加入不同channel的1×1卷积后:

  • 参数
    1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32)=15872
  • 最终输出的feature map: 64+128+32+32=256

  所以加入1×1的卷积后,在降低大量运算的前提下,降低了维度
降低维度也是inception module一个非常明智的举措。

如下图 Inception V1 架构所示

GoogLeNet (二) Inception 相关概念_第3张图片

1.3 1x1的卷积核有什么用呢?

  1x1卷积的主要目的是为了减少维度,还用于修正线性激活(ReLU)。比如,上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256,其中,卷积层的参数为128x5x5x256= 819200。而假如上一层输出先经过具有32个通道的1x1卷积层,再经过具有256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,大约减少了4倍。

1.4 搭建Inception网络问题

  当构建卷积层时,你要决定卷积核的大小究竟是1∗3还是3∗3或者是5∗5.并且什么时候加入池化层。这些都是十分繁琐而纠结的。
  而Inception网络的作用就是代替你来做决定以构建网络的结构。虽然网络结构因此变得更加复杂,但是网络变现却非常好。

1.5 InceptionV1参数少但是效果好的原因

  • 去除了最后的全连接层,大大减少了参数量,并减轻了过拟合。用“全局平均池化层来代替”(该想法来源于 Network In Network)
  • 精心设计的“inception model”提高了参数的利用率。

二、Inception 知识点

2.1 MLP 多层神经网络

  多层感知器(Multi-Layer Perceptron,MLP)也叫人工神经网络(Artificial Neural Network,ANN),除了输入输出层,它中间可以有多个隐层,最简单的MLP只含一个隐层,即输入层、隐层和输出层才能称为一个简单的神经网络。
在这个模型中,我们输入的x特征会连接到隐层的神经元,隐层的神经元再连接到输入层的神经元。在这个多层感知器层与层之间是全连接的(全连接的意思就是:上一层的任何一个神经元与下一层的所有神经元都有连接)。

  神经网络要解决的最基本问题是分类问题。我们将特征值传入隐层中,通过带有结果的数据来训练神经网络的参数(W,权重;b,偏置),使输出值与我们给出的结果一致,既可以用来预测新的输入值了。

2.2 Network In Network 瓶颈层降低网络的计算成本

  注: Network In Network 网络中的网络是对每一个感受野都进行一个NIN的操作。 1∗1的卷积也被称为Network in Network

  • 提出一个NIN深度网络结构用来增强模型在感知野对局部图像块的辨别力。
  • 提出在卷积层使用“非线性”替代现有的“线性模型”
  • 使用由MLP组成micro neural网络zoo为非线性模型去提取特征

使用Network in Network瓶颈层降低网络的计算成本

  假设输入层的大小为28∗28∗192192个通道的特征图,想要使192个通道的特征图压缩为具有32个通道的特征图,则可以使用32个1∗1∗192的卷积核对这个特征图进行卷积操作。具体而言,一般只需要设置卷积核的长和宽而无需设置卷积核的通道数维度。因为一般而言卷积核的第三个维度是和原始特征图的通道数量保持一致的。

GoogLeNet (二) Inception 相关概念_第4张图片

目的就是将左边较大的特征图压缩成较小的中间层,这个中间层有时被称为瓶颈层(bottleneck layer)

  瓶颈层所有神经元计算成本为
28∗28∗16∗1∗1∗192=2.4M=240W

  第二个卷积层得计算成本为
28∗28∗32∗5∗5∗16=10M=1000W

  所以这两层的计算成本之和为
240W+1000W=1240W

  这使得原来的120M的计算成本降低成大约原来的10分之1即12.4M,所需的加法次数与乘法次数相近,所以只统计了乘法运算的次数。

  事实证明,只要合理构建瓶颈层,你既可以显著的缩小表示层规模又不会降低网络性能,从而大大节省了计算

2.3 全局平均池化

  在MLPconv最后一层为每一个分类任务的相应种类生成一个特征映射。

优点:

  (1) 全局平均池化更原生的支持卷积结构,而通过加强特征映射与相应分类的对应关系。
  (2)没有需要优化的参数,避免归一化
  (3)汇总了空间信息,因此对空间变化时健壮的。

2.4 DepthConcat

  聚合操作,在输出通道这个维度上聚合(一个inception module每个分支通道数可能不一样,但是feature map大小应该是一样的。strides=1,padding=same)
https://blog.csdn.net/u010986753/article/details/98980390

2.5 LRN (Local RespNorm)

  Local Response Normalization,即局部响应归一化层。
  归一化化是归纳统一样本的统计分布性。就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。

为什么要归一化,归一化目的是什么?
(1)为了后面数据处理的方便,归一化的确可以避免一些不必要的数值问题。
(2)为了程序运行时收敛加快。
(3)同一量纲。样本数据的评价标准不一样,需要对其量纲化,统一评价标准。这算是应用层面的需求。
(4)避免神经元饱和。啥意思?就是当神经元的激活在接近0或者1时会饱和,在这些区域,梯度几乎为0,这样,在反向传播过程中,局部梯度就会接近0,这会有效地“杀死”梯度。
(5)保证输出数据中数值小的不被吞食。

2.6 GAP(全局平局均池化)

  全局平均池化(Global average Pooling),一个feature map 全局平均池化后得到一个值,再进行全连接(softmax)就会少很多参数。

GoogLeNet (二) Inception 相关概念_第5张图片

2.7 全连接FC 目的

  全连接的目的是什么呢?因为传统的网络我们的输出都是分类,也就是几个类别的概率甚至就是一个数–类别号,那么全连接层就是高度提纯的特征了,方便交给最后的分类器或者回归。
  但是全连接的参数实在是太多了,所以现在的趋势是尽量避免全连接,近期的大部分论文FC多用全局平均池化层(GAP,Global Average Pooling)的方法代替。GAP的思想就是:用 feature map 直接表示属于某个类的 confidence map,比如有10个类,就在最后输出10个 feature map,每个feature map中的值加起来求平均值,这十个数字就是对应的概率或者叫置信度。然后把得到的这些平均值直接作为属于某个类别的 confidence value,再输入softmax中分类, 更重要的是实验效果并不比用 FC 差。

  GAP的优势是:

  • 1.因为FC的参数众多,这么做就减少了参数的数量(在最近比较火的模型压缩中,这个优势可以很好的压缩模型的大小)。
  • 2.因为减少了参数的数量,可以很好的减轻过拟合的发生。

三、GoogLeNet网络结构明细表解析

3.0 输入

  原始输入图像为224x224x3,且都进行了零均值化的预处理操作(图像每个像素减去均值)。

3.1 第一层(卷积层)

使用7x7的卷积核(滑动步长2,padding为3),64通道,输出为112x112x64,卷积后进行ReLU操作,经过3x3的max pooling(步长为2),输出为((112 - 3+1)/2)+1=56,即56x56x64,再进行ReLU操作。

3.2 第二层(卷积层)

  使用3x3的卷积核(滑动步长为1,padding为1),192通道,输出为56x56x192,卷积后进行ReLU操作,经过3x3的max pooling(步长为2),输出为((56 - 3+1)/2)+1=28,即28x28x192,再进行ReLU操作.

3.3 第三层

3.1.1 Inception 3a层

  分为四个分支,采用不同尺度的卷积核来进行处理

  • 64个1x1的卷积核,然后RuLU,输出28x28x64
  • 96个1x1的卷积核,作为3x3卷积核之前的降维,变成28x28x96,然后进行ReLU计算,再进行128个3x3的卷积(padding为1),输出28x28x128
  • 16个1x1的卷积核,作为5x5卷积核之前的降维,变成28x28x16,进行ReLU计算后,再进行32个5x5的卷积(padding为2),输出28x28x32
  • pool层,使用3x3的核(padding为1),输出28x28x192,然后进行32个1x1的卷积,输出28x28x32。

  将四个结果进行连接,对这四部分输出结果的第三维并联,即64+128+32+32=256,最终输出28x28x256

3.1.1 Inception3b

  • 128个1x1的卷积核,然后RuLU,输出28x28x128
  • 128个1x1的卷积核,作为3x3卷积核之前的降维,变成28x28x128,进行ReLU,再进行192个3x3的卷积(padding为1),输出28x28x192
  • 32个1x1的卷积核,作为5x5卷积核之前的降维,变成28x28x32,进行ReLU计算后,再进行96个5x5的卷积(padding为2),输出28x28x96
  • pool层,使用3x3的核(padding为1),输出28x28x256,然后进行64个1x1的卷积,输出28x28x64。

  将四个结果进行连接,对这四部分输出结果的第三维并联,即128+192+96+64=480,最终输出输出为28x28x480

3.4 第四层

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

  从GoogLeNet的实验结果来看,效果很明显,差错率比MSRA、VGG等模型都要低,对比结果如下表所示:

GoogLeNet (二) Inception 相关概念_第6张图片

四、Inception网络原理

4.1 原始 Inception网络原理

  • Inception网络可以代替人工来确定卷积层中卷积核的类型,或者确定是否需要创建卷积层或池化层。
  • 假设输入为28∗28∗192的具有192个通道的图片。以下卷积都是通过”SAME”方式进行卷积。使用64个1∗1的卷积核得到的特征图大小为28∗28∗64,如果使用128个3∗3的卷积核进行卷积,得到的特征图的大小为28∗28∗128.
  • 假设Inception网络的输入是一个28∗28∗192的具有192个通道的特征图片,使用32个5∗5的卷积核以Padding=”SAME”的方式进行卷积,则输出为28∗28∗32 ,.此时将三个特征图堆叠在一起。
  • 使用了32个过滤器,每个过滤器的大小为5∗5∗192因为输入图片的信道数量为192。所以对于输出特征图中的28∗28∗32个节点,每一个都需要进行5∗5∗192次乘法运算,即每个输出值所需的乘法运算次数乘以输出值的个数。
    28∗28∗32∗5∗5∗192=120M=1.2亿
  • 当然你也可以直接使用最大值池化层,输出的结果为28∗28∗32。也将结果特征图堆叠在一起。为了使所有的特征图长和宽一致,需要对池化层也使用Padding=“SAME”操作。此时,这个堆叠起来的28∗28∗256的结构被称为”Inception模块”。
  • 基本思想是Incetion 网络不需要人为决定使用哪个过滤器,或者是否需要池化,而是由网络自行决定确定这些参数。你可以给模块增加这些参数,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合。

4.2 previous layer

  • 假设previous layer的大小为28*28*192,则,

  • a的weights大小,1*1*192*64+3*3*192*128+5*5*192*32=387072

  • a的输出featuremap大小,28*28*64+28*28*128+28*28*32+28*28*192=28*28*416

  • b的weights大小,1*1*192*64+(1*1*192*96+3*3*96*128)+(1*1*192*16+5*5*16*32)+1*1*192*32=163328

  • b的输出feature map大小,28*28*64+28*28*128+28*28*32+28*28*32=28*28*256

写到这里,不禁感慨天才般的1*1 conv,从上面的数据可以看出一方面减少了weights,另一方面降低了dimension。

4.3 Inception v1的亮点总结

  (1)卷积层共有的一个功能,可以实现通道方向的降维和增维,至于是降还是增,取决于卷积层的通道数(滤波器个数),在Inception v1中1*1卷积用于降维,减少weights大小和feature map维度。

  (2)1*1卷积特有的功能,由于1*1卷积只有一个参数,相当于对原始feature map做了一个scale,并且这个scale还是训练学出来的,无疑会对识别精度有提升。

  (3)增加了网络的深度

  (4)增加了网络的宽度

  (5)同时使用了1*1,3*3,5*5的卷积,增加了网络对尺度的适应性

4.4 GoogleNet网络结构

  (1)整个网络为了保证收敛,有3个loss

  (2)最后一个全连接层之前使用的是global average pooling,全局pooling使用的好了,还是有好多地方可以发挥的。

'''
【干货来了|小麦苗IT资料分享】
★小麦苗DB职场干货:https://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w
★小麦苗数据库健康检查:https://share.weiyun.com/5lb2U2M
★小麦苗微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail
★各种操作系统下的数据库安装文件(Linux、Windows、AIX等):链接:https://pan.baidu.com/s/19yJdUQhGz2hTgozb9ATdAw  提取码:4xpv
★小麦苗分享的资料:https://share.weiyun.com/57HUxNi
★小麦苗课堂资料:https://share.weiyun.com/5fAdN5m
★小麦苗课堂试听资料:https://share.weiyun.com/5HnQEuL
★小麦苗出版的相关书籍:https://share.weiyun.com/5sQBQpY
★小麦苗博客文章:https://share.weiyun.com/5ufi4Dx
★数据库系列(Oracle、MySQL、NoSQL):https://share.weiyun.com/5n1u8gv
★公开课录像文件:https://share.weiyun.com/5yd7ukG
★其它常用软件分享:https://share.weiyun.com/53BlaHX
★其它IT资料(OS、网络、存储等):https://share.weiyun.com/5Mn6ESi
★Python资料:https://share.weiyun.com/5iuQ2Fn
★已安装配置好的虚拟机:https://share.weiyun.com/5E8pxvT
★小麦苗腾讯课堂:https://lhr.ke.qq.com/
★小麦苗博客:http://blog.itpub.net/26736162/
'''

有趣的事,Python永远不会缺席

欢迎关注小婷儿的博客

    文章内容来源于小婷儿的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

    如需转发,请注明出处:小婷儿的博客python    https://blog.csdn.net/u010986753

博客园 https://www.cnblogs.com/xxtalhr/

CSDN https://blog.csdn.net/u010986753

有问题请在博客下留言或加作者:
     微信:tinghai87605025 联系我加微信群
     QQ :87605025
     python QQ交流群:py_data 483766429

培训说明

OCP培训说明连接 https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA

OCM培训说明连接 https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA

     小婷儿的python正在成长中,其中还有很多不足之处,随着学习和工作的深入,会对以往的博客内容逐步改进和完善哒。重要的事多说几遍。。。。。。

你可能感兴趣的:(keras)