随着深度学习的普及开来,设计一个网络结构变得愈来愈“简单”,若是一个新的网络只是简单的卷积、池化、全链接,改改其中的参数,那就大错特错了。因此网络在应用中,每每要面临的问题是:如何设计一个好的网络结构。html
目前常见的网络结构:AlexNet、ZF、GoogLeNet、VGG、ResNet等等均可谓曾一战成名,它们都具备自身的特性,它们都提出了创新点。设计一个优秀网络的第一步是学习这些优秀的网络。git
是由Yann LeCun完成的具备开拓性的卷积神经网络,是大量网络结构的起点。网络给出了卷积网络的基本特性:github
1.局部感知。人对外界的认知是从局部到全局的,相邻局部的像素联系较为紧密。每一个神经元不必对全局图像进行感知,只须要对局部进行感知,而后更高层将局部的信息综合起来获得全局的信息。网络
2.多层卷积。层数越高,学到的特征越全局化。架构
3.参数共享。每一个卷积都是一种提取特征的方式,大大下降了参数的数目。ide
4.多卷积核。提取多类特征,更为丰富。函数
5.池化。下降向量维度,并避免过拟合。性能
特性1天然引出了特性2,特性3天然引出了特性4。学习
网络用于mnist手写体识别任务,网络结构用 http://ethereon.github.io/netscope/#editor 查看,常见网络:http://ethereon.github.io/netscope/quickstart.html 。down优化
2012年,深度学习崛起的元年,Alex Krizhevsky 发表了Alexet,它是比LeNet更深更宽的版本,并以显著优点赢得了ImageNet竞赛。贡献有:
1.使用RELU做为激活单元。
2.使用Dropout选择性忽略单个神经元,避免过拟合。
3.选择最大池化,避免平均池化的平均化效果。
AlexNet是目前应用极为普遍的网络,结构讲解见:http://blog.csdn.net/sunbaigui/article/details/39938097。 down
网络总体上给咱们带来了三个结构模块:
一、单层卷积的结构:conv-relu-LRN-pool。前面的卷积步长大,快速下降featureMap的大小(较少后面的计算量),后面深层卷积保持featureMap大小不变。LRN的功能放在今天来看是无关痛痒的,并非很强。
二、多层卷积的结构,网络更深,特征更抽象。
三、全链接的结构,drop避免过拟合。
AlexNet网络的变体,网络结构的变更主要是调整了pool和norm的位置。 down
由 Matthew D Zeiler和Rob Fergus于2013年在“Visualizing and Understanding Convolutional Networks”论文中提出,属于AlexNet网络的变体。论文具备重要意义,阐述了卷积网络为何有效,ZF网络是他们顺带提出来的。ZF在faster rcnn等应用中作为特征提取模块被普遍应用,通常来说比AlexNet略优。
主要的改动是:减小第一层卷积的size和stride(11->七、4->2),提取更多的底层特征,增长第二层卷积的步长stride(1->2)。从而取获得了和AlexNei基本相同的感知野,featureMap的大小相同,后面的卷积计算量也保持不变。
VGG-16又称为OxfordNet,是由牛津视觉几何组(Visual Geometry Group)开发的卷积神经网络结构。该网络赢得了ILSVR(ImageNet)2014的冠军。时至今日,VGG仍然被认为是一个杰出的视觉模型——尽管它的性能实际上已经被后来的Inception和ResNet超过了。
网络结构:http://ethereon.github.io/netscope/#/preset/vgg-16
咱们就看D(VGG16)和E(VGG19)好了。由于前面的网络效果没有D和E的效果好,并且比起D和E来说不够简洁。
VGG是把网络分为5组(模仿AlexNet的五层),然而它使用了3*3的过滤器,并把它们组合起来做为一个卷积序列进行处理。特征:
1.网络更深DCNN,channel数目更大。
2.采用多个3*3的卷积,模仿出更大的感觉野的效果。这些思想也被用在了后续的网络架构中,如 Inception 与 ResNet。
NIN中的MLPconv是对conv+relu的改进,conv+relu构建的是一个广义线性模型。举例子解释:假设如今有一个3x3的输入,用一个9维的向量x表明,卷积核大小也是3x3,也9维的向量w表明。
1.对于常规卷积层,直接x和w求卷积,而后relu一下就行了。
2.maxout,有k个的3x3的w(这里的k是自由设定的),分别卷积获得k个1x1的输出,而后对这k个输入求最大值
3.NIN,有k个3x3的w(这里的k也是自由设定的),分别卷积获得k个1x1的输出,而后对它们都进行relu,而后再次对它们进行卷积,结果再relu。(这个过程,等效于一个1*1的卷积网络)
maxout想代表它可以拟合任何凸函数,也就可以拟合任何的激活函数;NIN想代表它不只可以拟合任何凸函数,并且可以拟合任何函数。
使用多层感知机这种微网络结构后,能够抽象出更好的局部特征,增长局部模型的表达能力。基于MLPconv,在最后类别输出时能够不采用全链接操做,而是将特征图和类别之间创建一致性,采用全局平均池化的方法,每一个特征图的平均值即为每一个类别的置信度。
例如:一共有100类,那么在最后一层的输出feature map则为100,计算这100张feature map的平均值,做为这100类的置信度。
NIN的优势:
1.更好的局部抽象能力,这是MLPconv带来的。
2.全局平均池化,不须要全链接的参数优化,避免过拟合。
3.参数更少,模型更小。
网络结构见:http://ethereon.github.io/netscope/#/preset/nin
Christian Szegedy开始追求减小深度神经网络的计算开销,并于2014年设计出 GoogLeNet——第一个 Inception 架构。
“Going Deeper with Convolutions”中google提出了Inception模块:
受NIN的启发,Inception的思路是减小每一层的特征过滤器的数目,从而减小运算量。用 1*1的卷积块在昂贵的并行模块以前减小特征的数量,比 AlexNet 与 VGG 的分类器的运算数量少得多。这种作法通常称为瓶颈层(Bottleneck)。
并且,尽管咱们作了更好的运算,咱们在此层也没有损失其通用性(generality)。事实证实瓶颈层在 ImageNet 这样的数据集上已经表现出了顶尖水平,并且它也被用于接下来介绍的 ResNet 这样的架构中。
它之因此成功是由于输入特征是相关联的,所以可经过将它们与 1×1 卷积适当结合来减小冗余。而后,在小数量的特征进行卷积以后,它们能在下一层被再次扩展成有意义的结合。down
Christian 和他的团队都是很是高产的研究人员。2015 年 2 月,Batch-normalized Inception 被引入做为 Inception V2(论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift)。Batch-normalization 在一层的输出上计算全部特征映射的均值和标准差,而且使用这些值规范化它们的响应。所以使得全部神经图(neural maps)在一样范围有响应,并且是零均值,这有助于训练,还能重点关注如何最好的结合这些特征。
2015 年 12 月,该团队发布 Inception 模块和相似架构的一个新版本V3(论文:Rethinking the Inception Architecture for Computer Vision)。该论文更好地解释了原始的 GoogLeNet 架构,在设计选择上给出了更多的细节。
1.经过谨慎建筑网络,平衡深度与宽度,从而最大化进入网络的信息流。
2.当深度增长时,网络层的深度或者特征的数量也系统性的增长。使用每一层深度增长在下一层以前增长特征的结合。
3.只使用 3×3 的卷积,可能的状况下给定的 5×5 和 7×7 过滤器能分红多个 3×3。新的Inception结构为:
也能够经过将卷积平整进更多复杂的模块中而分拆过滤器:将3*3拆分为3*1和1*3的两个过滤器。在进行 inception 计算的同时,Inception 模块也能经过提供池化下降数据的大小。
2015 年 12 月又出现了新的变革,这和 Inception V3 出现的时间同样。ResNet 有着简单的思路:供给两个连续卷积层的输出,并分流(bypassing)输入进入下一层(论文:Deep Residual Learning for Image Recognition),在imagenet2015夺得冠军。
计算机视觉领域,特征随着网络加深而越发抽象,并且深层网络也会带来梯度弥散/爆炸等问题。并且在实践中,深层网络(很深)的性能会劣于浅层网络,这反映了一个事实:非线性网络没法逼近恒等映射网络(y=x)。因此咱们转而去学习恒等映射的扰动。
ResNet要学习的即是残差函数:,残差块的结构是:
这是第一次网络层数超过一百,甚至还能训练出 1000 层的网络。实际中,考虑计算的成本,对残差块作了计算优化,即将两个3x3的卷积层替换为1x1 + 3x3 + 1x1。
经过首先是由带有更小输出(一般是输入的 1/4)的 1×1 卷积较少特征的数量,而后使用一个 3×3 的层,再使用 1×1 的层处理更大量的特征。相似于 Inception 模块,这样作能保证计算量低,同时提供丰富的特征结合。
Inception V4 也结合了 Inception 模块和 ResNet 模块:
满满的启发式应用,很难给出良好的解释,考虑到网络的间接性,ResNet就很不错了。