热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

图像分类(三)GoogLenetInception_v3:RethinkingtheInceptionArchitectureforComputerVision

InceptionV3网络(注意,不是module了,而是network,包含多种Inceptionmodules)主要是在V2基础上进行的改进,特点如下:将滤波器尺寸(Filte

Inception V3网络(注意,不是module了,而是network,包含多种Inception modules)主要是在V2基础上进行的改进,特点如下:

  • 将滤波器尺寸(Filter Size)较大的卷积分解成若干滤波器尺寸较小的卷积。根据作者在论文中提出的optimization ideas,大卷积总可以被分解成3*3卷积层序列,而且需要的话还可以进一步分解成更小的卷积,如n*1卷积,事实上,这比2*2卷积层更好。对大卷积层进行分解的好处显而易见,既可以加速计算(多余的计算能力可以用来加深网络的宽度等),又可以使网络的深度进一步增加,从而增加网络的非线性表达能力;
  • 更加精细地设计了35*35/17*17/8*8模块(即Fig.5、Fig.6、Fig.7);
  • 增加了网络的宽度(特征在H/W/C三个方向上的维度数)。网络输入从224*224变成了299*299

其实,主要的特点都在Fig.5、Fig.6以及Fig.7所示的3种改进的Inception modules上。


以下是论文的详细内容:

      为了避免直接增加模型尺寸(虽然能增加模型的性能,但是会是计算量激增),作者在该论文中通过适度的分解卷积和主动正则化(aggressive regularization)来扩展网络。实验证明,这些方法能给模型带来可观的性能提升。


1. 背景

      虽然VGGNet结构简单的特点引人注目,但是该网络的计算开销非常高。另一方面,GoogLeNet的Inception architectrue性能水平与VGGNet相近,但是参数量却少很多,甚至可以在内存和计算能力严格受限的情况下也能很好地运行。相比于AlexNet使用了60 million parameters,GoogLeNet仅有5 million parameters,减少12倍,而VGGNet的参数量是AlexNet的3倍

      Inception及其继任者的计算代价比VGGNet低很多。这一点使得将Inception network(使用Inception module的网络)应用到需要以合理的代价预处理大量数据和内存与计算能力不足的场景中变得可能,比如在移动视觉设备中。显然,为了达到这一目的,我们需要以特别的方式来使用内存或通过一些计算技巧优化某些操作的执行,但是,这样做会带来额外的复杂性。不过,这些方法也可以被用来优化Inception architecture,再次扩大效率差距

      Inception architecture复杂的结构使得很难对网络结构进行改进,如果单纯地放大网络结构,那么大部分计算性能可能失去。而且,GoogLeNet作者并没有对设计网络结构过程中考虑的影响因素进行清晰描述。这就使得GoogLeNet在应用于实例时很难保证它的高效性。因此,作者在该论文中按照一套合理的原则来优化Inception architecture。

      在论文中,作者先介绍了一些已经被证实能有效地扩展卷积网络的通用原则(genral principles)和优化思想(optimization ideas),具体会在下面部分介绍。


2. 通用设计原则(General Design Principles)

      以下的设计原则是基于各种卷积网络结构进行大规模实验总结得到的。虽然下列原则的使用具有投机性(也就是说使用这些原则时并不确定会发挥该有的作用,而是在进行尝试),并且未来需要额外的实验来评估其准确性和有效领域,但是,在实际中如果严重偏离这些原则的话会导致网络性能恶化,修复检测出的偏差后通常又会提升网络的性能。具体原则如下:

  1. 避免表征瓶颈(representational bottlenecks),尤其在网络的前面。在网络中应该避免使用极端压缩的瓶颈。通常在获得用于任务的最终表示(representation)之前,表示大小(representation size)应该从输入到输出缓慢减小。理论上,信息内容(information content)不能仅通过表示的维度来评估,因为它丢失了诸如相关结构等重要的因素;维度仅提供了对信息内容的粗略估计。(所谓表征瓶颈就是网络中间某层对特征在空间维度(维度一般指H*W*C的数值,而不是说严格意义上的3个维度)进行较大比例的压缩,比如使用pooling,导致很多特征丢失。虽然Pooling是CNN结构中必须的功能,但我们可以通过一些优化方法来减少Pooling造成的损失,比如下面会提到的先增加通道方向上的维度,后进行pooling)
  2. 更高维度的表示(representations)(就是尺寸更大的表示,也就是更大尺寸的特征,比如更大的feature maps等)在网络中更容易局部处理(将耦合的特征分开来处理)。增加卷积网络中每个tile(也就是每个patch)的激活值数目可以得到更多解耦的特征(相互独立的特征),这将使网络训练得更快(不是因为计算量减小,而是收敛加快)。这段话我也不是太懂,看到网上的解释如下:特征的数目(我理解为神经元数目越多,w/h/c三个方向上的)越多收敛得越快。相互独立的特征越多,输入的信息就被分解得越彻底,分解的子特征间相关性低,子特征内部相关性高(很好理解,毕竟是子特征,相当于是cluster),把相关性强的聚集在一起会更容易收敛。原则1和原则2组合在一起理解:特征越多收敛速度越快,但是无法弥补pooling造成的特征损失(units减少),Pooling造成的表示瓶颈需要靠其它方法来解决(后面会提到)
  3. 空间聚合(我理解为表示的尺寸缩小,如feature maps经过卷积缩小尺寸)可以在较低的维度嵌入(即低维嵌入,指的是使用维度更低的表示替代目前的表示,但是重要的信息基本不会丢失)上完成,而不会在表示能力(representation power)上造成许多或任何损失。  比如,在执行更多展开的卷积(如3*3卷积)之前,我们可以在空间聚合之前降低输入表示的维度,而不用担心各种复杂的影响。如果降维的输出被用在空间聚合的上下文中,那么降维前后没有太大影响的原因可能是相连神经元之间的强相关导致丢失的信息非常少。鉴于空间聚合中的这些信号应该易于压缩,因此维度降低甚至会促使学习变得更快。对这段话我也不是太理解,参考网上的解释:可以压缩特征维度数,来减少计算量。Inception V1中提出的用1*1卷积先降维再作特征提取就是利用这点。不同维度的信息有相关性,降维可以理解成一种无损或低损的压缩,即使维度降低了,仍然可以利用相关性恢复出原有的信息
  4. 平衡网络的宽度(网络的宽度包括每一层的高度、宽度以及深度,即特征的H/W/C三个维度)和深度(指网络的层数)。通过平衡每个阶段的filters数量和网络的深度可以获得理想的网络性能。增加网络的宽度和深度可以有助于更高质量的网络,然而,如果二者同时增加,则网络可以在恒定计算量的情况下得到理想的提升。因此,计算开销(computation budget)应该以一种平衡的方式分配在网络的深度和宽度之间。网上的解释如下:整个网络结构的深度和宽度(特征(包括featrue maps等)的各个维度数)要做到平衡。只有并行地增加深度和特征的维度才能最大限度的提升网络性能


3. 优化思想(optimization ideas)

3. 1 分解Filters Size较大的卷积操作(Factorizing Convolutions with Large Filter Size)

      GoogLeNet中的降维可以被视作以一种计算高效的方式分解卷积的特例。我们都知道,在视觉网络(vision network)中,临近的activations(或units)的输出应该是高度相关的。所以,我们可知,降维之所以会在GoogLeNet中发挥较大作用,是由于在降维前后表示能力相似,即表示能力基本没减弱。

       既然如此,作者就思考还有没有其他分解卷积操作的方法。这自然是有的!如下:

3.1.1 将大卷积分解成更小的卷积(Factorization into smaller convolutions)

       作者提出任何大于3*3的卷积都可以分解为3*3的卷积序列。如下Fig.1,使用Mini-network替代5*5卷积

1543108196(1)

      可以发现,5*5或7*7的卷积在计算量上很大,换成3*3卷积序列后计算量成倍的减少,此外,换成3*3卷积后还增加了网络的层数,从而增强了网络的非线性表达能力。

      这样替换带来两个问题:一是,该替换是否会导致任何表达能力的丧失?二是,如果我们的主要目标是对计算的线性部分进行分解,那是不是建议在第一层保持线性激活?为此,作者进行了几个控制实验(Fig.2就是其中之一),并发现,在分解的过程中使用线性激活的效果总是次于使用修正线性单元(rectified linear units)。作者认为这是因为分解扩大了网络的变量空间,尤其当我们batch-normalize输出的激活值之后。


1543131538(1)


3.1.2 空间分解成不对称卷积(Spatial Factorization into Asymmetirc Convolutions)

      在将大卷积分解为3*3卷积序列后,还可以将卷积进一步分解为不对称的卷积,形如n*1,事实证明,这种分解比更小的分解(如2*2)效果更好。例如,将3*3卷积分解成两个2*2卷积只节省11%的计算量,而使用不对称分解可以达到33%(见Fig.3,使用3*1和1*3卷积相当于滑动一个两层网络,且二者的感受野相同,都在3*3范围内)。

1543110194(1)
      理论上,我们可以将任何一个n*n卷积替换成一个1*n卷积加一个n*1卷积,并且n越大,节省的计算量就越多(参见Fig.6

1543111221(1)

1543111956(1)

1543112039(1)

      在实践中,作者发现在early layers应用不对称分解效果不好,但是在中等大小的grid-size(grid即表示,如feature maps;在feature maps上,m的范围在12-20之间)上有非常好的效果。实验时,作者在17*17的网格上使用1*7和7*1卷积取得了非常好的效果


3.2 辅助分类器的作用(Utility of Auxiliary Classifiers)

      GoogLeNet中已经介绍了辅助分类器的概念,其主要作用是在非常深的网络中解决梯度消失问题。同时,Lee认为辅助分类器还能促进更稳定的学习和更好的收敛。

      可是,作者发现,辅助分类器在训练的早期并不会改善收敛速度:在网络取得较高精度之前,带辅助分类器与不带辅助分类器的网络的训练过程基本一致。训练快结束时,带辅助分支(auxiliary branches)的网络在精度上才开始稍微超过不带辅助分类器的网络。

      同时,作者还发现,将GoogLeNet中前面那个辅助分类器删除并不会对网络的质量产生影响。结合前一个发现,作者认为GoogLeNet中branches(辅助分类器)能演变低级特征的假设是不适当的。相反,作者认为辅助分类器起着正则化项的作用,因为作者在实践中发现,如果side branch(侧分支,如辅助分类器)经过了batch-normalized或者有dropout层的话,网络的主分类器(main classifier)的性能会有所提升。

1543132013(1)

1543132101(1)


3.3 有效的减小Grid Size(Efficient Grid Size Reduction)

      通常,卷积网络使用一些Pooling操作减小feature maps的网格尺寸(grid size of the feature maps),而且为了避免表示瓶颈,在应用最大池化或平均池化之前,需要扩展网络滤波器(filters)的激活维度(即增加filters的数量)。比如,我们想将一个通道数为k、尺寸为d*d的 grid 转换成通道数为2k、尺寸为d/2*d/2的 grid ,那么我们第一步需要步长为1、filters数量为2k的卷积,然后再进行池化。可见,这一过程中计算量主要落在卷积上,为1543130543(1)。而如果先Pooling再卷积的话那么计算量会减少1/4,变为1543130626(1)。但是,先池化后卷积会带来表示瓶颈,减弱网络的表示能力,如Fig.9所示。

1543133630(1)

     如上可知,采用传统的方法无法兼顾计算量和表示能力。在这里,作者提出了另一种变体,可以在降低计算量的同时避免表示瓶颈(参见Fig.10)。作者使用了两个并行的stride为2的模块(blocks):PC。P只有一层Pooling层,且PC的步长都是2,PC的输出会被拼接在一起,具体如Fig.10所示:

1543135062(1)


3.4 使用Label Smoothing来对网络输出进行正则化(Model Regularization via Label Smoothing)

       Softmax层的输出可以用下面的公式表示

1

      损失loss如下

1543147735(1)

      如果分类的标签是one-hot码表示的,那么从输出公式可以反推出训练过程中网络收敛时Softmax的正确分类的输入Zk (logit)是无穷大的(因为输出概率需要是1或接近1的数值),这是一种极其理想的情况。如果让所有的训练输入都产生这种极其理想的输出,就会造成overfitting。为了克服overfitting,作者将 q(k) 换成 q’(k) 来计算loss,如下:

1543148412(1)

      式中,1543148443(1)。可见,上式是原始真实分布 q(k|x) 和固定分布 u(k) 的加权和。可以视为按如下方式获得的标签k 的分布:首先,设真实标签 k=y;然后,以1543148726(1)的概率用从固定分布u(k) 中提取的样本替代k

作者提出使用标签的先验分布作为u(k)(训练集中标签的分布)。实验中,作者使用均匀分布u(k)=1/K,所以

1543149177(1)

     作者将这种对真实分布的改变称为 label-smoothing regularization 或 LSR。由上面的内容可知,LSR的作用是防止最大的 logit 变得比其它 logits 大很多。

     作者在ImageNet实验中,根据1000个classes将K取为1000,所以u(k)=1/1000。另外,1543148726(1)取为0.1。使用LSR后给网络带来的性能提升如Table 3所示:

1543149817(1)


4. Inception-v2

综合上述4种优化思想,就有了如下的Inception-v2网络,该网络的具体结构参见Table 1

1543150444(1)

      需要注意的是,作者将传统的7*7卷积分解成了3个3*3卷积;网络中Inception部分,作者使用了3个传统的 inception modules(如Fig.4所示,使用了3.3中描述的grid reduction技术)来处理尺寸为35*35、通道数为288的输入,然后输出17*17*768的 grid;接着是5个如Fig.5所示的分解的 inception modules,输出为8*8*1280的grid,并且使用的是Fig.10中描述的 grid reduction技术;在最粗糙的8*8级别,作者使用了2个Fig.6中展示的 inception modules,输出尺寸为8*8*2048。

      作者也注意到,只要网络的设计遵守了前面所述的4个原则,对于各种变化,网络的性能都会相对稳定。此外,虽然该网络的深度达到了42层,但计算量仅比GoogLeNet高约2.5倍,这仍比VGGNet高效得多。


5. 训练方法(Training Methodology)

不对这一部分进行介绍,详细内容见论文,但是记录一些在该部分出现的名词。

RMSProp:RMSProp是Geoff Hinton提出的一种自适应学习率方法,Adagrad会累加之前所有的梯度平方,而RMSProp仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题

1543192347(1)

gradient clipping 梯度裁剪


6. 更低分辨率输入上的性能(Performance on Lower Resolution Input)

      一般我们认为,感受野更大的模型在识别性能上会有显著提升。但是,区分这是增加第一层感受野的效果还是使用更大的模型容量和计算量的效果很重要。如果我们仅仅改变输入分辨率而不进一步调整模型,那么我们将会使用一个简单的模型解决困难得多的任务。为了做出准确的评估,模型需要分析模糊的提示,以便能够“幻化”细节。这样做计算量很大。因此问题依然存在:在计算量保持不变的情况下,更高的输入分辨率会有多少帮助。一种简单确保模型能不断改善的方法是,在更低的输入分辨率下,减少前两层的strides,或者移除网络中的第一层池化层。

   为此,作者进行了下面三个实验:

  • 299*299的感受野(即输入分辨率),步长为2,并且在第一层之后进行最大池化;
  • 151*151的感受野,步长为1,并且在第一层之后进行最大池化;
  • 79*79的感受野,步长为1,并且在第一层之后不进行池化

     上述三个实验几乎有相同的计算量。在每个实验中,网络都会被训练至收敛,精度会在ImageNet ILSVRC 2012的验证集上测量,结果如 Table 2 所示

1543195767(1)

      可见,虽然输入分辨率较低的网络需要更长的时间来训练,但它们的最终性能都与更高分辨率的网络相当接近。不过,如果简单地根据输入分辨率缩减网络尺寸,那网络的性能相比就会差很多(三个实验基本都没有缩减网络的尺寸,仅仅改变输入部分)。显然,缩减网络尺寸后进行的比较不公平,因为我们在用一个简单16倍的模型解决一个更复杂的任务

     综上,模型在使用更大的感受野后带来的性能提升主要来自于增大的模型容量和计算量。因此,在计算量保持基本不变的情况下,即网络的尺寸基本不变,我们可以适当地降低输入分辨率或者删去池化层(参照上述3个实验),这对网络的性能不会造成太大的影响。比如,在实践中,如果待检测图像的分辨率较低,那我们可以对R-CNN输入部分的结构进行适度修改后再使用,理论上性能并不会降低太多。


7. 实验结果和比较(Experimental Results and Comparisons)

      Table 3展示了作者提出的网络结构的识别性能,其中每个 Inception-v2 line(即表格中显示有Inception-v2的行)记录的是前一个网络加上下方的修改之后的实验结果,如Inception-v2 Label Smoothing就是Inception-v2 RMSProp加上Label Smoothing之后的网络。

      表中,Factorized 7 × 7包括将第一个7*7卷积层分解成3*3卷积层序列;BN-auxiliary指的是网络中辅助分类器的全连接网络也进行了batch-normalized,而不是仅有卷积层采用了该处理;作者将Table 3中最后一行的模型称为“Inception-v3”,并且在multi-crop和ensemble setting中对它进行评估。

下面的Table 4记录的是对多种模型进行single-model,multi-crop evaluation的结果

1543199307(1)

下面的Table 5记录的是对多种模型进行multi-model,multi-crop evaluation的结果

1543199454(1)

multi-crop evaluation:即对图像进行多样本的随机裁剪,然后通过网络预测每一个样本的结构,最终对所有结果平均。比如,只在图像中心裁剪;在图像四个角裁剪;在四个角以及中心裁剪;更一般的就
                                 是随机裁剪

multi-model evaluation:使用训练出的多个不同模型同时进行评估,然后使用投票或者平均等方法确定最终的评估结果


8. 结论(Conclusions)

   略,详细内容参考论文



参考文章:

  • 优化方法总结:SGD,Momentum,AdaGrad,RMSProp,Adam
  • TensorFlow教程——梯度爆炸与梯度裁剪
  • 在VGG网络中dense evaluation 与multi-crop evaluation两种预测方法的区别以及效果
  • Inception-V3论文翻译——中英文对照
  • Inception-v2/v3结构解析


  • GoogLeNet
  • Deep Learning-TensorFlow (13) CNN卷积神经网络_ GoogLeNet 之 Inception(V1-V4)
  • 从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2,ShuffleNetV2

推荐阅读
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • keras归一化激活函数dropout
    激活函数:1.softmax函数在多分类中常用的激活函数,是基于逻辑回归的,常用在输出一层,将输出压缩在0~1之间,且保证所有元素和为1,表示输入值属于每个输出值的概率大小2、Si ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 先记住几个专用名词,如下:Workspace:工作区IndexStage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库#在当前目录新建一个G ... [详细]
  • Git GitHub多人协作
    在学校做一个小项目需要多人协作,就用到了gitHub,百度了一下多数写得乱七八糟或者支离破碎,于是总结了一下自己的步骤如下,第一次使用GitHUb,哪里不对望大神指出一.前期准备: ... [详细]
author-avatar
醒不睡睡不醒_269
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有