个人博客:http://www.chenjianqu.com/

原文链接:http://www.chenjianqu.com/show-71.html

论文:Christian Szegedy,etc. Rethinking the Inception Architecture for Computer Vision

素质三连

1.论文贡献

提出网络设计的4个原则,

提出卷积核的非对称分解,

提出Inception-v2和Inception-v3,

提出标签平滑(LSR)技术。

2.实验结果

基于集成的Inception-v3使用multi-crop在ILSVRC 2012达到3.5%的top-5错误率,达到SOTA。

3.存在的问题

网络深度达到42层,不够深。

通用设计原则

Inception由于架构的复杂性,比较难以改造网络结构。如果直接按比例增大网络,Inception会失去本身的高效的计算效果。GoogLeNet的论文<Going deeper with convolutions>里面也没有详细说明各种设计决策的原因,因此Inception比较难以适应新的任务。本文提出了一些通用的原则用于高效的拓展网络。

作者通过大量的实验得出的卷积网络的设计原则,虽然有些原则的效果也只是推测,但是当网络设计偏离这些原则的时候,模型效果会严重退化。

    1.避免表示瓶颈(representational bottlenecks),尤其在网络早期。前馈神经网络可以用输入到输出的无环图表示,这定义了信息流动的方向。对于任何将输入与输出分隔开的cut,都可以该cut传递的信息量。应该避免bottleneck极度压缩,从输入到输出网络的表示应该缓慢的下降。

理论上说,信息量不应该仅由表示的维度评价,还跟一些重要的因素比如相关结构有关,表示的维度只能粗略的评估表示能力。

    2.特征越多,收敛越快。原文: Higher dimensional representations are easier to process locally within a network. Increasing the activations per tile in a convolutional network allows for more disentangled features. The resulting networks will train faster. [知乎]相互独立的特征越多,输入的信息就被分解的越彻底,分解的子特征间相关性低,子特征内部相关性高,把相关性强的聚集在了一起会更容易收敛。

    3.在空间聚合(Spatial aggregation)之前,可以在尽量不降低表示能力的情况下减少特征的维度。比如,在执行3x3卷积之前,减少输入表示的维数,而不会产生严重的负面影响。原因是特征图中的相邻区域具有强相关性,存在信息冗余,特征维度压缩只损失很少的信息,但是可以加快网络的学习。

    4.平衡网络的宽度和深度。增加网络的宽度和深度都可以提高网络的性能,但是只有网络的宽度和深度达到平衡时,网络的效率最高。

卷积核的分解

GoogLeNet性能很大程度上来自于降维(通用设计原则3)的广泛使用,这可以看作是一种高效分解卷积的特殊情况。这里探索了将卷积核分解的几种方法。通过适当的分解,我们可以得到更多的解纠缠参数(disentangled parameters,看通用设计原则2),从而加快训练。此外,可以使用节省的计算和内存来增加网络滤波器数量。这里提出两种分解卷积的方式。

1.将大卷积核分解为小卷积核

使用大卷积核比如5x5或7x7,计算量太大。可以将一层5x5卷积替换为两层串联的3x3卷积,或将一层7x7卷积替换为三层串联的3x3卷积,这个思想来源于VGGNet。分解的过程如下:

原始的Inception架构:

将Inception架构中的5x5卷积替换为3x3卷积:

上面这种替换通过共享相邻块之间的权重来减少参数数量,相同输入输出特征数的情况下,两个3x3和一个5x5参数量比值为(9+9)/25=0.72,也就是说替换后获得了28%的相对增益。这样做就有两个问题:这种替换会导致表示的下降吗?如果我们的主要想对卷积层计算的线性部分进行因式分解,那么在第一层中保留线性激活不是更好吗?

作者做了对比实验回答上面的问题:一组是两个3x3都使用ReLU,另一组是只有后一个3x3使用ReLU激活,结果如下:

从上面的结果可以看到两个3x3卷积都使用ReLU的结果更好,这是因为这样增强了非线性表示能力。

2.将卷积核非对称分解

3x3还可以分解为更小的卷积吗?比如分解为2x2卷积?实验结果表明分解为nx1卷积优于分解为2x2卷积。比如,使用3x1和1x3卷积串联等价于3x3卷积,如下图:

替换后,参数只有原来的(3+3)/9=66%。作为比较,3x3分解为两个2x2卷积,参数为原来的8/9=89%,因此前者更加高效。理论上可以将nxn卷积分解为1xn卷积和nx1卷积串联,而且高效得多。

将非对称卷积分解应用在Inception架构,如下图:

但是作者发现上面这种卷积分解并不适用所有的层,特别是网络的早期。但是在网络的中期,特征图大小在12-20范围内时,可以取得比较好的效果,此时可以用1x7和7x1卷积核取得较好的效果。

特征图的减小

传统使用池化去减小特征图的大小,为了避免representational bottleneck,在池化之前,先对特征图的滤波器数量进行拓展(通用设计原则1)。比如,要将DxDxK的特征图转换为D/2xD/2x2xK的特征图,首先进行stride=1、滤波器数量为2k的卷积,然后再进行池化。但是这样做总的计算量很大。另一个方式可以先池化再卷积,可以减少1/4的计算量。然而这样会导致representational bottlenck,因为先对特征图进行了下采样,在提取特征。如下图左边:

作者找到了一个两全其美的方法(牛逼),使用两个平行的stride=2的模块:P和C,P是池化模块,C卷积模块,对两个模块的输出进行concat,如下图。

辅助分类器

在 GoogLeNet论文中,引入了辅助分类器概念,以提高非常深网络的收敛性。但是作者发现在训练的早期,辅助分类器并没有任何卵用,在接近训练的结束的时候,辅助分类器可以提高一点精度。

GoogLeNet中使用了两个辅助分类器,去掉接在网络早期的辅助分类器没有任何影响。结合上一段,GoogLetNet论文中说的辅助分类器帮助低级特征收敛理论,实际上很可能只是放错了位置。作者认为辅助分类器起到的是正则化的作用,因为发现当辅助分类器使用BN或dropout的时候,主分类器表现更好。也侧面证明了BN有正则化的作用。

标签平滑(Label-Smoothing Regularization,LSR)

这里提出一种通过估计训练过程中label-dropout的边缘效应来正则化分类器的机制[原文:Here we propose a mechanism to regularize the classifier layer by estimating the marginalized effect of label-dropout during training]。

对于训练样本x,网络最后的softmax层输出的预测概率为p(k|x)=exp(zi)/sum(exp(z)),其中zi是未归一化的log-概率值或称为logit值。类别标签为q(k|x),且sum(q(k|x))=1。

交叉熵损失函数:L(q,p)=-sum(q(k|x)*log(p(k|x)))。最小化该损失函数,等价于最大化ground-truth类别的log似然值。交叉熵函数对于zi是可微的,其梯度为p(k|x)-q(k|x),值区间为[-1,1]。

对于训练样本x,其标签为y,类别标签分布:q(k|x)=delta_xy,其中delta_xy是Dirac函数,即当k=y时,delta_xy=1,否则delta_xy=0。

当采用预测的概率来拟合真实的概率时,只有当ground-truth标签的logit值远远大于其它类别标签的logit值时才行。但这可能出现两个问题:1.可能导致过拟合,模型学习的结果是将全部概率值分配给groundtruth类别标签,则不能保证其泛化能力。2.其鼓励最大的Logit值远大于其它标签的logit值,但是结合梯度的有界性,会削弱模型的适应能力。也就是说,模型对groundtruth太自信了,玩意标注的数据错了呢。

因此这里提出一种机制鼓励模型减少自信,称为标签平滑(Label-Smoothing Regularization,LSR)

假设一个标签分布u(k),一个平滑参数epsilon,对于一个标签为y的训练样本x,我们使用q’(k|x)代替q(k|x),q’(k|x)=(1-epsilon)* delta_xy+epsilon*u(k)。该公式将原始的groundtruth标签分布q(k|x)与固定的分布u(k)融合在一起,通过权重1-epsilon和epsilon。

这里采用均匀分布作为u(k),即u(k)=1/K,则q’(k|x)=(1-epsilon)* delta_xy+epsilon/K。

交叉熵为:L(q’,p)=-sum(q‘(k|x)*log(p(k|x)))=(1-epsilon)*L(q,p)+epsilon*L(u,p)

等价于将单个交叉熵损失函数替换为一对交叉熵损失函数L(q,p)和L(u,p)。L(u,p)惩罚了标注的标签分布p相对于先验分布u的偏差。

该偏差也可以从KL散度的角度计算,H(u,p)=D_KL(u||p)+H(u)。

在ImageNet实验中,K=1000个类别,u(k)=1/1000,epsilon=0.1,在ILSVRC2012上对top1和top5大约有0.2%的提升。

低分辨率输入

一个经典的视觉任务是目标检测,一般用CNN将生成的region proposals提取特征,这些region proposal一般都很小、分辨率很低,由此产生的问题是如何适当的处理低分辨率的输入。

普遍的看法是,采用更高分辨率输入的模型能提高模型的性能,这是真的吗?是因为高分辨率的输入还是因为模型容量的问题提高模型表现?为了更加精确的评估分辨率对模型性能的影响,作者设置了下面三组实验:

1.输入分辨率为299x299,第一层卷积stride=2,后接最大池化。

2.输入分辨率为151x151,第一层卷积stride=1,后接最大池化。

3.输入分辨率为71x71,第一层卷积stride=1,后无最大池化。

三个模型,除了第一个卷积层,其它层完全一样,在ILSVRC2012数据集上训练并测试,结果如下:

虽然低分辨率的网络需要更长的时间来训练,但最终结果的质量与高分辨率的网络相当接近。因此,适当降低输入分辨率对模型影响不大。如果根据输入分辨率去降低网络的容量,那么网络的性能会差得多。

Inception v2

将上面提到的方法在Inception模型上实现,架构:

像之前说的那样,将7x7卷积分解为3个3x3卷积串联,将5x5卷积分解为两个3x3卷积串联。上表中第一个Inception部分是3个经典的Inception模块的串联:

第二个Inception部分是5个高级一点的Inception模块串联:

第三个Inception部分使用两个非对称卷积的Inception模块:

网络更详细的配置放在补充材料(我没找到)里面。尽管网络达到42层,计算花费是GoogLeNet的2.5倍,但是仍然少于VGGNet。

实验结果与Inception v3

训练参数

使用Tensorflow框架,batch_size=32,epochs=100,使用RMSProp:decay=0.9, 小常量=1.0。学习率为0.045,使用指数衰减学习率,每两个epoch衰减,衰减率为0.94。使用梯度截断[论文:On the difficulty of training recurrent neural networks],阈值为2.0.

实验结果与比较

上面的每行Inception-v2模型都是累积修改的结果。将上表最后一行的模型称为Inception-v3,集成了本文提到的各种tricks。multi-crop测试结果如下:(下面的top-5 error与top-1 error应该放反了)

集成模型的结果:

结论:

本文介绍了几个通用设计原则用于增大网络,这里提出的Inception v3的single crop最终达到top-1错误率:21.2%、top-5错误率:5.6%在ILSVR 2012分类任务上,达到sota。

代码实现环节

待续

参考文献

[1]Christian Szegedy,etc. Rethinking the Inception Architecture for Computer Vision

[2]AIHGF. InceptionV3 - 类别标签平滑正则化LSR. https://www.aiuai.cn/aifarm632.html

Inception v2/v3原理与实现相关推荐

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

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

  2. android怎样判断插入数据是否成功_Android 端 V1/V2/V3 签名的原理

    Android 的安装包签名方案到目前有3个版本,分别是: 最初签名方案V1: 为了提高验证速度和覆盖度在 7.0 引入的 V2: 以及为了实现密钥轮转在 9.0 引入的 V3. 让我们分别了解一下这 ...

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

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

  4. AndroidV1,V2,V3签名原理详解

    AndroidV1,V2,V3签名原理详解 签名校验流程 不同的签名版本之间的区别 V1签名保护机制 V2签名保护机制 V3签名保护机制 怎样判断使用的是哪种签名 参考链接: 签名校验流程 基础知识: ...

  5. 网络模型 Inception V2/V3-Rethinking the Inception Architecture for Computer Vision

    https://github.com/Moodstocks/inception-v3.torch 本文是对 GoogleNet 网络模型 Inception 架构的重思考和改进,Inception V ...

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

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

  7. PyTorch 实现经典模型7:YOLO (v1, v2, v3, v4)

    YOLO (v1, v2, v3, v4) 网络结构 YOLO v3 网络结构 代码 Ref <机器爱学习>YOLO v1深入理解 <机器爱学习>YOLOv2 / YOLO90 ...

  8. 白话详细解读(一)-----GoogLeNet(Inception V1-Inception V3)

    一.背景 GoogLeNet.VGGNet分别是2014年ImageNet挑战赛的第一名和第二名,相对于VGGNet的网络结构,GoogLeNet则进行了大胆的尝试,提出了Inception结构,这种 ...

  9. 系统学习深度学习(十九)--GoogLeNetV1,V2,V3

    转自:http://blog.csdn.net/shuzfan/article/details/50738394 参考:http://www.jianshu.com/p/33197e469414 同时 ...

最新文章

  1. 土拍熔断意味着什么_半小时3宗地接连熔断 今日长沙土拍关键字:“焱”
  2. Mac 安装Fiddler 抓包工具
  3. mysql 格林时间转换_格林时间转换成正常时间
  4. python输入姓名_Python 用户输入用户名,进行验证
  5. html圆形空心选择按钮,CSS3 简单的实心/空心按钮
  6. windows模拟微信小程序_微信PC端可以打开小程序了!目前仅支持Windows系统
  7. 手机蓝牙如何减少延时_JEET ONE真无线耳机测评-高颜值低延时的集合
  8. 干货|别找了,分享80个无版权、高清、免费图片素材网站给你!
  9. 【Excel】按百分比随机抽取excel中数据
  10. .NET获取微信openid
  11. 为什么房价不能跌,房租必须涨
  12. 输入某年某月某日,判断这一天是星期几
  13. 国内缺少一个slideshare
  14. macOS Monterey 12.6.1 (21G217) 正式版 ISO、IPSW、PKG 下载
  15. YOLOv5-优化器和学习率调整策略
  16. 身体好比什么都强 [唱片]
  17. logistic回归的应用
  18. QFS文件系统-学习记录
  19. oracle rac 仲裁盘_11G ORACLE OCR和仲裁盘恢复
  20. oracle日期函数大全一(Date)

热门文章

  1. 怎么看mysql的最大连接数_怎么查看和修改 MySQL 的最大连接数?
  2. php this 和 self,PHP中this和self的区别
  3. 《重构-改善既有代码的设计》学习笔记(二)
  4. 将JSON对象带有格式的写出到文件中
  5. 一段良好的程序永远不应该发生panic异常
  6. UIwebView缩放
  7. input type=checkbox 前面有个可供打钩的小方框 HTML DOM Checkbox 对象
  8. java readLine()
  9. iOSMVVM(Model-View(View/ViewController) -ViewModel ) 设计模式
  10. 区间DP{环形}:石子归并-2