先附上著名的网络结构GoogLeNet及其延伸版本,以便自己日后的学习。
在学习了Andrew Ng 的deeplearning.ai中的CNN课程时,顺着Ng的思路去了解了GoogLeNet这篇经典论文。GoogleNet提出了一个全新的深度CNN架构——Inception,无全连接层,可以节省运算的同时,减少了很多参数,参数数量是AlexNet的1/12,数量只有5 million,而且在ImageNet竞赛中取得了很好的成绩。 文章在引文中提到了提高深度神经网络性能最直接的方式,那就是增加网络的规模:深度和宽度。但是这样做的话肯定存在很多问题,问题是什么呢? 问题一:网络规模更大通常意味着需要更多的参数,这会使增大的网络更容易过拟合,尤其是在训练集的标注样本有限的情况下。 问题二:使用计算资源的显著增加。 紧接着,文章就这两个问题开展一系列的引用与讨论,提出论文的追求,那就是设计一个好的网络拓扑,最后引出了Inception架构,并且将Inception架构的设计初衷与思想诠释的比较到位。首先,肯定卷积神经网络的重要性,以及池化对于卷积效果的重要性,所以Inception架构的基础是CNN卷积操作。而就减小网络规模这一点来说,新的模型需要考虑一个新的网络架构,从如何近似卷积视觉网络的最优稀疏结构出发,进行探索与讨论。
我们来具体看Inception的架构(图1)。在这篇文章的Inception版本1中,创新点在于一层网络中存在多个不同尺度的卷积核,摒弃了AlexNet、VGG等传统著名网络的“一条线”架构。升级版的Inception,也就是这篇文章提到的Inception架构中,加入多个1×1的“瓶颈”层,来保留空间维度, 降低深度,在池化之后采用1×1卷积核来减少池化后的深度,从而主要达到减小规模的目的。 我简单的进行了两个版本Inception的操作数运算,步骤如下:
如果采用(a)的架构,假设在这一个Inception架构中,上一层输入的尺寸大小是28×28×256,采用1×1,3×3,5×5三种不同尺度的卷积核和3×3的max池化来进行该层的计算输出,那么在该层中卷积操作的ops次数计算如下:
[1×1 conv,128] 28×28×128×1×1×256
[3×3 conv,192] 28×28×192×3×3×256
[5×5 conv,192] 28×28×96×5×5×256
Total:854M ops。对于[1×1 conv,128],28×28×128×1×1×256的计算是怎么来的呢?首先对于输入尺寸为28×28×256的矩阵来说,1×1卷积核实际大小是:1×1×256,每进行一次卷积,就进行了1×1×256次运算,那么一个卷积核需要进行28×28次卷积,而一共有128个不同的1×1卷积核,所以总的运算次数为28×28×1×1×256×128。
如果采用(b)的架构,同样假设在这一个Inception架构中,上一层输入的尺寸大小是28×28×256,采用1×1,3×3,5×5三种不同尺度的卷积核和3×3的max池化来进行该层的计算输出,但是在进行以上卷积之前,在3×3和5×5卷积操作的前一步,加入1×1的“瓶颈”层,来保留空间维度, 降低深度;在池化之后采用1×1卷积核来减少池化后的深度。那么在该层中卷积操作的ops次数计算如下:
[1×1 conv,64] 28×28×64×1×1×256
[3×3 conv,64] 28×28×64×1×1×256
[5×5 conv,128] 28×28×128×1×1×256
[1×1 conv,192] 28×28×192×3×3×64
[3×3 conv,96] 28×28×96×5×5×64
[5×5 conv,64] 28×28×64×1×1×256
Total:358M ops。可以看到,虽然网络的复杂程度加大了,但是总的运算次数减小到之前的1/3。 Inception网络是一个由上述类型的模块互相堆叠组成的网络,从而形成了GoogLeNet。GoogLeNet是一个具有22层网络的深度学习架构,当然这22层指的是拥有权重的层,如图所示GoogLeNet的整体架构。
在中间层采用辅助分类器(Auxiliary Classification),增加了两个Loss来保证梯度回传消失的情况,这种设计结构用来减少梯度消失,ResNet是减少梯度爆炸。从中我们可以学习到一个点在于:梯度消失解决办法可以是在中间增加额外信号。
GoogLeNet的创新点都是围绕减少深度和提高性能来设计的。
Inception中为什么要加入池化呢?是因为池化操作对于目前卷积网络的成功至关重要,因此建议在每个Inception中添加一个并行池化,采用步长为2的最大池化层将网络分辨率减半,应该也应该具有额外的效果。 论文中提到“Inception结构中所有的滤波器是学习到的”,怎么理解?其实,Inception的作用是代替人工来确定卷积层中过滤器的类型,或者确定是否需要创建卷积层或池化层。Inception网络不需要人为决定使用哪个fliter,或者是否需要池化,而是由网络自行确定(学习)这些参数,自行学习是否使用这些fliter或者池化,也就是说这些都是Hypeparameter。 论文中提到了这样一句话:max-pooling layers result in loss of accurate spatial information,作者也意识到了最大池化会导致某些精确的空间信息丢失,但是他在这里仅仅提到了,没有去深入思考,这让我联想到了最近的一个新模型,CapsNet,神经网络提出者Hinton的新论文。其中的思想也很新颖,而且我对CapsNet能否与迁移学习相联系有着比较大的兴趣,正在尝试着跟从实验室学长去研究。
Google公司具有很多计算力超强的集群,可以反复验证各种架构设计的优越性,所以GoogleNet整体架构的最终版,也就是论文中所呈现的,应该是一个非常好、很具有影响力的深层网络架构。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170446.html原文链接:https://javaforall.cn