zoukankan      html  css  js  c++  java
  • 什么是GoogleNet?什么是Inception?GoogleNet结构详解(2014年)

    googleNet是2014年的ILSVRC的冠军模型,GoogleNet做了更大胆的网络上的尝试,而不是像vgg继承了lenet以及alexnet的一切框架。GoogleNet虽然有22层,但是参数量只有AlexNet的1/12

    GoogleNet论文指出获得高质量模型最保险的做法就是增加模型的深度,或者是它的宽度,但是一般情况下,更深和更宽的网络会出现以下问题:

    1. 参数太多,容易过拟合,如果训练数据有限,则这一问题更加突出;
    2. 网络越大计算复杂度越大,难以应用;
    3. 网络越深,容易出现梯度消失问题

    总之更大的网络容易产生过拟合,并且增加了计算量

    GoogleNet给出的解决方案:

    1. 将全连接层甚至一般的卷积都转化为稀疏连接

    GoogleNet为了保持神经网络结构的稀疏性,又能充分利用密集矩阵的高计算性能,提出了名为Inception的模块化结构来实现此目的。依据就是大量文献都表明,将稀疏矩阵聚类为比较密集的子矩阵可以提高计算性能。(这一块我没有很明白,是百度到的知识,但是关键在于GoogleNet提出了Inception这个模块化结构,在2020年的今日,这个模块依然有巨大作用)

    Inception

    这是一种王中王结构,哦不,是网中网结构(Network in Network)。就是原来的节点也是一个网络,使用了Inception,这个网络结构的宽度和深度都可以扩大。从而带来性能的提升。
    在这里插入图片描述
    解释说明:

    • 采用不同大小的卷积核意味着,大小不同的感受野,最后拼接意味着不同尺度特征的融合。
    • 之所以卷积核采用1,3,5,主要是为了方便对其,设定卷积步长stride=1后,只需要分别设置pad=0,1,2,这样卷积后就可以得到相同维度的特征,然后直接拼接在一起
    • 文章中说很多地方都表明pooling很有效果,所以这列也引入了。。。。。。
    • 网络约到后面,特征月抽象,而且每个特征所设计的感受野也更大了,因此,在层数的增加,3x3和5x5的卷积的比例增加(后面会看到)
    • 使用5x5的卷积核仍然会带来巨大的计算量,为此文章借鉴NIN2,采用1x1的卷积核来降低维度。到底是如何使用1x1的卷积核降低维度的呢?假设有一个3x3x10的图片特征,长宽都是1,然后channel,我喜欢叫它厚度是10,我们想要降低维度到5,怎么办呢?首先我们需要找到一个1x1x10的卷积核,然后卷积结果应该是一个3x3x1的一个特征图,我们可以找到5个这个的卷积核,卷积五次,得到的图片就会使3x3x5这样的特征图了,当然同理,1x1卷积核也可以用来提高维度

    从网上找了一张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类似,在此就不再重复。


    到这里!我们看美图应该能看出来一点,GoogleNet的结构就是3+3+3总共九个inception模块组成的,每个Inception有两层,加上开头的3个卷积层和输出前的FC层,总共22层!然后每3层的inception之后都会有一个输出结果,这个网络一共有三个输出结果,这是什么情况呢?


    这个是辅助分类器,GoogleNet用到了辅助分类器。因为除了最后一层的输出结果,中间节点的分类效果也可能是很好的,苏哟一GoogleNet将中间的某一层作为输出,并以一个较小的权重加入到最终分类结果中。其实就是一种变相的模型融合,同时给网络增加了反向传播的梯度信号,也起到了一定的正则化的作用。


    最后,我再提出两个问题:

    1. 如果使用1x1进行特征压缩,是否会影响最终结果?
      回答:不会,作者的解释是,如果你想要把特征厚度从128变成256,你可以直接用3x3进行特征提取。如果你先用1x1进行压缩到64,然后再用3x3把64channel的特征扩展成256,其实对后续的精度没有影响,而且减少了运算次数。

    2. 为什么inception是多个尺度上进行卷积再聚合?
      回答:直观上,多个尺度上同时卷积可以提取到不同尺度的特征。而这也意味着最后分类判断更加准确。除此之外,这是可以利用稀疏矩阵分解成密集矩阵计算的原理来加快收敛速度。(第二个好处没有太看懂)
      个人浅显的理解就是:提取多个尺度的特征,再聚合的时候,就可以找到关联性强的特征,这样就能避免浪费在关联性较弱的特征上的计算力吧。


    喜欢的话加个微信公众号支持一下吧~目前主要再整理针对机器学习算法岗位的面试可能遇到的知识点。

    公众号回复【下载】有精选的免费机器学习学习资料。 公众号每天会更新一个机器学习、深度学习的小知识,都是面试官会问的知识点哦~

    • 【机器学习的基础数学(PDF)】
    • 【竞赛中的大数据处理流程(PDF)】
    • 【如何做大数据的基础特征工程(PDF)】
    • 【自然语言处理NLP的应用实践大合集(PDF)】
    • 【python入门级教材(400页PDF)】

    公众号每天会更新一个机器学习、深度学习的小知识,都是面试官会问的知识点哦~

    在这里插入图片描述

  • 相关阅读:
    LeetCode 275. H-Index II
    LeetCode 274. H-Index
    LeetCode Gray Code
    LeetCode 260. Single Number III
    LeetCode Word Pattern
    LeetCode Nim Game
    LeetCode 128. Longest Consecutive Sequence
    LeetCode 208. Implement Trie (Prefix Tree)
    LeetCode 130. Surrounded Regions
    LeetCode 200. Number of Islands
  • 原文地址:https://www.cnblogs.com/PythonLearner/p/12925700.html
Copyright © 2011-2022 走看看