zoukankan      html  css  js  c++  java
  • Inception in CNN

    之前也写过GoogLeNet的笔记。但那个时候对Inception有些似懂非懂,这周又一次看了一遍,觉得有了新的体会,特地又一次写一篇博客与它再续前缘。

    本文属于论文笔记性质。特此声明。

    Network in Network

    GoogLeNet提出之时,说到事实上idea是来自NIN。NIN就是Network in Network了。

    NIN有两个特性。是它对CNN的贡献:

    • MLP取代GLM
    • Global Average Pooling

    mlpconv

    普通的卷积能够看做是比較特殊的GLM,GLM就是广义线性模型。那么MLP是指,在做卷积操作的时候,把线性操作变为多层感知机。

    这个idea的理论基础是多层感知机的抽象能力更强。假如我们把从图像中抽取出来的特征称作是这个图像的隐含概念(仅仅是一个名称罢了,不要过度追究)。那么假设隐含概念是线性可分的,那么,GLM抽取出来的特征没有问题。抽象表达能力刚刚好。可是假如隐含概念并非线性可分的,那么就悲剧了。在仅仅使用GLM的情况下,不得只是度的使用filter来表现这个隐含概念的各个方面,然后在下一层卷积的时候又一次将这些概念组合,形成更加抽象的概念。

    所以。基于如上,能够觉得,在抽特征的时候直接做了非线性变换。能够有效的对图像特征进行更好的抽象。

    从而,Linear convolution layer就变成了Mlpconv layer。

    值得一提的是,Mlpconv相当于在正常的卷积层后面,再加入一个1×1的卷积层。

    Global Average Pooling

    Global Average Pooling的做法是将全连接层去掉。

    全连接层的存在有两个缺点:

    • 全连接层是传统的神经网络形式,使用了全连接层以为着卷积层仅仅是作为特征提取器来提取图像的特征。而全连接层是不可解释的。从而CNN也不可解释了
    • 全连接层中的參数往往占领CNN整个网络參数的一大部分,从而使用全连接层easy导致过拟合。

    而Global Average Pooling则是在最后一层,将卷积层设为与类别数目一致,然后全局pooling。从而输出类别个数个结果。

    使用了mlpconv和Global Average Pooling之后,网络结构例如以下:

    Inception

    读google的论文,你立刻会感到一股project的气息扑面而来。像此时的春风一样。凌厉中透着暖意。所谓凌厉,就是它能把一个idea给用到节省内存和计算量上来,太偏实现了,所谓暖意。就是真的灰常有效果。

    自2012年AlexNet做出突破以来。直到GoogLeNet出来之前。大家的主流的效果突破大致是网络更深。网络更宽。

    可是纯粹的增大网络有两个缺点——过拟合和计算量的添加。

    解决这两个问题的方法当然就是添加网络深度和宽度的同一时候降低參数,为了降低參数。那么自然全连接就须要变成稀疏连接,可是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,由于大部分硬件是针对密集矩阵计算优化的。稀疏矩阵尽管数据量少,可是所耗的时间却是非常难缺少。

    所以须要一种方法,既能达到稀疏的降低參数的效果。又能利用硬件中密集矩阵优化的东风。

    Inception就是在这样的情况下应运而生。

    第一步。将卷积分块。所谓的分块就是事实上就是将卷积核分组,既然是分组索性就让卷积和不一样吧。索性使用了1×1,3×3,5×5的卷积核,又由于pooling也是CNN成功的原因之中的一个,所以把pooling也算到了里面。然后将结果在拼起来。这就是最naive版本号的Inception。

    对于这个Inception,有两点须要注意:

    • 层级越高。所相应的原始图片的视野就越大。相同大小的卷积核就越难捕捉到特征,因而层级越高,卷积核的数目就应该添加。

    • 1×1。3×3。5×5 仅仅是任意想出来的,不是必须这样。

    这个naive版的Inception,另一个问题,由于全部的卷积核都在上一层的全部输出上来做,那5×5的卷积核所需的计算量就太大了。因而,能够採用NIN中的方法对上一层的输出进行Merge。这样就衍生出了真正可用的Inception。

    这个结构利用了NIN结构中非线性变换的强大表达能力。

    同一时候,正如上一篇博客决策森林和卷积神经网络二道归一中的隐式数据路由,计算量也大大降低。由于四个分支之间是不须要做计算的。

    再同一时候,还具有不同的视野尺度。由于不同尺寸的卷积核和pooling是在一起使用的。

    旁白赞曰:其谋略不可为不远,其心机不可谓不深啊。

    之前心中一直有个疑问,那就是max-pooling之后的feature_map不是应该长宽都减半了么,那怎么与conv的输出拼接。后来才想到。是自己被theano中的实现误导了,theano的实现是自己主动就缩小了,但stride为1的时候,max_pooling的输出还能够是长宽不变。

    GoogLeNet的模型參数具体例如以下:

    结构例如以下:

    须要注意的是。为了避免梯度消失,网络额外添加了2个辅助的softmax用于向前传导梯度。文章中说这两个辅助的分类器的loss应该加一个衰减系数,实际測试的时候,这两个额外的softmax会被去掉。

    Inception-V2

    Google的论文另一个特点,那就是把一个idea发挥到极致。不挖干净绝不罢手。

    所以第二版的更接近实现的Inception又出现了。Inception-V2这就是文献[3]的主要内容。

    Rethinking这篇论文中提出了一些CNN调參的经验型规则。暂列例如以下:

    • 避免特征表征的瓶颈。特征表征就是指图像在CNN某层的激活值,特征表征的大小在CNN中应该是缓慢的减小的。
    • 高维的特征更easy处理。在高维特征上训练更快。更easy收敛
    • 低维嵌入空间上进行空间汇聚。损失并非非常大。

      这个的解释是相邻的神经单元之间具有非常强的相关性。信息具有冗余。

    • 平衡的网络的深度和宽度。宽度和深度适宜的话能够让网络应用到分布式上时具有比較平衡的computational budget。

    Smaller convolutions

    简而言之,就是将尺寸比較大的卷积,变成一系列3×3的卷积的叠加,这样既具有相同的视野。还具有更少的參数。

    这样可能会有两个问题,
    - 会不会降低表达能力?
    - 3×3的卷积做了之后还须要再加激活函数么?(使用ReLU总是比没有要好)

    实验表明。这样做不会导致性能的损失。

    个人觉得,用大视野一定会比小视野要好么? 叠加的小视野还具有NIN的效果。所以,平分秋色我觉得还不能说是由于某个原因。

    于是Inception就能够进化了,变成了

    Asymmetric Convoluitons

    使用3×3的已经非常小了。那么更小的2×2呢?2×2尽管能使得參数进一步降低,可是不如另一种方式更加有效,那就是Asymmetric方式,即使用1×3和3×1两种来取代3×3. 例如以下图所看到的:

    使用2个2×2的话能节省11%的计算量。而使用这样的方式则能够节省33%。

    于是。Inception再次进化。

    注意:实践证明。这样的模式的Inception在前几层使用并不会导致好的效果,在feature_map的大小比較中等的时候使用会比較好

    Auxiliary Classifiers

    在GoogLeNet中,使用了多余的在底层的分类器。直觉上能够觉得这样做能够使底层能够在梯度下降中学的比較充分。但在实践中发现两条:

    • 多余的分类器在训练開始的时候并不能起到作用。在训练快结束的时候。使用它能够有所提升
    • 最底层的那个多余的分类器去掉以后也不会有损失。
    • 以为多余的分类器起到的是梯度传播下去的重要作用,但通过实验觉得实际上起到的是regularizer的作用,由于在多余的分类器前加入dropout或者batch normalization后效果更佳。

    Grid Size Reduction

    Grid就是图像在某一层的激活值。即feature_map,普通情况下。假设想让图像缩小。能够有例如以下两种方式:

    右图是正常的缩小,但计算量非常大。左图先pooling会导致特征表征遇到瓶颈,违反上面所说的第一个规则,为了同一时候达到不违反规定且降低计算量的作用,将网络改为下图:

    使用两个并行化的模块能够降低计算量。

    V2-Inception

    经过上述各种Inception的进化。从而得到改进版的GoogLeNet。例如以下:

    图中的Figure 4是指没有进化的Inception。Figure 5是指smaller conv版的Inception,Figure 6是指Asymmetric版的Inception。

    Label Smoothing

    除了上述的模型结构的改进以外,Rethinking那篇论文还改进了目标函数。

    原来的目标函数,在单类情况下,假设某一类概率接近1,其它的概率接近0,那么会导致交叉熵取log后变得非常大非常大。从而导致两个问题:

    • 过拟合
    • 导致样本属于某个类别的概率非常的大,模型太过于自信自己的推断。

    所以,使用了一种平滑方法。能够使得类别概率之间的区别没有那么大,

    用一个均匀分布做平滑,从而导致目标函数变为:

    该项修改能够提升0.2%。

    Rethinking 那篇论文里还有关于低分辨率的输入的图像的处理,在此不赘述了。

    參考文献

    [1]. Lin M, Chen Q, Yan S. Network in network[J]. arXiv preprint arXiv:1312.4400, 2013.

    [2]. Szegedy C, Liu W, Jia Y, et al. Going deeper with convolutions[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 1-9.

    [3]. Szegedy C, Vanhoucke V, Ioffe S, et al. Rethinking the Inception Architecture for Computer Vision[J]. arXiv preprint arXiv:1512.00567, 2015.

  • 相关阅读:
    fishredux 大体流程
    flutter Container组件和Text组件
    vue 页面跳转以及传参
    mySql 查询当天、本周、最近7天、本月、最近30天的语句
    Flutter编译时下载依赖报错的解决方案
    计算属性和方法
    计算属性传参
    原生js发送请求
    MySQL数据库连接
    flask 蓝图
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7341576.html
Copyright © 2011-2022 走看看