深度学习篇之tensorflow(3) ---架构介绍篇二

Inception

Inception与VGGNet都是2014年ImageNet挑战赛的佼佼者, Inception取得了该年度第一名,VGGNet取得了第二名(图像定位项目的第一名)。二者都是基于“更深的网络准确率更高”的信念和AlexNet网络进一步增加网络深度而发明的,因此与AlexNet相比,它们的深度都是更深了,VGGNet最深达到了19层, Inception更是达到了22层。
与VGGNet不同的是, Inception对卷积神经网络存在的问题进行了深入的分析,并且针对几个主要问题提出了针对性的解决办法。首先是如何在增加网络深度的同时,尽可能地减少参数数量。其次是如何充分利用GPU的密集计算能力,特别是在参数减少、网络变得稀疏之后。最后是如何削弱卷积神经网络训练过程中容易出现的梯度消失的问题,尤其是浅层的神经元容易出现的梯度消失问题。

Inception 名称由来

Inception这一名称来源于电影《盗梦空间》(英文名Inception),在电影中男主角经典台词就是“We need to go deeper(我们需要走向更深)”,卷积神经网络同样也需要更深的网络,因为更深的网络带来更高的准确率,所以在参加2014年的ILSVRC的时候,GoogLeNet团队将他们的网络命名为Inception。如果我们一定要把Inception翻译成中文的话,或许“更深的网络”比较合适。

Inception的开发团队是GoogLeNet,它的大部分成员都来自Google公司,为什么他们没有将自己团队称为 GoogleNet(Google+Net),而是GoogLeNet呢?这是为了向卷积神经网络的鼻祖LeNet网络致敬。
在这里插入图片描述

背景问题分析

增加网络的深度(往往同时增加每层神经元数量)容易导致以下几个方面的问题。

  1. 导致神经网络参数的数量过多。因此如何在增加网络规模的同时尽可能地减少参数的数量是首先要考虑的问题。
  2. 增大了网络的规模(更深、更宽),需要消耗大量的计算资源,需要“有效”和“充分”地使用计算资源。
  3. 当网络的深度达到一定程度之后,浅层神经元容易出现梯度弥散的问题。这是因为,误差反向传播的时候,随着深度的增加梯度会迅速变小,从而导致权重参数变化缓慢,模型无法收敛。

架构设计思路

不管是参数数量过多的问题,还是计算量过大的问题,解决的办法都是使网络变得稀疏,需要将网络从完全连接转换成部分连接,这正是卷积神经网络逐步取代全连接神经网络的根本原因。问题是卷积神经网络已经是部分连接了,还能更进一步地减少连接的数量吗?答案是肯定的。Inception借鉴了神经科学中的赫布理论:一起激发的神经元连接在一起。受此启发, Inception的网络架构中引入了“构件块”的概念,“构件块”包含了一组神经元,或者说包含了一系列的卷积层与池化层。
与此同时,GoogLeNet还注意到,现有的计算资源在稀疏的神经网络上运行的效率低下,这是因为现代的GPU设计目标是针对密集的矩阵运算场景。当神经网络变得稀疏时,即使算术计算量下降两个数量级,由于数据查找和缓存未命中导致的资源开销就会超过算术运算的开销,所需计算时间并不会减少。为了充分利用现有计算资源的密集计算和并行计算的能力,甚至已经出现将卷积神经网络转换回全连接神经网络的尝试,这与通过稀疏减少连接数量是矛盾的、冲突的。
现在问题转化成是否能找到一种网络结构,在保持卷积神经网络的稀疏性的同时,能够充分地发挥现有计算资源的密集计算、并行计算的能力?答案是肯定的,这种网络结构就是Inception模块

  1. Inception模块正是一种既能根前一层进行稀疏连接又能充分利用现有计算机的密集计算和并行计算特性的网络结构。如下图
    在这里插入图片描述
  2. 为了减少参数数量,Inception 模块引入了1x1过滤器,放置在3x3、5x5卷积过滤器之前,以及一个3x3池化过滤器之后,以实现减少参数的目标。而这正是利用了1x1卷积的降维功能。如下图
    在这里插入图片描述
  3. 减弱梯度消失
    1. 直观的办法是,将网络低层的输出直接连接到输出层。误差方向传播时,将误差从输出层直接传递到网络的低层,这样就可以减弱梯度弥散的问题。误差直接传递到低层相当于构建了一个深度较浅的神经网络,而较浅的网络准确率较低,因此可以对网络低层的输出乘以一个较小的权重,减少网络低层对最终结果的影响。
    2. 另外,有研究表明,对于卷积神经网络来说,性能好的卷积神经网络,中间几层的输出值离散程度一般较高,所以如果将中间层的输出直接推送到输出层,参与分类预测,能够提高模型的准确率。
    3. 综合以上两点,Inception 网络中采用了旁路的办法,将中间层的输出结果乘以权重(权重设置为0.3)之后,通过旁路分类器构建块,连接到输出层,让中间层的输出结果去影响分类预测,试图达到减弱梯度弥散的影响。

在这里插入图片描述
值得注意的是,图中的最大池化层和旁路分类器分别位于图的上方和下方,其实最大池化层分别出现在第一构建层与第二构建层、第二构建层与第三构建层、第三构建层与第四构建层、第四构建层与第五构建层之间,为了让图不至于太大、容易查看,才将最大池化层画在图的上方。图中箭头依然展示了数据流向,从第一层流向最大池化层再流向第二层等,以此类推。旁路分类器分别从(4a)和(4d)接收输出数据,经过权重(0.3)调整后直接连接到输出层。

Inception v2 和 Inception v3

Inceptionv2和Inception v3都是在Inception网络的基础上,基于实验改进后的Inception 版本。它们的区别很小,所以我们将Inception v2和Inception v3放在一章中介绍。它们的主要区别在于集成了改进项目(排列组合)的多寡不同。其中, Inception v3比Inception v2集成了更多的改进,包括对7×7的过滤器进行了卷积分解,以及在旁路分类器执行了批标准化的操作。标准化操作就是让所有的输入变量减去均值,这样模型能够更快地拟合。批标准化操作,就是在每一个批次的训练数据集上执行标准化操作(均值是这个批次的均值,而不是全部数据的均值)。

具体措施:
优化思路与之前构建Inception的思路一脉相承,主要有以下几个方面:第一,继续增加网络的深度和宽度,提高模型的准确率,同时,竭尽所能地减少参数,避免参数过多导致模型无法训练和管理;第二,进一步优化Inception模块结构,提高并行计算的能力,尽可能地充分使用计算资源;第三,叠加以上各种要素,通过构建模型来实际验证的方式,发现实际可行的模型架构,比如之前提到的旁路分类器等。

增加网络的深度,主要是通过Inception模块的堆叠,以及在Inception模块内部增加网络层数。减少参数的数量主要是通过卷积分解实现,即将一个大的过滤器(卷积核)分解成两个小的过滤器。
优化Inception模块结构,提高并行计算能力是说将卷积和池化的两个过程并行执行,更加充分利用现代计算资源的并行计算和密集计算的特点。

堆叠其他各种要素以及旁路分类器等特点,将以上优化措施组合使用,通过实验对比的方法找到最优的网络架构。在各种优化措施的组合中,如果存在多种组合方案,那么与上一节的指导原则比较,尽可能选择符合上述指导原则的方案,并且尽量避免严重偏离上述指导原则的方案。

指导原则

基于大规模的实验,并且构建了大量的各种不同的卷积神经网络架构,GoogLeNet团队提出了几个最佳实践原则。这些原则有推测的因素,需要进一步的实验数据验证。经过实验验证,严重偏离这些原则会导致网络的精准度降低,修复这些偏离之后,网络的精度能够提高。

总而言之,这些原则对于Inception网络架构的设计具有指导意义,这些原则包括以下几点。

  1. 要避免出现特征表达的瓶颈。从信息论的角度,卷积神经网络可以看作从输入层到输出层的信息流。这个信息流的任何切面都包含了一定的信息量。我们要避免对信息进行过度压缩(数据降维),防止出现特征表达的瓶颈,前面的几层尤其要注意这个问题。除了降维可能导致的特征表达的瓶颈之外,邻近像素之间的相关信息也非常重要。
  2. 更高维度的特征表示,更容易在网络内通过本地化处理。在卷积神经网络中增加激活函数的个数(每个过滤器都带有激活函数),能够生成更多的离散特征,这些离散特征有助于提高模型分类的准确率和模型的训练速度。
  3. 空间聚合可以在低纬度的过滤器嵌入完成,一般不会带来信息表达的瓶颈。例如,在执行3×3卷积之前,可以先执行一个1×1的卷积,对输入的数据进行降维,一般不会使特征表达能力降低。对于图像来说,邻近像素之间的相关信息很重要,降维并不会减少这些信息,同时由于这些信息很容易压缩,降维甚至可以提高模型的训练速度。
  4. 要平衡网络的深度和宽度。通过增加网络的深度和每个层的过滤器个数能够提高模型的准确率,但最优性能的网络往往深度和宽度比较平衡。通过并行增加网络的宽度和深度,可以让计算资源相对平衡地分配给网络的宽度和深度。

这些原则具有指导意义,需要谨慎地应用才能发挥作用。

卷积分解

卷积分解并不是新鲜事物了,主要是将尺寸较大的过滤器用几个小的过滤器替代。但是之前的过滤器都是对称的,也就是宽度和高度都是一样的。那么如果宽度和高度不一样可以吗?答案是肯定的,非对称过滤器能够节省更多的参数。下图展示了一个3x3的过滤器替换成一个1x3和一个3
x1的过滤器。
在这里插入图片描述

理论已经证明,任何一个nxn的过滤器,都可以使用一个1xn和一个nx1来替换,并且n越大,所能节省的参数百分比越大。

并行池化

在卷积神经网络中,常常需要通过池化操作来缩小特征图谱的尺寸。一般来说,为了避免出现特征瓶颈导致最终的准确率降低,往往在执行池化操作之前,增加过滤器的数量,期望借助更多的过滤器获取更多的特征,这种方式可以较好的避免了特征瓶颈的问题,但是消耗的计算资源变多了。
另一种方式是先池化,然后使用数量更多的过滤器来执行卷积操作,虽然减少了计算资源,但是可能会出现特征瓶颈的问题。

针对该问题,GoodLeNet团队提出来一种能够并行执行卷积核池化的方法。如下图。其中(a)部分是改进后的Inception模块,与之前的模块区别在于其中的过滤器的尺寸是3×3、步长都是2,这样卷积输出的尺寸缩小到原来的一半,池化操作也是类似的,步长也是2,所以针对相同的输入,二者输出的尺寸是相同的,它们的输出张量可以直接串联(堆叠)在一起,形成最终的输出,输入输出的张量形状如图11-4中(b)所示。
在这里插入图片描述

批量标准化

批量标准化是指在一批训练数据上的标准化操作,最常用的标准化操作如减去均值除以标准差操作。

批量标准化作用

根本原因是引入批量标准化操作能够解决层数很多的神经网络训练困难的问题。产生这个问题的原因有两个。

  1. 第一个是分批训练导致的问题。每个批次之间的样本数据的分布都是不同的,这导致参数需要适应各个批次的分布情况,导致模型拟合困难。
  2. 梯度消失或梯度爆炸问题。

分析以上两个问题,可以发现根源在于不同批次训练数据的分布不同。批量标准化操作的本质在于将每批次的输入数据映射到一个标准正态分布,该分布满足均值为0方差为1。通过这种映射解决了不同批次之间的数据分布不同的问题,同时将绝大部分数据(大于95%的数据)映射到梯度不容易为线性的区域,对抗梯度消失和梯度爆炸的问题。

批量标准化的原理

批量标准化的意义在于,将输入数据映射到均值为0、方差为1的正态分布区间,如图11-5中(a)所示。从概率分布可知,映射后的数据有95%的概率落入[-2,2]的取值区间,对于sigmod 这样的激活函数来说,[-2,2]的取值区间对应的梯度是比较大的,几乎是线性的,如图11-6中(a)所示。数据落入[-2,2]的取值区间之外时,对应的梯度很小,正是容易发生梯度消失的区域。
在这里插入图片描述

低分辨率输入的性能

在生活中,一张图像(如照片)中往往不会只有一个对象(物体),在ILSVRC挑战赛中就有对象定位和对象分类识别比赛项目。实现思路:首先完成对象定位,即在原始图像中完成对象的检测,检测到对象大致在图像中的哪个区域,并将对象框选出来;然后将框选出来的区域里的那个类别的对象识别出来。
在第二个步骤中,由于一个图像包含多个对象,所以,框选的区域往往比较小,对应的图像分辨率会比较低,如果输入图像的分辨率(宽度和高度的像素个数较少)很低,这时我们该怎么办?
为了在低分辨率的输入图像上获得更高的准确率,我们的模型需要从模糊的特征中,发现能够用于识别图像的细节。一个简单的思路是,在模型的前两层中,减小过滤器的滑动步长,或者干脆取消池化层,这样做显然会增加计算量。我们想要知道的是,这样做增加的计算量是否是线性增长的,或者说是否是可以接受的。

团队对其进行了实验,结果如下
在这里插入图片描述
因此,结论就是,如果输入图像的分辨率比较低,可以在开始的前两层卷积中,通过减小过滤器的步长,以及取消池化层的办法来达到较高的识别准确率。但是这个结论不能滥用,盲目减小输入图像分辨率,会导致模型的准确率大幅度地降低。

结构图

inception v2:
在这里插入图片描述
inception v3:
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值