经典卷积神经网络-GooogLeNet学习记录

Going Deeper with Convolutions

GoogLeNet是2014年的ILSVRC的冠军模型,GoogLeNet做了更大胆的网络上的尝试,而不是像vGG继承了LeNet以及AlexNet的一切框架。相比较2年前获胜的Krizhevsky的架构,作者的ILSVRC 2014 GoogLeNet提交方案实际上使用了1/12的参数,但显著地取得了更加高的精确度。

VGG使用块代替层的思想,这使得VGG在迁移性方面表现非常好,也因此得到了广泛的应用。而GoogLeNet也使用了基础块的思想,引入了Inception块

网络层数逐渐变多,模型变的越来越深,这是因为提升模型效果最为直接有效的方法就是增加网络深度和宽度,但是,随着网络层数的加深、加宽,它也会带来很多负面影响, 参数数量增加、梯度消失和梯度爆炸,计算复杂度增加;

VGG是在LeNet、AlexNet的基础上引入了基础块的思想,但是在网络架构、输出等放并没有进行太多的改变,在输出层方面同样是采用连续三个全连接层,全连接层的输入是前面卷积层的输出经过reshape得到。虽然GoogLeNet是向LeNet致敬(L大写),但是在GoogLeNet的身上却很难看到LeNet和AlexNet的影子,它的输出更是采用NiN的思想(Network in Network),它把全连接层编程了1*1的卷积层

VGG在克服网络加深带来的问题方面采用的是引入基础块的思想,但是整体上还是偏向于"更深",而GoogLeNet更加偏重于"更宽",它引入了并行网络结构的思想,每一层有4个不同的线路对输入进行处理,然后再块的输出部分在沿着通道维数进行连接。GoogLeNet通过对模型的大幅度改进,使得它在参数数量、计算资源方面要明显优于VGG,但是GoogLeNet的模型复杂度相对于VGG也要高一些,因此,在迁移性方面VGG要优于GoogLeNet。

1.论文解读 

Abstract

a carefully crafted design that allows for increasing the depth and width of the network while keeping the computational budget constant(一个周密而精心的设计,其考虑了在保持计算预算恒定的同时增加网络的深度和宽度),GoogleNet论文指出获得高质量模型最保险的做法就是增加模型的深度,或者是它的宽度,但是一般情况下,更深和更宽的网络会出现以下问题: 参数太多,容易过拟合,如果训练数据有限,则这一问题更加突出; 网络越大计算复杂度越大,难以应用; 网络越深,容易出现梯度消失。

GoogleNet为了保持神经网络结构的稀疏性,又能充分利用密集矩阵的高计算性能,提出了名为Inception的模块化结构来实现 将全连接层甚至一般的卷积都转化为稀疏连接的目的。Inception架构的决策是基于海扁原则以及多尺度处理的直觉 ,该结构的主要特点是:the improved utilization of the computing resources inside the network(提高了网络内部的计算资源的利用率)。

在过去的三年,主要由于深度学习更加具体的卷积网络的进步,图像识别和目标检测的质量已经取得了巨大的进步。图片识别和目标检测的大部分进步不仅仅是性能更好的硬件、更大的数据集和更大的网络模型的结果,更主要的是新观点、算法以及提高的网络架构的结果。相比较2年前获胜的Krizhevsky的架构,我们的ILSVRC 2014 GoogLeNet提交方案实际上使用了1/12的参数,但显著地取得了更加高的精确度。在目标检测方面取得的最大的成就并不是来源于单个深度网络或更大模型的使用,而是来自于深度网络架构和经典的计算机视觉的协同合作。

Related Work 

卷积神经网络(CNN)已经具有了一个典型的标准结构stacked convolutional layers (optionally followed by contrast normalization and max-pooling) are followed by one or more fully-connected layers堆叠的卷积网络层——其后可选择性的接对比标准和最大池化层——后面接一个或多个全连接层)。但对于更大的像Imagenet这样的数据集,最近的趋势是:增加网络层的数量及网络层的大小,与此同时使用dropout(一般用于fully-connected layers)去解决过拟合的问题。 

max-pooling layers result in loss of accurate spatial information (最大池化层会导致精确的空间信息的损失),Inception模型中所有的过滤器都是需要学习的。此外,Inception层是重复多次的,从而产生了一个22层深的GoogLeNet模型。

NIN是由lin等人提出的方法,目的是去增强神经网络的表现力。当应用于卷积层时,模型可视为:在追加的1*1卷积层后面典型的接修正的线性激活函数(ReLU)。这种组合方式使得Network-in-Network可以很容易的加入到当前CNN的管道中。我们在我们的架构中使用了大量的这种方法。

在我们的架构中,1*1的卷积具有两重的目的:

dimension reduction modules to remove computational bottlenecks(去除计算资源瓶颈的维度减少模块)--降维

可以减少参数(1*1的滤波器组相对于其他的滤波器组参数几何倍数减少;此外,如果参数越多,网络越复杂,越容易产生过拟合)。

Motivation and High Level Considerations

提高深度神经网络性能最简单明了的方法是:增加其大小。包括增加网络的深度与宽度。

两个问题:

Bigger size typically means a larger number of parameters ,which makes the enlarged network more prone to overfitting, especially if the number of labeled examples in the training set is limited(网络变大意味着参数的变多,这使得扩大的网络更易于过拟合,尤其是如果在训练集中具有标签的样本是有限的);

均匀增大网络的大小的另一个缺点是:对计算资源的需求急剧增大。

解决:

moving from fully connected to sparsely connected architectures, even inside the convolutions(从全连接转为稀疏连接的结构,即使在卷积层内部:如一个5*5的卷积可以用两层3*3的卷积代替;相较于5*5的卷积连接,3*3的卷积连接是稀疏的

结果:

作者主要的结果宣称:if the probability distribution of the data-set is representable by a large, very sparse deep neural network, then the optimal network topology can be constructed layer by layer by analyzing the correlation statistics of the activations of the last layer and clustering neurons with highly correlated outputs(如果数据集的概率分布是用一个大的且非常稀疏的深度神经网络表现出来的话,那么最优的网络拓扑可以被一层一层的进行构建:分析上一层激活值的相关联统计数据并对这些具有高度关联性的输出值的神经元进行聚类)。在缺点方面,当在非均匀的稀疏数据结构上进行数字计算时,现如今的计算基础设施是非常无效率的。结构的均匀性、大量的卷积核以及更大的批处理大小考虑了利用有效的稠密计算。

想法:

关于稀疏矩阵运算的大量文献表明:clustering sparse matrices into relatively dense submatrices tends to give state of the art practical performance for sparse matrix multiplication(把稀疏的矩阵聚集为相对稠密的子矩阵倾向于达到关于稀疏矩阵乘法运算的最高的实际性能水准)。这种想法——在不久的将来,相似的方法将应用于非线性的深度学习架构的自动构造——并不是遥不可及的。

2.Inception网络结构详解

Inception Module基本组成结构有四个成分。1*1卷积,3*3卷积,5*5卷积,3*3最大池化。信息分布比较全局性的图像采用大卷积核,信息分布比较局部性的图像采用小卷积核。最后对四个成分运算结果进行通道上组合(使用不同的stride与padding实现高宽尺寸不变),这就是Inception Module的核心思想:利用不同大小的卷积核实现不同尺度的感知,最后进行融合,可以得到图像更好的表征。使用了多尺度卷积后,网络更宽了,同时也提高了对于不同尺度的适应程度。

5661eae3c403003bf10713f4fad130c2.png

假设在上图中Naive Inception单元的前一层输入数据尺寸为32×32×256,该特征图先被复制成4份并分别被传至接下来的4个部分。我们假设这4个部分对应的滑动窗口的步长均为1,其中,1×1卷积层的Padding为0,size=1×1×256,卷积核个数=128(卷积核个数=输出的维度);3×3卷积层的Padding为1,size=3×3×256,卷积核个数=192;5×5卷积层的Padding为2,卷积核size=5×5×256,卷积核个数96;3×3最大池化层的 Padding为1,size=3×3×256(池化不改变通道数)。之后通过计算,分别得到这4部分输出的特征图为32×32×128、32×32×192、32×32×96 和 32×32×256,最后在合并层进行合并,得到32×32×672的特征图,最后这个Naive Inception单元输出的特征图维度是32×32×672,总的参数量就是1*1*256*128+3*3*256*192+5*5*256*96+0=1089536。

存在的问题:

所有卷积层直接和前一层输入的数据对接,所以卷积层中的计算量会很大;

总的输出的特征图的深度增加(比原来多),增加了该单元之后的网络结构的计算量。

解决:希望通过减少参数量来减少计算量,作者受到了模型 “Network in Network”的启发,开发出了在GoogleNet模型中使用的Inception单元(Inception V1),这种方法可以看做是一个额外的1*1卷积层再加上一个ReLU层。使用1x1 卷积核主要目的是进行压缩降维,减少参数量,从而让网络更深、更宽,更好的提取特征。

f03ed49552da3de86cb1757604b98af1.png

假设新增加的 1×1 的卷积的输出深度为64,步长为1,Padding为0,其他卷积和池化的输出深度、步长都和之前在Naive Inception单元中定义的一样(即上面例子中定义的一样),前一层输入的数据仍然使用同之前一样的维度为32×32×256的特征图,通过计算,分别得到这 4 部分输出的特征图维度为32×32×128、32×32×192、32×32×96 和32×32×64,将其合并后得到维度为32×32×480的特征图,最后Inception单元输出的特征图维度是32×32×480。新增加的3个 1×1 的卷积参数量是3*1*1*256*64=49152,原来的卷积核参数量1*1*256*128+3*3*64*192+5*5*64*96+0=296960,总的参数量就是49152+296960=346112。

在输出的结果中,32×32×128、32×32×192、32×32×96 和之前的Naive Inception 单元是一样的,但其实这三部分因为1×1卷积层的加入,总的卷积参数数量已经大大低于之前的Naive Inception单元,而且因为在最大池化层之前也加入了1×1的卷积层,所以最终输出的特征图的深度也降低了,这样也降低了该单元之后的网络结构的计算量。

3.GoogLeNet模型介绍

在这里插入图片描述

 

对上图做以下说明:
1 . 显然GoogLeNet采用了模块化的结构,方便增添和修改:AlexNet采用5个卷积层 ;VGG把5个卷积层替换成5个卷积块 ;GoogLeNet采用5个不同的模块组成主体卷积部分;

2 . 网络最后采用了average pooling来代替全连接层,想法来自NIN,事实证明精度提高;实际在最后还是加了一个全连接层,主要是为了方便以后大家finetune;

3 . 虽然移除了全连接,但是网络中依然使用了Dropout ;

4 . 为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。文章中说这两个辅助的分类器的loss应该加一个衰减系数,但看caffe中的model也没有加任何衰减。此外,实际测试的时候,这两个额外的softmax会被去掉;

5. LRN层作者说作用不明显,可以去掉。

GoogLeNet的网络结构:

24d7db928344a2e4d8b262e9e374243d.png

上图中 “#3×3reduce” 和 “#5×5reduce” 表示在3×3和5×5卷积之前,使用的降维层中的1×1滤波器的数量。pool proj代表max-pooling后的投影数量(即先max-pooling,再1*1卷积降维),所有的reductions(降维)和projections(投影)也都使用激活函数ReLU。

结构解读 :

模块1

第一个模块采用的是一个单纯的卷积层紧跟一个最大池化层。

卷积层:卷积核大小7*7,步长为2,输出通道数64

池化层:窗口大小3*3,步长为2,输出通道数64

模块2

第二个模块采用2个卷积层,后面跟一个最大池化层。

卷积层:卷积核大小3*3,步长为1,输出通道数192

池化层:窗口大小3*3,步长为2,输出通道数192

模块3

第三个模块采用的是2个串联的Inception块,后面跟一个最大池化层。

第一个Inception的4条线路输出的通道数分别是641283232,输出的总通道数是4条线路的加和,为256

第二个Inception的4条线路输出的通道数分别是1281929664,输出的总通道数为480

池化层:窗口大小3*3,步长为2,输出通道数480

模块4

第4个模块采用的是5个串联的Inception块,后面跟一个最大池化层。

第一个Inception的4条线路输出的通道数分别是1922084864,输出的总通道数为512

第二个Inception的4条线路输出的通道数分别是1602246464,输出的总通道数为512

第三个Inception的4条线路输出的通道数分别是1282566464,输出的总通道数为512

第四个Inception的4条线路输出的通道数分别是1122886464,输出的总通道数为528

第五个Inception的4条线路输出的通道数分别是256320128128,输出的总通道数为832

池化层:窗口大小3*3,步长为2,输出通道数832

模块5

第五个模块采用的是2个串联的Inception块

第一个Inception的4条线路输出的通道数分别是256320128128,输出的总通道数为832

第二个Inception的4条线路输出的通道数分别是384384128128,输出的总通道数为1024

输出层

前面已经多次提到,在输出层GoogLeNet与AlexNet、VGG采用3个连续的全连接层不同,GoogLeNet采用的是全局平均池化层,得到的是高和宽均为1的卷积层,然后添加丢弃概率为40%的Dropout,输出层激活函数采用的是softmax

激活函数

GoogLeNet每层使用的激活函数为ReLU激活函数。

4. 特点解读

  1. 辅助分类器:GoogleNet用到了两个辅助分类器。为了利用中间层抽象的特征,在某些中间层中添加含有多层的分类器,因为除了最后一层的输出结果,中间节点的分类效果也可能是很好的,GoogleNet将中间的某一层作为输出,并以一个较小的权重加入到最终分类结果中。其实就是一种变相的模型融合,同时给网络增加了反向传播的梯度信号,也起到了一定的正则化的作用,帮助模型训练。
  2. 并联结构的使用,Inception模型的变式与发展之后打算再写一篇来记录。 

5.参考文献

GoogLeNet系列解读

什么是GoogleNet?什么是Inception?GoogleNet结构详解(2014年)

深入解读GoogLeNet网络结构(附代码实现)
 

Going Deeper with Convolutions

仅作为学习记录,侵删!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胖虎记录学习

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

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

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

打赏作者

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

抵扣说明:

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

余额充值