精华内容
下载资源
问答
  • 卷积神经网络发展历程

    千次阅读 2020-06-10 10:56:59
    随着ReLU和dropout的提出,以及GPU和大数据带来的历史机遇,CNN在2012年迎来了历史突破–AlexNet,从此CNN呈现爆炸式发展。 从此,Deep Learning一发不可收拾,ILSVRC每年都不断被Deep Learning刷榜,如图所示,随着...

    经典的LeNet诞生于1998年。然而之后CNN的锋芒开始被SVM等手工设计的特征盖过。随着ReLU和dropout的提出,以及GPU和大数据带来的历史机遇,CNN在2012年迎来了历史突破–AlexNet,从此CNN呈现爆炸式发展。
    从此,Deep Learning一发不可收拾,ILSVRC每年都不断被Deep Learning刷榜,如图所示,随着模型变得越来越深,Top-5的错误率也越来越低,目前降到了2.25%附近(2017,SENet),而在同样的ImageNet数据集合上,人眼的辨识错误率大概在5.1%,也就是目前的Deep Learning模型的识别能力已经超过了人眼。而下图中的这些模型,也是Deep Learning视觉发展的里程碑式代表。

    在这里插入图片描述

    CNN主要的经典结构包括:LeNet、AlexNet、ZFNet、VGG、NIN、GoogleNet、ResNet、SENet等,最古老的CNN模型。1985年,Rumelhart和Hinton等人提出了反向传播(Back Propagation,BP)算法(也有说1986年的,指的是他们另一篇paper:Learning representations by back-propagating errors),使得神经网络的训练变得简单可行,目前还是比Cortes和Vapnic的Support-Vector Networks稍落后一点,不过以Deep Learning最近的发展劲头来看,超越指日可待。

    1、LeNet5
    LeNet是卷积神经网络的祖师爷LeCun在1998年提出,用于解决手写数字识别的视觉任务。自那时起,CNN的最基本的架构就定下来了:卷积层、池化层、全连接层。如今各大深度学习框架中所使用的LeNet都是简化改进过的LeNet-5(-5表示具有5个层),和原始的LeNet有些许不同,比如把激活函数改为了现在很常用的ReLu。
    1998年的LeNet5[4]标注着CNN的真正面世,但是这个模型在后来的一段时间并未能火起来,主要原因是费机器(计算跟不上),而且其他的算法(SVM)也能达到类似的效果甚至超过。但是LeNet最大的贡献是:定义了CNN的基本结构,是CNN的鼻祖。
    1)LeNet的结构:
    LeNet5包含Input、卷积层1、池化层1、卷积层2、池化层2、全连接层、输出层。
    2)LeNet的特点
    LeNet5当时的特性有如下几点:
    每个卷积层包含三个部分:卷积、池化和非线性激活函数使用卷积提取空间特征(起初被称为感受野,未提“卷积”二字)降采样(Subsample)的平均池化层(Average Pooling)双曲正切(Tanh)的激活函数MLP作为最后的分类器层与层之间的稀疏连接减少计算复杂性。
    3)LeNet的突出贡献
    LeNet定义了CNN的基本结构,是CNN的鼻祖。

    2.AlexNet
    AlexNet在2012年ImageNet竞赛中以超过第二名10.9个百分点的绝对优势一举夺冠,从此深度学习和卷积神经网络名声鹊起,深度学习的研究如雨后春笋般出现,AlexNet的出现可谓是卷积神经网络的王者归来。

    1).AlexNet的结构
    alexNet为8层深度网络,其中5层卷积层和3层全连接层,不计LRN层和池化层。如下图所示:
    在这里插入图片描述
    2).AlexNet的特点
    (1)ReLU作为激活函数。
    ReLU为非饱和函数,论文中验证其效果在较深的网络超过了SIgmoid,成功解决了SIgmoid在网络较深时的梯度弥散问题。
    (2)Dropout避免模型过拟合
    类似于浅层学习算法的中集成算法,该方法通过让全连接层的神经元(该模型在前两个全连接层引入Dropout)以一定的概率失去活性(比如0.5)失活的神经元不再参与前向和反向传播,相当于约有一半的神经元不再起作用。在测试的时候,让所有神经元的输出乘0.5。Dropout的引用,有效缓解了模型的过拟合。
    (3)重叠的最大池化
    之前的CNN中普遍使用平均池化,而Alexnet全部使用最大池化,避免平均池化的模糊化效果。并且,池化的步长小于核尺寸,这样使得池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
    (4)提出LRN层
    提出LRN(局部响应归一化)层,对局部神经元的活动创建竞争机制,使得响应较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
    (5)GPU加速
    (6)数据增强
    随机从256256的原始图像中截取224224大小的区域(以及水平翻转的镜像),相当于增强了(256-224)*(256-224)*2=2048倍的数据量。使用了数据增强后,减轻过拟合,提升泛化能力。避免因为原始数据量的大小使得参数众多的CNN陷入过拟合中。
    AlexNet的贡献
    AlexNet的贡献也就是AlexNet的新特点:
    (1)Relu做激活函数,代替Sigmoid来加快SGD的收敛速度
    (2)dropout避免过拟合
    (3)重叠最大池化 overlapping Max Pooling
    (4)LRN(局部响应归一化),利用临近的数据做归一化,加速训练。
    (5)GPU加速
    (6)数据增强,增加模型泛化能力

    3.ZF-Net
    ZFNet是2013ImageNet分类任务的冠军,其网络结构没什么改进,只是调了调参,性能较Alex提升了不少。ZF-Net只是将AlexNet第一层卷积核由11变成7,步长由4变为2,第3,4,5卷积层转变为384,384,256。这一年的ImageNet还是比较平静的一届,其冠军ZF-Net的名堂也没其他届的经典网络架构响亮。

    4.VGG-Nets
    VGG-Nets是由牛津大学VGG(Visual Geometry Group)提出,是2014年ImageNet竞赛定位任务的第一名和分类任务的第二名的中的基础网络。VGG可以看成是加深版本的AlexNet. 都是conv layer + FC layer,在当时看来这是一个非常深的网络了,因为层数高达十多层,我们从其论文名字就知道了(《Very Deep Convolutional Networks for Large-Scale Visual Recognition》),当然以现在的目光看来VGG真的称不上是一个very deep的网络。VGGNet探索了CNN的深度及其性能之间的关系,通过反复堆叠33的小型卷积核和22的最大池化层,VGGNet成功的构筑了16-19层深的CNN。

    5.GoogleNet
    Googe Inception Net首次出现在ILSVRC2014的比赛中(和VGGNet同年),以较大的优势获得冠军。那一届的GoogleNet通常被称为Inception V1,Inception V1的特点是控制了计算量的参数量的同时,获得了非常好的性能-top5错误率6.67%, 这主要归功于GoogleNet中引入一个新的网络结构Inception模块,所以GoogleNet又被称为Inception V1(后面还有改进版V2、V3、V4)架构中有22层深,V1比VGGNet和AlexNet都深,但是它只有500万的参数量,计算量也只有15亿次浮点运算,在参数量和计算量下降的同时保证了准确率,可以说是非常优秀并且实用的模型。

    展开全文
  • [总结] 卷积神经网络发展历程

    千次阅读 多人点赞 2019-07-31 16:21:51
    本文用于总结卷积神经网络(CNN)发展历程

    一直都想梳理一下 CNN 网络结构的发展过程,却感觉无从下手,直到最近看到这篇文章:CNN网络结构的发展:从LeNet到EfficientNet
    于是我便下决心依照这篇文章所述顺序,对卷积神经网络的发展历程做一次粗略的梳理,也算对之前的知识框架做一次梳理。
    写这篇博文肯定有所疏漏或者理解错误的地方,有些定义我也不能清楚的进行表达,请各位谅解。

    1. LeNet

    论文链接:Gradient-based learning applied to document recognition, 发表时间:1998 年

    以现在的眼光来看,LeNet 绝对是一个小网络,也没什么特点。但是,LeNet 是 CNN 网络结构的开山鼻祖,第一次定义了 CNN 网络结构
    LeNet 的特点如下所示:

    • 定义了卷积神经网络(Convolutional Neural Network, CNN)的基本框架:卷积层 + 池化层(Pooling Layer) + 全连接层
    • 定义了卷积层(Convolution Layer),与全连接层相比,卷积层的不同之处有两点:局部连接(引进“感受野”这一概念)、权值共享(减少参数数量)
    • 利用池化层进行下采样(Downsampooling),从而减少计算量
    • 用 Tanh 作为非线性激活函数(现在看到的都是改进过的 LeNet 了,用 ReLU 代替 Tanh。相较于 Sigmoid,Tanh 以原点对称(zero-centered),收敛速度会快。关于其解释,请看:谈谈激活函数以零为中心的问题

    PS: 关于全连接层,作者 Yann LeCun 曾在推特上指出:直接将特征图(Featuremap)展开输入到全连接层,会导致 CNN 仅适用于指定尺度的图像上。LeCun 认为 CNN 应该尽可能适用与各种尺度的图像上,这一点也得到许多人的认同。对于分类(Classification)问题,利用全局平均池化(Global Average Pooling, GAP)操作代替特征图的拉伸,这样 CNN 便可以处理各种尺度的图像了。而对于语义分割(Semantic Segmentation)问题,Fully Convolutional Networks for Semantic Segmentation 已经提出了一个完全没有全连接层的全卷积网络了,可以在这个问题上处理任意大小的图像。

    PPS: 一般来说,卷积和池化的核的宽与高相等。
    卷积计算公式:Sizeout=(SizeinKernelPooling+2Padding)/Stride+1Size_{out} = (Size_{in} - Kernel_{Pooling}+2*Padding)/Stride + 1
    池化计算公式:Sizeout=(SizeinKernelPooling)/Stride+1Size_{out} = (Size_{in} - Kernel_{Pooling})/Stride + 1

    2. AlexNet

    论文链接:ImageNet Classification with Deep Convolutional Neural Networks, 发表时间:2012 年

    2012 年,Krizhevsky 与 Hinton 推出了 AlexNet,并在当年的 ILSVRC(ImageNet Large-Scale Visual Recognition Challenge)中以超过第二名10.9个百分点的绝对优势一举夺冠,引起了许多学者对深度学习的研究,可以算是深度学习的热潮的起始标志吧。

    当时的算力不如现在这样强劲,AlexNet 用的 GTX 580 也只有 3GB 的显存(这也导致其设计出双 GPU 框架,现在的许多深度学习框架都有这样的能力,不过当时只能通过手动编写底层代码,工作量可想而知),却完成了在 ImageNet 上的巨大突破,这在当时是非常轰动的,变相证明了深度学习的能力。

    由于算力的不断进步,AlexNet 在许多任务显得太"小"了,很少见到它的身影。所以我认为相较于 AlexNet 的框架,作者所做的一些其他改进更有值得研究的地方。

    AlexNet 的特点如下所示:

    • 采用双 GPU 网络结构,从而可以设计出更“大”、更“深”的网络(相较于当时的算力来说)
    • 采用 ReLU 代替 Tanh,稍微解决梯度消失问题(Gradient Vanishing Problem),加快网络收敛速度。(关于常见激活函数的比较,可以看这篇:常用激活函数的比较 - 徐小贱民的文章 - 知乎
    • 提出局部相应归一化(LRN, Local Response Normalization),据作者所言,该操作能减少指标 Top-1/Top-5 Error Rate 1.4%/1.2%。(我个人不喜欢 LRN,因为我觉得它的超参数太多了,不具备很好的泛化能力。关于 Normalization 的发展历程可以看这篇:[笔记] 神经网络中 Normalization 的发展历程
    • 令 Pooling 操作中的 stride 小于池化核的大小,从而使相邻的池化区域存在重叠部分,这一操作称为 Overlapping Pooling。据作者所言,这一操作能减少指标 Top-1/Top-5 Error Rate 0.4%/0.3%,并且减少过拟合现象。
    • 对训练数据进行随机裁剪(Random Crop),将训练图像由 256 × 256 裁剪为 224 × 224,并做随机的镜像翻转(Horizontal Reflection)。并在测试时,从图像的四个角以及中心进行裁剪,并进行镜像翻转,这样可以得到 10 个 Patch,将这些 Patch 的结果进行平均,从而得到最终预测结果。(之前在一个人脸识别比赛中,我师兄用这样的操作直接提高了4~5个点,算是一种简单的集成操作吧)
    • 对训练图像做 PCA(主成分分析),利用服从 (0,0.1) 的高斯分布的随机变量对主成分进行扰动。作者指出,这一操作能减少指标 Top-1 Error Rate 1%。
    • 利用 Dropout 避免网络过拟合。(我觉得这也算是集成操作的一种,因为随着模型的复杂度的提高,弱分类器也会越来越大,纯粹由弱分类器进行 Ensemble 应该不实际。最近谷歌对 Dropout 的专利貌似申请下来了,据说相关文档详细到可以作为 Dropout 的使用指南。)

    PS: PyTorch 中的 TORCHVISION.MODELS 提供基于 ImageNet 训练好的 AlexNet 模型,将其加载到显存中占了 1191 MiB(训练与测试所占显存大小依赖于实验设置,故不做讨论)。

    3. VGG

    论文链接:Very Deep Convolutional Networks for Large-Scale Image Recognition, 发表时间:2014.09

    2014 年,Simonyan 和 Zisserman 提出了 VGG 系列模型(包括VGG-11/VGG-13/VGG-16/VGG-19),并在当年的 ImageNet Challenge 上作为分类任务第二名、定位(Localization)任务第一名的基础网络出现。对于当时而言,VGG 属于很”深“的网络,已经达到 19 层的深度(虽然同年的 GooLeNet 有22层),这是一个不小的突破,因为理论上神经网络模型的拟合能力应该是随着模型”大小“不断增加的。

    虽然 VGG 的出现时间比较早,而且隔年又出现了 ResNet 这样现象级的网络模型,但是至今仍经常出现在论文中(虽然往往作为比较对象出现)。此外,VGG 的一些设置至今都在使用,所以,有必要了解一下 VGG 的网络结构。

    网络结构:

    VGG 其实跟 AlexNet 有一定的相似之处,都是由五个卷积层与激活函数叠加的部分和三个全连接层组成,但是不同的是,VGG加“深”了前面由五个卷积层与激活函数叠加的部分,使得每部分并不是一个卷积层加一个激活函数组成,而是多个这样的组合组成一部分(有人习惯称这个为 Conv Layer Group),每个部分之间进行池化操作。

    此外,VGG 与当时其他卷积神经网络不同,不采用感受野大的卷积核(如:7 × 7,5 × 5),反而采用感受野小的卷积核(3 × 3)。关于这样做的好处,作者指出有如下两点:减少网络参数量;由于参数量被大幅减小,于是可以用多个感受野小的卷积层替换掉之前一个感受野大的卷积层,从而增加网络的非线性表达能力。

    从 VGG-16 开始,VGG 引进卷积核大小为 1 × 1 的卷积层(最早应该在 Network In Network 提到),使得在不影响特征图大小的情况下,增加网络的非线性表达能力。

    由上图可以看出,VGG 每个“大”部分计算得到的特征图大小应该是固定的,以输入大小为 (224,244,3) 的图像举例,所计算得到的特征图大小分别为 (112,112,64),(56,56,128),(28,28,256),(14,14,512),(7,7,512)。(VGG 的最后三层全连接层太大了,尤其是第一层,大小达到了 (25088,4096) )

    其他细节:

    • 作者提到曾使用 LRN,但是并没有任何效果提升,反而还使得内存使用和计算时间增加。
    • 在训练过程中,作者为避免随机初始化对训练带来负面影响,于是利用小的网络参数初始化大的网络参数(比如用以训练好的 VGG-11 去初始化部分 VGG-13 的网络参数)。
    • 对训练图像进行预处理时,先做宽高等比缩放(原文用的词是 isotropically rescaled,即同质化缩放),使其最短边长度达到 S,接着再做随机裁剪。其中,关于 S 的设置,作者提出了两种训练方案:Single-Scale Training,Multi-Scale Training。

    PS: PyTorch 中的 TORCHVISION.MODELS 提供基于 ImageNet 训练好的 VGG-11/VGG-13/VGG-16/VGG-19 模型,以及对应使用 Batch Normalization 的版本,分别将其加载到显存中占了 1467/1477/1501/1527 MiB(训练与测试所占显存大小依赖于实验设置,故不做讨论)。

    4. Inception Net

    • Inception Net V1 (GoogLeNet)

    论文链接:Going Deeper with Convolutions, 发表时间:2014.09

    2014 年,Google 提出了 Inception 网络结构,并以此构建了 GoogLeNet(之所以这样命名,是为了向LeNet致敬;此外,GoogLeNet 也经常被称为 Inception Net V1,而该论文经常被称为 Inception V1),从而在同年的 ImageNet Challenge 的分类与检测(Detection)任务上夺得第一名。

    与 VGG 不同,Inception 结构虽然也倾向于加“深”网络结构,从而提高模型的表达能力,但是作者充分考虑到现实中计算资源的限制,所以对模型中局部结构进行了精心设计,并且抛弃全连接层(虽然 GoogLeNet 最后加了一层全连接层,但这是作者为了其他人能更方便的利用模型进行微调(Finetune))。

    作者在文中指出,提高模型表达能力的最直接的办法就是增加模型的“大小”,而这又会导致两个问题的产生:模型越大,其网络参数也就越大,就越容易产生过拟合现象,所以就需要更大的数据集,然而大型数据集的构建成本是很高昂的;模型越大,对于计算资源的需求就越大,这在现实任务中是难以接受的。而作者认为解决这两个问题的基本方法是将全连接层,甚至是卷积层改为稀疏的网络结构。(作者还在文中指出,GoogLeNet 的参数仅有 AlexNet 的 1/12,而 AlexNet 的全连接层的参数量甚至占到了自身参数量的 90% 以上)

    受到 Network In Network 以及 HeHebbian Principle 的启发,作者通过增加网络的宽度,从而提高网络的表达能力,并尝试找到卷积神经网络中的最优局部稀疏结构,即 Inception Module(如上图所示)。

    作者所设计的 Inception Module 与常见的网络结构不同,打破了常规的卷积层串联的设计思路,选择将卷积核大小为 1 × 1,3 × 3,5 × 5 的卷积层和池化核大小为 3 × 3 的池化层进行并联,并将各自所得到的特征图进行 Concatenate 操作合并在一起,作为后续的输入。

    之所以 Inception Module 由上图左侧发展被改进为上图右侧,是因为:作者希望希望模型中深层的 Inception Module 可以捕捉到 Higher Abstraction,所以作者认为深层的 Inception Module中的卷积层的空间集中度应该逐渐降低,以此捕捉更大面积的特征。故,作者令越深层的 Inception Module 中,卷积核大小为 3 × 3 和 5 × 5 这两个卷积层的输出通道数占比越多。但这又将导致计算量增加,所以为了解决这个问题,作者在原有 Inception Module 的基础上,利用卷积核大小为 1 × 1 的卷积层进行降维操作,从而减小计算量(这建立在一个假设之上:即使是低维的映射也可能包含关于相关图像区域的大量信息)。

    由于 Inception Module 保持了输入输出的尺寸一致,故 GoogLeNet 可以由 Inception Module 进行模块化搭建。仔细观察 GoogLeNet 的结构,你会发现作者在 Inception Module (4a) 和 (4d) 设置了额外的辅助 Loss,用以增加向后传导的梯度,缓解梯度消失问题,同时增加额外的正则化操作。在文章中,作者指出这样操作的目的主要是使得模型中低层的特征也具备很好的区分能力。(文章中,这两个额外的 Loss 会乘上衰减系数 0.3,与最后的 Loss 相加,作为整个模型的 Loss)

    • Inception Net V2

    论文链接:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, 发表时间:2015.02

    2015 年,谷歌提出了 Batch Normalization 操作,将其添加在之前的 GoogLeNet,并修改了一定的结构与实验设置,得到了 Inception Net V2,在 ImageNet 上达到分类任务超过 GoogLeNet。(关于 BN 的详细笔记,可以参考这篇博文:[笔记] 神经网络中 Normalization 的发展历程

    网络结构:

    • 将 Inception Module 中卷积核大小为 5 × 5 的卷积层用两个相连的卷积核大小为 3 × 3 的卷积层进行替换。作者指出,这一操作是的模型参数增加了 25%,计算成本提高了 30%。
    • 将输出大小为 28 × 28 的 Inception Module 的个数由两个提升到三个,即增加 Inception Module (3c)。
    • 在 Inception Module 中进行池化操作(有时为平均池化(Average Pooling),有时为最大池化(Max Pooling))
    • 两个 Inception Module 之间不再进行池化操作,仅在 Inception Module (3c) 和 (4e) 前添加 stride-2 conv/pooling layer。
    • 将网络第一层的卷积层替换为深度乘子为 8 的可分离卷积(Separable Convolution,关于这个概念,可以参考:卷积神经网络中的Separable ConvolutionCNN中千奇百怪的卷积方式大汇总)。

    其他细节:

    • 作者在文中指出,他们并不是直接简单的将 BN 添加到网络中的,还做了如下的改动:增大学习率,移除 Dropout,减小 L2 正则化项,加速学习率衰减,移除 LRN,更彻底的打乱训练数据,减少光学畸变( Photometric Distortion,关于这个概念,可以参考这篇文章:SSD中的数据增强细节)。下图为作者关于学习率的对比实验:
    • Inception Net V3

    论文链接:Rethinking the Inception Architecture for Computer Vision, 发表时间:2015.12

    时隔将近一年,谷歌又发了篇论文对之前提出的 Inception Module 进行了思考。在这篇论文中,作者首先四条设计神经网络的原则,接着提出如何分解大卷积核的卷积层,接着反思辅助分类器(Auxiliary Classifier)的作用,接着按照自己所提的第一条原则对常见的 Size Reduction 做了改进,最后将以上改进添加进之前的网络结构中。

    关于四条设计神经网络的原则:(没能完全理解,直接放原文吧)

    • Avoid representational bottlenecks, especially early in the network.
    • Higher dimensional representations are easier to process locally within a network.
    • Spatial aggregation can be done over lower dimensional embeddings without much or any loss in representational power.
    • Balance the width and depth of the network.

    关于如何分解大卷积核的卷积层:

    作者提出两种解决办法:利用连续的两层小卷积核的卷积层代替大卷积核的卷积层(下图左侧所示);利用连续的两层非对称的卷积层(卷积核大小为 n × 1 和 1 × n)代替原有卷积层(卷积核大小为 n × n)(下图右侧所示)。

    这样做的好处自然是减少参数量以及计算量。此外,作者对于这两种操作都做了相应的实验并发现:使用第一种操作时,添加在卷积层后的激活函数都为 ReLU 比 Linear+ReLU 好;使用第二种操作,最好在模型的中间层使用(适用的FeatureMap大小范围为 12~20)。

    关于辅助分类器的作用:

    GoogLeNet 曾在 Inception Module (4a) 和 (4d) 设置了额外的辅助 Loss,即设置了辅助分类器,当时作者对其的理解是:使梯度更好的回传到低层,避免梯度消失问题,提高模型的收敛速度与最终表现。但是作者通过实验发现:在训练初期,有无辅助分类器并无区别;在训练后期,有辅助分类器将提高模型的最终表现;此外,作者去掉 GoogLeNet 中较低的辅助分类器的分支,发现此举并不会导致模型性能有明显的降低。最后,作者认为:辅助分类器起到的作用更像是正则化。

    关于如何有效减少特征图尺寸:

    在分类任务中,许多模型都会随着深度的整长不断通过池化操作缩小特征图尺寸,以此减小模型的“体积”。由于池化操作会导致特征图中的许多信息丢失,许多模型都习惯在特征图的宽与高缩小一半的同时,利用卷积核为 1 × 1 的卷积层使得特征图的通道数量翻倍(即 C × W × H -> 2C × W/2 × H/2),以此减少池化操作所带来的信息丢失。

    这样操作有两种选择:先进行升维操作,再进行池化操作;先进行池化操作,再进行升维操作。作者指出,根据原则一,我们应先进行升维操作,再进行池化操作。(我觉得挺好理解的,本来升维就是为了避免池化操作带来的信息丢失,但是在已经池化后的特征图上做升维的效果肯定不如在未池化的特征图上做升维的效果好)

    当然,这样做会导致计算量增加,于是作者提出了另一种做法,如下图所示:

    • Inception Net V4

    论文链接:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning, 发表时间:2016.02

    在 Inception-v4 中,作者将 Inception 和 ResNet 结合在一起,推出了 Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4。其中,Inception-v4 的总体结构如上图所示,各个模块细节如下图所示。

    可以看得出来,Inception-v4 的结构设计非常复杂,需要大量的实验验证以及工程经验,一般只有大厂才有能力做这样的工作,这也是为什么最近 NAS 这么火的原因吧。

    • Xception

    论文链接:Xception: Deep Learning with Depthwise Separable Convolutions , 发表时间:2016.10

    在这篇论文中,Google 利用 Depthwise Separable Convolution 对 Inception V3 进行了改进,并结合 Residual Connection 设计了新的网络:Xception(含有 Extreme Inception 的意味)。

    作者在文章开头便指出 Inception Module 背后的思路是通过一系列操作使得模型的学习更加简单有效(分别单独学习通道之间的关系和空间关系),这意味着 Inception Module 假设通道之间的关系和空间关系是可以被分离开的(这个假设的一个变体就是 width-wise correlation and height-wise correlation,即 Inception V3 里的卷积核大小为 7×1 和 1×7 的卷积层)。接着,作者由 Inception V3 中的 Inception Module 进行演变,得到极端版本的 Inception Module,与 Depthwise Separable Convulotion 思路一致,如下图所示:

    作者指出 “extreme” version of Inception Module 与 Depthwise Separable Convolution 主要存在两点不同:

    • Depthwise Convolution 和 Pointwise Convolution 的顺序不同。不过,作者认为这一点并不重要。
    • 在 Inception Module 中,Depthwise Convolution 和 Pointwise Convolution 后都会接着 ReLU;而 Depthwise Separable Convolution 一般仅在 Pointwise Convolution 后接着 ReLU。作者认为这一点差异比较重要,并在后续的实验中进行了讨论(后面发现在 Pointwise Convolution 后接 ReLU/ELU,都不如中间不添加激活函数的表现效果)。

    最后,作者提出了新的网络:Xception(结合了 Inception Module, Residual Connection, Depthwise Seperable Convolution),网络结构如下所示:

    5. ResNet

    • Residual Network

    论文链接:Deep Residual Learning for Image Recognition,发表时间:2015.12

    2015 年,Kaiming He 提出了 ResNet(拿到了 2016 年 CVPR Best Paper Award),不仅解决了神经网络中的退化问题(Degrade Problem,即相较于浅层神经网络,深层神经网络的深度到达一定深度后,拟合能力反而更差,训练/测试误差更高),还在同年的 ILSVRC 和 COCO 竞赛横扫竞争对手,分别拿下分类、定位、检测、分割任务的第一名。(个人觉得,ResNet真的属于现象级论文,所提出的残差结构大幅提高了神经网络的拟合能力)

    网络结构:

    简单来说,Kaiming 在文中提出了残差结构(Residual Block,如上图左侧所示),使得原本所要拟合的函数 H(x)H(x),改为 F(x)F(x),其中,H(x)=F(x)+xH(x)=F(x)+x。虽然在“多个非线性层可以拟合任意函数”这一假设下二者并无区别,但是 Kaiming 假设模型学习后者,将更容易进行优化与收敛。(在残差结构中,模型利用 Shorcut 进行 Identity Mapping,这样也解决了梯度消失现象)

    由于 Residual Block 并不需要额外的参数以及计算量,Kaiming 在文中以此做了多组对照实验,证明该网络结构的有效性(所用的两个 ResNet 为 ResNet-18 和 ResNet-34)。但是,若要将模型的深度继续不断增加,需要对其进行改进:将原先的 Residual Block(上图右侧所示,也被称作 Basic Block) 改进为 Bottleneck Block,减少模型的参数与计算量。

    其他细节:

    • 对训练数据进行数据增强:从 [256,480] 随机采样,作为图像最短边长度,进行宽高等比缩放;随机裁剪 224 * 224,并进行随机镜像翻转;并对所有训练图像的每个像素值进行统计,并减去该平均值。
    • 对测试数据使用 10-crop 测试方法。
    • ResNet 在非线性层后,激活函数前使用 Batch Normalization。

    PS: PyTorch 中的 TORCHVISION.MODELS 提供基于 ImageNet 训练好的 ResNet-18/ResNet-34/ResNet-50/ResNet-101/ResNet-152 模型,以及对应使用 Batch Normalization 的版本,分别将其加载到显存中占了 1007/1113/1179/1227/1443 MiB(训练与测试所占显存大小依赖于实验设置,故不做讨论)。

    • 关于 Residual Network 中 Identity Mapping 的讨论

    论文链接:Identity Mappings in Deep Residual Networks,发表时间:2016.03

    Kaiming 在这篇论文中对 ResNet 中的 Identity Mapping 进行了详细的讨论(前向传导、后向传导的分析),并且设计并尝试了多种不同的 Shortcut Connection 设计(如上图所示),并在最后对激活函数做了讨论,从而提出了新的 Residual Block(为与原版结构区分,Kaiming 称其为 full pre-activateion Residual Block)。

    我个人是比较喜欢这篇论文的,不仅对照实验设置的很详细,也对各类实验现象进行了分析,尤其是最后关于激活函数的讨论(到现在为止,这应该都还是开放问题,大家并没有一个统一的观点)。总的来说,Kaiming 在这篇论文中做出了两处改动:移除了 Short Connection 中的 ReLU,并将 Residual Mapping 中的 BN 和 ReLU 提前至对应的神经网络层前。

    PS: 阅读 PyTorch 所提供的源码,可以发现 PyTorch 中的 TORCHVISION.MODELS 所提供的 ResNet 模型,都是按照之前文章所述实现的,即 original Residual Block 版本。

    6. DenseNet

    论文链接:Densely Connected Convolutional Networks,发表时间:2016.08

    2016 年,DenseNet 横空出世,在当年也引起过热议。与 ResNet、Inception Net 不同,DenseNet 即没从网络的深度入手,也没从网络的宽度入手,而是对每层的 FeatureMap 进行特征复用,以此缓解梯度消失问题,加强网络中特征的传递,有效对特征进行复用,并在提高网络的表现效果的同时减少了网络的参数量

    在论文中,作者提出了一种网络结构:Dense Block(如下图所示)。在 Dense Block 中,每层卷积层的输入为在该 Block 中之前所有卷积层所输出的 FeatureMap 的 concation 结果 (此处与 ResNet 不同,ResNet 中将结果进行 add )。作者在文中指出,ResNet 成功的关键点在于:‘they create short paths from early layers to later laters’;作者认为自己之所以提出的 Dense Block 这样的结果,就是为了保证层与层之间的信息能最大程度的保存。

    网络结构:

    • DenseNet 与其他 CNN 类似,同样保留着 down-sampling layers 的设计,网络中包含四个 Dense Block 和四个 Transition Layer,分别处理不同 Size 的 FeatureMap / 对 FeatureMap 进行 Pooling 操作。
    • 根据 Identity Mappings in Deep Residual Networks,作者在 Dense Block 中将 BN 和 ReLU 设置在卷积层前面。由于 Dense Block 的特征复用操作,越后面的卷积层,其输入的 Channel 越大。故作者在 DenseNet 中引用了 Bottleneck Layer,即:BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3),以此避免计算量的快速增长。(文中记使用 Bottleneck Layer 的 DesnseNet 为 DenseNet-B)
    • 作者还尝试在 Transition Layer 中对 FeatureMap 的 Channel 数量进行缩减,设输入的 FeatureMap 的 Channel 数为 m,θ\theta 为压缩因子,则输出的 FeatureMap 的 Channel 数为 θm\lfloor \theta m \rfloor。(实验中,作者设置θ\theta为0.5;,并记使用Bottleneck Layer 以及设置 Transition Layer 的 θ<1\theta < 1 的 DesnseNet 为 DenseNet-BC)
    • 为保持特征复用的实现(即同意 DenseNet 中的所有 FeatureMap 大小一致),作者令 Dense Block 中的卷积层的卷积核大小为 3 × 3,padding 为 1,且采用zero-padding。

    PS: PyTorch 中的 TORCHVISION.MODELS 提供基于 ImageNet 训练好的 DenseNet-121/DenseNet-161/DenseNet-169/DenseNet-201 模型,分别将其加载到显存中占了 1115/1201/1135/1153 MiB(训练与测试所占显存大小依赖于实验设置,故不做讨论)。

    7. MobileNet

    • MobileNet V1

    论文链接:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications,发表时间:2017.04

    (关于 MobileNet 系列文章,可以参考我之前所写的一篇博文:[论文笔记] MobileNet 系列论文笔记,链接如下,虽然当时也是刚刚开始接触深度学习)

    2017年左右,神经网络模型轻量化已经逐渐引起人们的关注,常见的手段分为两种:设计轻量化网络模型以及对已经训练好的复杂网络进行压缩(比如:降低精度、剪枝等等)。此时,Google 提出了一个轻量化模型:MobileNet,成为后续人们常使用的 Baseline Model。

    在 MobileNet 中,作者利用 Depthwise Separable Convolution 设计了一个轻量化网络,并通过设置 Width Multiplier 和 Resolution Multiplier 这两个超参数方便用户根据需求任意更改网络宽度与输入分辨率大小,从而使得人们可以根据任务需要与实际场景对模型进行 latency 和 accuracy 的权衡。

    关于 Depthwise Separable Convolution:

    Depthwise Separable Convolution 其实是将 Standard Convolution 拆分成两个部分:Depthwise Convolution 和 Pointwise Convolution。

    其实这个概念不难理解,只需要看作者所提供的图就好了:

    原先的 Standard Convolution 中每个 Filter 的 shape 为 (Dk,Dk,M)(D_k,D_k,M),其中 MM 为所输入 Feature Map 的 channel 数。每个 Filter 在所输入的 Feature Map 上进行卷积,输出的 shape 为 (Dout,Dout,1)(D_{out},D_{out},1),如果有 NN 个 Fliter,则输出的 shape 为 (Dout,Dout,N)(D_{out},D_{out},N)

    反观 Depthwise Separasble Convolution:在 Depthwise Convolution 阶段,每个 Depthwise Convolution Fliter 的 shape 为 (Dk,Dk,1)(D_k,D_k,1),共有 MM 个 Filer,则输出结果的 shape 为 (Dout,Dout,M)(D_{out},D{out},M);接着在 Pointwise Convolution 阶段, 每个 Pointwise Convolution Filter 的 shape 为 (1,1,M)(1,1,M),共有 NN 个 Filter,则输出结果的 shape 为 (Dout,Dout,N)(D_{out},D_{out},N)

    可以明显看出,Standard Convolution 所需参数为 DkDkMND_k*D_k*M*N,而 Depthwise Separable Convolution 所需参数为 DkDkM+MN=M(DkDk+N)D_k*D_k*M + M*N = M*(D_k*D_k+N),与 Standard Convolution 相比,所减少的参数数量为 (N1)DkDkN(N-1)*D_k*D_k-N

    作者在论文中,也分别对 Standard Convolution 和 Depthwise Separable Convolution 的计算代价做了对比:

    关于 Width Multiplier:

    作者在论文中提出,可以利用超参数 α\alpha 控制 MobileNet 的通道数,使得输入 Feature Map 的 channel 数变为 αM\alpha M,输出 Feature Map 的 channel 数变为 αN\alpha N
    其中,α=1\alpha=1为 baseline MobileNet,α<1\alpha<1为 reduced MobileNet。

    关于 Resolution Multiplier:

    作者在论文中提出,可以利用超参数 ρ\rho 控制 MobileNet 的 resolution。
    其中,ρ=1\rho=1为 baseline MobileNet,ρ<1\rho<1为 reduced MobileNet。

    • MobileNet V2

    论文链接:MobileNetV2: Inverted Residuals and Linear Bottlenecks,发表时间:2018.01

    2018年,Google 在 MobileNet 基础上提出了新的模型 MobileNet V2。其中,提出了新的结构 Inverted Residuals and Linear Bottlenecks,并利用MobileNet V2 实现分类/目标检测/语义分割多目标任务。

    关于 Inverted Residuals and Linear Bottlenecks:

    首先,先讲清楚什么是 Inverted Residuals and Linear Bottlenecks 结构:

    下图是 Residual Block 与 Invereted Residual Block 的区别,可以看到原先的 Residual block 是先降 Channel 再升 Channel 的,不过现在 Inverted Residual Block 却是先升 Channel 再降 Channel 的。

    其次是 Linear 的部分,作者在文中指出 ReLU 的使用将会使得 low-dimension channel tensor 产生崩塌,造成信息损失,故将最后的 ReLU6 去掉,直接进行线性输出。(关于 ReLU6:卷积之后通常会接一个ReLU非线性激活,在Mobile v1里面使用ReLU6,ReLU6就是普通的ReLU但是限制最大输出值为6(对输出值做clip),这是为了在移动端设备float16的低精度的时候,也能有很好的数值分辨率,如果对ReLU的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16无法很好地精确描述如此大范围的数值,带来精度损失。)

    作者对于这部分做了详细的实验与推导,在此我尽量进行描述:

    作者首先提到 It has been long assumed that manifolds of interest in neural networks could be embedded in low-dimensional subspaces ,其次利用实验探究 ReLU 所带来的信息损失:

    他人见解:

    1. 这意味着,在较低维度的张量表示(兴趣流形)上进行ReLU等线性变换会有很大的信息损耗。因而本文提出使用线性变换替代Bottleneck的激活层,而在需要激活的卷积层中,使用较大的M使张量在进行激活前先扩张,整个单元的输入输出是低维张量,而中间的层则用较高维的张量。
    2. 用线性变换层替换channel数较少的层中的ReLU,这样做的理由是ReLU会对channel数低的张量造成较大的信息损耗。我个人的理解是ReLU会使负值置零,channel数较低时会有相对高的概率使某一维度的张量值全为0,即张量的维度减小了,而且这一过程无法恢复。张量维度的减小即意味着特征描述容量的下降。

    关于这部分我的理解比较肤浅,建议大家阅读论文,并查阅他人的见解:

    To summarize, we have highlighted two properties that are indicative of the requirement that the manifold of interest should lie in a low-dimensional subspace of the higher-dimensional activation space:

    1. If the manifold of interest remains non-zero volume after ReLU transformation, it corresponds to a linear transformation.
    2. ReLU is capable of preserving complete information about the input manifold, but only if the input manifold lies in a low-dimensional subspace of the input space.
    • MobileNet V3

    论文链接:Searching for MobileNetV3,发表时间:2019.05

    (还没看,之后有空再写)

    8. ShffuleNet

    • ShuffleNet V1

    论文链接:ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices,发表时间:2017.07

    2017年,Face++ 的张翔宇(跟 Kaiming 一起推出 ResNet)推出了 ShffuleNet(一种极高效的移动端卷积神经网络模型),其 Insight 是:许多 Basic Architecture (比如:Xception, ResNet) 在计算资源受限时,其性能将大幅下降,而这是由于其中包含大量的 111*1 Convolution 所导致的。

    因此,在ShffuleNet中,作者利用 Group Convolution, Depthwise Separable Convolution 结合,提出 Pointwise Group Convolution 以避免大量 111*1 Convoltuion,并利用 Channel Shuffle 缓解由 Group Convolution 带来的副作用,并在 Residual Block 的基础上进行网络结构设计,使得网络的计算量减少的同时,仍能保持较高的性能。

    网络结构:

    • Group Convolution and Channel Shffule

      关于 Group Convolution 的概念,最早应该是在 AlexNet 中所提出来的,用于解决当时 GPU 显存不够用的尴尬境地。不过,本篇论文中作者利用 Group Convolution 减少模型的计算量与参数量(关于 Group Convolution 的参数量与其他细节可以阅读:Group Convolution分组卷积,以及Depthwise Convolution和Global Depthwise Convolution)。为避免由于 Group Convolution 导致所学习特征较为局限(多个 Group Convolution 叠加,将导致某个输出channel仅仅来自输入channel的一小部分),作者引进 Channel Shuffle 操作(作者将 Channel Dimension 由 gng * n reshape 为 (g,n)(g,n),进行转置为 (n,g)(n,g),并进行 flattening,以此完成 Channel Shuffle,使得该操作是可微分的)。

    • Depthwise Separable Convolution and Residual Connection

      作者利用 Depthwise Separable Convolution 对 Residual Block 进行改进,从而设计出 ShffuleNet Unit。其中,Pointwise Convolution 由于 Group Convolution 的缘故,需改为 Pointwise Group Convolution。作者还指出:之所以不在 Depthwise Convolution 后接 ReLU,是根据 Xception所述;使用 BN 与 ReLU 的方式,是模仿 ResNet 以及 Inception V2。(作者还提到,之所以只利用 Depthwise Convolution 处理 Bottleneck Feature Map,是因为 Depthwise Convolution 很难在移动端上有高效的实现,尽管理论上其参数量与计算量都较小 )

    • ShuffleNet Architecture
    • ShuffleNet V2

    论文链接:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design,发表时间:2018.07

    近几年来,人们对如何设计高效的神经网络模型的讨论较为热烈,许多针对移动端设备使用的模型结构相继推出,如:MobileNet 系列模型, ShffuleNet 系列模型等等。人们都称这样的网络是“小”网络,衡量标准便是其参数量与运算量,但是这样的衡量标准是否精确呢?

    2018年,Face++ 对衡量模型复杂度的指标(如:FLOPs)进行讨论,提出应该使用更为直接的指标(如:运行速度),并应直接在目标平台上进行测试。此外,Face++ 还提出了四条关于高效网络设计的实用准则,并依据此提出了 ShffuleNet V2。

    在论文中,作者对 Xception, ShffuleNet V1/V2, MobileNet V2进行了详细测试:

    作者认为,之所以出现“运算量差不多的两个模型的速度却会差很多”这一现象,是因为许多影响运行速度的因素并不能通过运算量进行体现,如: Memory Access Cost (MAC) 和模型的并行化程度往往没被纳入考虑范围中,而且模型在不同的平台上的运行速度往往也不一样。

    关于高效网络设计的实用准则:

    • Equal channel width minimizes memory access cost (MAC).(卷积层输入、输出的通道数量一致可以减少 MAC)
    • Excessive group convolution increases MAC.(组卷积的分组数量的增加将导致 MAC 增加)
    • Network fragmentation reduces degree of parallelism.(网络过多的分支将影响其并行性能)
    • Element-wise operations are non-negligible.(元素级别的操作不应被忽略)

    ShffuleNet V2 网络结构:

    参考资料:

    展开全文
  • 随着ReLU和dropout的提出,以及GPU和大数据带来的历史机遇,CNN在2012年迎来了历史突破–AlexNet,从此CNN呈现爆炸式发展。  从此,Deep Learning一发不可收拾,ILSVRC每年都不断被Deep Learning刷榜,如图1所示,...

        经典的LeNet诞生于1998年。然而之后CNN的锋芒开始被SVM等手工设计的特征盖过。随着ReLU和dropout的提出,以及GPU和大数据带来的历史机遇,CNN在2012年迎来了历史突破–AlexNet,从此CNN呈现爆炸式发展。

        从此,Deep Learning一发不可收拾,ILSVRC每年都不断被Deep Learning刷榜,如图1所示,随着模型变得越来越深,Top-5的错误率也越来越低,目前降到了2.25%附近(2017,SENet),而在同样的ImageNet数据集合上,人眼的辨识错误率大概在5.1%,也就是目前的Deep Learning模型的识别能力已经超过了人眼。而下图中的这些模型,也是Deep Learning视觉发展的里程碑式代表。

        

        CNN主要的经典结构包括:LeNet、AlexNet、ZFNet、VGG、NIN、GoogleNet、ResNet、SENet等,其发展过程如下图所示。(下图来自刘昕博士《CNN的近期进展与实用技巧》

    最古老的CNN模型

             1985年,Rumelhart和Hinton等人提出了反向传播(Back Propagation,BP)算法[1](也有说1986年的,指的是他们另一篇paper:Learning representations by back-propagating errors),使得神经网络的训练变得简单可行,这篇文章在Google Scholar上的引用次数达到了19000多次,目前还是比Cortes和Vapnic的Support-Vector Networks稍落后一点,不过以Deep Learning最近的发展劲头来看,超越指日可待。

           几年后,LeCun利用BP算法来训练多层神经网络用于识别手写邮政编码[2],这个工作就是CNN的开山之作,多处用到了5*5的卷积核,但在这篇文章中LeCun只是说把5*5的相邻区域作为感受野,并未提及卷积或卷积神经网络(1986年)

     

    1.开山鼻祖:LeNet5

     

         LeNet是卷积神经网络的祖师爷LeCun在1998年提出,用于解决手写数字识别的视觉任务。自那时起,CNN的最基本的架构就定下来了:卷积层、池化层、全连接层。如今各大深度学习框架中所使用的LeNet都是简化改进过的LeNet-5(-5表示具有5个层),和原始的LeNet有些许不同,比如把激活函数改为了现在很常用的ReLu。
        1998年的LeNet5[4]标注着CNN的真正面世,但是这个模型在后来的一段时间并未能火起来,主要原因是费机器(计算跟不上),而且其他的算法(SVM)也能达到类似的效果甚至超过。但是LeNet最大的贡献是:定义了CNN的基本结构,是CNN的鼻祖

    1. LeNet的结构:

         LeNet5包含Input、卷积层1、池化层1、卷积层2、池化层2、全连接层、输出层。    

    INPUT: [28x28x1]           weights: 0
    CONV5-32: [28x28x32]       weights: (5*5*1+1)*32
    POOL2: [14x14x32]          weights: 2*2*1
    CONV5-64: [14x14x64]       weights: (5*5*32+1)*64
    POOL2: [7x7x64]            weights: 2*2*1
    FC: [1x1x1024]              weights: (7*7*64+1)*1024
    FC: [1x1x10]              weights: (1*1*512+1)*10
    

    2.LeNet的特点

         LeNet5当时的特性有如下几点:

    • 每个卷积层包含三个部分:卷积、池化和非线性激活函数
    • 使用卷积提取空间特征起初被称为感受野,未提“卷积”二字)
    • 降采样(Subsample)的平均池化层(Average Pooling)
    • 双曲正切(Tanh)的激活函数
    • MLP作为最后的分类器
    • 层与层之间的稀疏连接减少计算复杂性

     

    3.LeNet的突出贡献

        LeNet定义了CNN的基本结构,是CNN的鼻祖

        具体实现,可戳:https://blog.csdn.net/u012679707/article/details/80365599

     

    2.王者归来:AlexNet

            AlexNet在2012年ImageNet竞赛中以超过第二名10.9个百分点的绝对优势一举夺冠,从此深度学习和卷积神经网络名声鹊起,深度学习的研究如雨后春笋般出现,AlexNet的出现可谓是卷积神经网络的王者归来。

    1.AlexNet的结构

        alexNet为8层深度网络,其中5层卷积层和3层全连接层,不计LRN层和池化层。如下图所示:

                    

    2.AlexNet的特点

           (1)ReLU作为激活函数。

         ReLU为非饱和函数,论文中验证其效果在较深的网络超过了SIgmoid,成功解决了SIgmoid在网络较深时的梯度弥散问题。

    (2)Dropout避免模型过拟合

          类似于浅层学习算法的中集成算法,该方法通过让全连接层的神经元(该模型在前两个全连接层引入Dropout)以一定的概率失去活性(比如0.5)失活的神经元不再参与前向和反向传播,相当于约有一半的神经元不再起作用。在测试的时候,让所有神经元的输出乘0.5。Dropout的引用,有效缓解了模型的过拟合。

    (3)重叠的最大池化

        之前的CNN中普遍使用平均池化,而Alexnet全部使用最大池化,避免平均池化的模糊化效果。并且,池化的步长小于核尺寸,这样使得池化层的输出之间会有重叠和覆盖提升了特征的丰富性

    (4)提出LRN层

        提出LRN(局部响应归一化)层,对局部神经元的活动创建竞争机制,使得响应较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。

    (5)GPU加速

    (6)数据增强

        随机从256*256的原始图像中截取224*224大小的区域(以及水平翻转的镜像),相当于增强了(256-224)*(256-224)*2=2048倍的数据量。使用了数据增强后,减轻过拟合,提升泛化能力。避免因为原始数据量的大小使得参数众多的CNN陷入过拟合中。

    3.AlexNet的贡献

        AlexNet的贡献也就是AlexNet的新特点:

        (1)Relu做激活函数,代替Sigmoid来加快SGD的收敛速度

        (2)dropout避免过拟合 

        (3)重叠最大池化 overlapping Max Pooling

         (4)LRN(局部响应归一化),利用临近的数据做归一化,加速训练。

        (5)GPU加速

        (6)数据增强,增加模型泛化能力

    具体的tensorflow实现,可戳:https://blog.csdn.net/u012679707/article/details/80793916

     

    3.稳步前行:ZF-Net

        ZFNet是2013ImageNet分类任务的冠军,其网络结构没什么改进,只是调了调参,性能较Alex提升了不少。ZF-Net只是将AlexNet第一层卷积核由11变成7,步长由4变为2,第3,4,5卷积层转变为384,384,256。这一年的ImageNet还是比较平静的一届,其冠军ZF-Net的名堂也没其他届的经典网络架构响亮。

        ZFNet的结构如下:

    4.越走越深:VGG-Nets

           VGG-Nets是由牛津大学VGG(Visual Geometry Group)提出,是2014年ImageNet竞赛定位任务的第一名和分类任务的第二名的中的基础网络。VGG可以看成是加深版本的AlexNet. 都是conv layer + FC layer,在当时看来这是一个非常深的网络了,因为层数高达十多层,我们从其论文名字就知道了(《Very Deep Convolutional Networks for Large-Scale Visual Recognition》),当然以现在的目光看来VGG真的称不上是一个very deep的网络。

        VGGNet探索了CNN的深度及其性能之间的关系,通过反复堆叠3*3的小型卷积核和2*2的最大池化层,VGGNet成功的构筑了16-19层深的CNN。

     

    1.VGGNet结构

         VGGNet有A-E七种结构,从A-E网络逐步变深,但是参数量并没有增长很多(图6-7),原因为:参数量主要消耗在最后3个全连接层,而前面的卷积层虽然层数多,但消耗的参数量不大。不过,卷积层的训练比较耗时,因为其计算量大。

        其中,D和E是常说的VGGNet-16和VGGNet-19。C很有意思,相比于B多了几个1*1的卷积层,1*1卷积的意义在于线性变换,而输入的通道数和输出的通道数不变,没有发生降维。

                     

     

                                    

    VGG的性能:

                    

    2.VGGNet网络特点:

            1. VGGNet拥有5段卷积,每段卷积内有2-3个卷积层,同时每段尾部都会连接一个最大池化层(用来缩小图片)。

        2. 每段内的卷积核数量一样,越后边的段内卷积核数量越多,依次为:64-128-256-512-512

        3. 越深的网络效果越好。(图6-9)

        4. LRN层作用不大(作者结论)

        5. 1*1的卷积也是很有效的,但是没有3*3的卷积好,大一些的卷积核可以学习更大的空间特征。

    3.VGGNet的贡献

        其突出贡献在于证明使用很小的卷积(3*3),增加网络深度可以有效提升模型的效果,而且VGGNet对其他数据集具有很好的泛化能力。到目前为止,VGGNet依然经常被用来提取图像特征

    问:为什么一个段内有多个3*3的卷积层堆叠?

    答:这是个非常有用的设计。如下图所示,2个3*3的卷积层串联相当于1个5*5的卷积层,即一个像素会跟周围5*5的像素产生关联,可以说感受野大小为5*5。而3个3*3的卷积层相当于1个7*7的卷积层。并且,3个3*3的卷积层的参数比1个7*7的更少,前者为3*3*3=27,后者为1*7*7=49。如下图所示:

                

        更重要的是,3个3*3的卷积层比1个7*7的卷积层有更多的非线性变换(前者可使用3次ReLu函数,后者只有1次),这使得CNN对特征的学习能力更强。

    3*3的卷积层堆叠的优点为:

        (1)参数量更小

        (2)小的卷积层比大的有更多的非线性变换,使得CNN对特征的学习能力更强。

     

    1*1卷积核的优点:

    • 作用是在不影响输入输出维数的情况下,对输入进行线性形变,然后通过Relu进行非线性处理,增加网络的非线性表达能力。
    • 降维或升维

    vggnet的tensorflow具体实现:https://blog.csdn.net/u012679707/article/details/80807406

    5.大浪推手:GoogleNet

         Googe Inception Net首次出现在ILSVRC2014的比赛中(和VGGNet同年),以较大的优势获得冠军。那一届的GoogleNet通常被称为Inception V1,Inception V1的特点控制了计算量的参数量的同时,获得了非常好的性能-top5错误率6.67%, 这主要归功于GoogleNet中引入一个新的网络结构Inception模块,所以GoogleNet又被称为Inception V1(后面还有改进版V2、V3、V4)架构中有22层深,V1比VGGNet和AlexNet都深,但是它只有500万的参数量,计算量也只有15亿次浮点运算,在参数量和计算量下降的同时保证了准确率,可以说是非常优秀并且实用的模型。

                        

    1.googleNet系列介绍

        Google Inception Net是一个大家族,包括:

    • 2014年9月的《Going deeper with convolutions》提出的Inception V1.
    • 2015年2月的《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出的Inception V2
    • 2015年12月的《Rethinking the Inception Architecture for Computer Vision》提出的Inception V3
    • 2016年2月的《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》提出的Inception V4

    2.GoogLeNet结构:

        V1有22层,V3有44层。

            

    3.GoogleNet的特点:

        Inception V1中精心设计的Inception Module提高了参数的利用率;在先前的网络中,全连接层占据了网络的大部分参数,很容易产生过拟合现象;Inception V1去除了模型最后的全连接层,用全局平均池化层代替(将图片尺寸变为1x1)。

     inception架构的主要思想是建立在找到可以逼近的卷积视觉网络内的最优局部稀疏结构,并可以通过易实现的模块实现这种结构。

     

    闪光点:

    • 引入Inception结构这是一种网中网(Network In Network)的结构,即原来的结点也是一个网络。
    • 中间层的辅助LOSS单元GoogLeNet网络结构中有3个LOSS单元,这样的网络设计是为了帮助网络的收敛。在中间层加入辅助计算的LOSS单元,目的是计算损失时让低层的特征也有很好的区分能力,从而让网络更好地被训练。在论文中,这两个辅助LOSS单元的计算被乘以0.3,然后和最后的LOSS相加作为最终的损失函数来训练网络。
    • 后面的全连接层全部替换为简单的全局平均pooling将后面的全连接层全部替换为简单的全局平均pooling,在最后参数会变的更少。而在AlexNet中最后3层的全连接层参数差不多占总参数的90%,使用大网络在宽度和深度上允许GoogleNet移除全连接层,但并不会影响到结果的精度,在ImageNet中实现93.3%的精度,而且要比VGG还要快。

    googlenet具体tensorflow实现:https://blog.csdn.net/u012679707/article/details/80824889

    6.里程碑式创新:ResNet

        2015年何恺明推出的ResNet在ISLVRC和COCO上横扫所有选手,获得冠军。ResNet在网络结构上做了大创新,而不再是简单的堆积层数,ResNet在卷积神经网络的新思路,绝对是深度学习发展历程上里程碑式的事件。

    闪光点:

    • 层数非常深,已经超过百层
    • 引入残差单元来解决退化问题

    残差网络

        主要的创新在残差网络,如图所示,其实这个网络的提出本质上还是要解决层次比较深的时候无法训练的问题。这种借鉴了Highway Network思想的网络相当于旁边专门开个通道使得输入可以直达输出,而优化的目标由原来的拟合输出H(x)变成输出和输入的差H(x)-x,其中H(X)是某一层原始的的期望映射输出,x是输入。

                                             

     

            下图展示了两种形态的残差模块,左图是常规残差模块,有两个3×3卷积核卷积核组成,但是随着网络进一步加深,这种残差结构在实践中并不是十分有效。针对这问题,右图的“瓶颈残差模块”(bottleneck residual block)可以有更好的效果,它依次由1×1、3×3、1×1这三个卷积层堆积而成,这里的1×1的卷积能够起降维或升维的作用,从而令3×3的卷积可以在相对较低维度的输入上进行,以达到提高计算效率的目的。

    7.SENet

                

            可以看到,已经有很多工作在空间维度上来提升网络的性能。那么很自然想到,网络是否可以从其他层面来考虑去提升性能,比如考虑特征通道之间的关系?基于这一点并提出了 Squeeze-and-Excitation Networks(简称 SENet)。在SENet结构中,Squeeze 和 Excitation 是两个非常关键的操作,所以以此来命名。动机是希望显式地建模特征通道之间的相互依赖关系。另外,作者并不打算引入一个新的空间维度来进行特征通道间的融合,而是采用了一种全新的「特征重标定」策略。具体来说,就是通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。

            下图是提出的 SE 模块的示意图。给定一个输入 x,其特征通道数为 c_1,通过一系列卷积等一般变换后得到一个特征通道数为 c_2 的特征。与传统的 CNN 不一样的是,接下来我们通过三个操作来重标定前面得到的特征。

                    

     

            (1)首先是 Squeeze 操作,我们顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。

            (2)其次是 Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性。

            (3)最后是一个 Reweight 的操作,我们将 Excitation 的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。

                            

                                    

        SENet详细知识,可戳:http://www.sohu.com/a/161633191_465975

     

    【经典论文】

    [1] DE Rumelhart, GE Hinton, RJ Williams, Learning internal representations by error propagation. 1985 – DTIC Document.
    [2] Y. LeCun , B. Boser , J. S. Denker , D. Henderson , R. E. Howard , W. Hubbard and L. D. Jackel, “Backpropagation applied to handwritten zip code recognition”, Neural Computation, vol. 1, no. 4, pp. 541-551, 1989.
    [3] Kaiming He, Deep Residual Learning, http://image-net.org/challenges/talks/ilsvrc2015_deep_residual_learning_kaiminghe.pdf
    [4] Y. LeCun, L. Bottou, Y. Bengio, and P. Haffner. Gradient-based learning applied to document recognition. Proceedings of the IEEE, 86(11):2278–2324, 1998.
    [5] A. Krizhevsky, I. Sutskever, and G. Hinton. Imagenet classification with deep convolutional neural networks. In Advances in Neural Information Processing Systems 25, pages 1106–1114, 2012.
    [6] Christian Szegedy, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott E. Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, Andrew Rabinovich: Going deeper with convolutions. CVPR 2015: 1-9
    [7] Karen Simonyan, Andrew Zisserman: Very Deep Convolutional Networks for Large-Scale Image Recognition. CoRR abs/1409.1556 (2014)
    [8] Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. Deep Residual Learning for Image Recognition. IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2016

     

    【参考】

    1.#Deep Learning回顾#之LeNet、AlexNet、GoogLeNet、VGG、ResNet2016-08-30

     http://www.cnblogs.com/52machinelearning/p/5821591.html

    2.CNN网络架构演进:从LeNet到DenseNet 2018-02-17】  http://www.cnblogs.com/skyfsm/p/8451834.html

    3.《tensonflow实战》黄文坚

    4.《解析卷积神经网络——深度学习实践手册》魏秀参

    5.【卷积神经网络-进化史】从LeNet到AlexNet  https://blog.csdn.net/cyh_24/article/details/51440344

    6.Momenta详解ImageNet 2017夺冠架构SENet    http://www.sohu.com/a/161633191_465975

     

    展开全文
  • 卷积神经网络发展历程

    千次阅读 2018-03-28 23:32:32
    深度学习基础理论-CNN篇卷积神经网络发展历程- 01 -卷积神经网络(Convolutional Neural Networks,简称CNN)是一类特殊的人工神经...

     深度学习基础理论-CNN篇 

    卷积神经网络的发展历程


    - 01 -

    卷积神经网络(Convolutional Neural Networks,简称CNN)是一类特殊的人工神经网络,区别于神经网络其他模型(如,递归神经网络、Boltzmann机等),其最主要的特点是卷积运算操作(convolution operators)。因此,CNN在诸多领域应用特别是图像相关任务上表现优异,诸如,图像分类(image classification)、图像语义分割(image semantic segmentation)、图像检索(image retrieval)、物体检测(object detection)等计算机视觉问题。此外,随着CNN研究的深入,如自然语言处理(natural language processing)中的文本分类,软件工程数据挖掘(software mining)中的软件缺陷预测等问题都在尝试利用卷积神经网络解决,并取得了相比传统方法甚至其他深度网络模型更优的预测效果。本文回顾卷积神经网络的发展历程。

    - 02 -

    卷积神经网络发展历史中的第一件里程碑事件发生在上世纪60年代左右的神经科学(neuroscience)中,加拿大神经科学家David H. Hubel和Torsten Wisesel于1959年提出猫的初级视皮层中单个神经元的“感受野”(receptive field)概念,紧接着于1962年发现了猫的视觉中枢里存在感受野、双目视觉和其他功能结构,标志着神经网络结构首次在大脑视觉系统中被发现。

    图1Torsten Wisesel(左)和David H. Hubel(右)。因其在视觉系统中信息处理方面的杰出贡献,两人于1981年获得诺贝尔生理学或医学奖。

    - 03 -

    1980年前后,日本科学家福岛邦彦(Kunihiko Fukushima)在Hubel和Wiesel工作的基础上,模拟生物视觉系统并提出了一种层级化的多层人工神经网络,即“神经认知”(neurocognitron),以处理手写字符识别和其他模式识别任务。神经认知模型在后来也被认为是现今卷积神经网络的前身。在福岛邦彦的神经认知模型中,两种最重要的组成单元是“S型细胞”(S-cells)和“C型细胞”(C-cells),两类细胞交替堆叠在一起构成了神经认知网络。其中,S型细胞用于抽取局部特征(local features),C型细胞则用于抽象和容错,如图2所示,不难发现这与现今卷积神经网络中的卷积层(convolution layer)和汇合层(pooling layer)可一一对应。

    图2 1980年福岛邦彦提出的神经认知模型

    随后,Yann LeCuu等人在1998年提出基于梯度学习的卷积神经网络算法,并将其成功用于手写数字字符识别,在那时的技术条件下就能取得低于1%的错误率。因此,LeNet这一卷积神经网络便在当时效力于全美几乎所有的邮政系统,用来识别手写邮政编码进而分拣邮件和包裹。可以说,LeNet是第一个产生实际商业价值的卷积神经网络,同时也为卷积神经网络以后的发展奠定了坚实的基础。鉴于此,Google在2015年提出GoogLeNet时还特意将“L”大写,从而向“前辈”LeNet致敬。

    图3 LeNet-5结构:一种用于字符识别的卷积神经网络。其中,每一个“矩形”代表一张特征图(feature map),最后是两层全连接层(fully connected layer)

    - 04 -

    时间来到2012年,在有计算机视觉界“世界杯”之称的ImageNet图像分类竞赛四周年之际,Geoffrey E. Hinton等人凭借卷积神经网络Alex-Net力挫日本东京大学、英国牛津大学VGG组等劲旅,且以超过第二名近12%的准确率一举夺得该竞赛冠军,霎时间学界业界纷纷惊愕哗然。自此便揭开了卷积神经网络在计算机视觉领域逐渐称霸的序幕,此后每年ImageNet竞赛的冠军非深度卷积神经网络莫属。直到2015年,在改进了卷积神经网络中的激活函数(activation function)后,卷积神经网络在ImageNet数据集上的性能(4.94%)第一次超过了人类预测错误率(5.1%)。近年来,随着神经网络特别是卷积神经网络相关领域研究人员的增多、技术的日新月异,卷积神经网络也变得愈宽愈深愈加复杂,从最初的5层、16层,到诸如MSRA提出的152层ResidualNet甚至上千层网络已被广大研究者和工程实践人员司空见惯。

    不过有趣的是,图4为Alex-Net网络结构,可以发现在基本结构方面它与十几年前的LeNet几乎毫无差异。但数十载间,数据和硬件设备(尤其是GPU)的发展确实翻天覆地,它们实际上才是进一步助力神经网络领域革新的主引擎。正是如此,才使得深度神经网络不再是“晚会的戏法”和象牙塔里的研究,真正变成了切实落地可行的工具和应用手段。深度卷积神经网络自2012]年的一炮而红,到现在俨然已成为目前人工智能领域一个举足轻重的研究课题,甚至可以说深度学习是诸如计算机视觉、自然语言处理等领域主宰性的研究技术,同时更是工业界各大公司和创业机构着力发展力求占先的技术奇点。

    图4 Alex-Net结构

     end

    *欢迎在留言区分享您的观点  

    *值班小Paddle:wangp


    展开全文
  • 中科院自动化所的卷积神经网络PPT,包括卷积神经网络发展历程、基本原理,以及近年来的应用,强烈推荐。
  • 卷积神经网络取得的第一个进步是AlexNet网络,它是在2012年提出的。这里有一些关键的改进:它提出了ReLu,也就是有助于防止消失的梯度问题;它也引入了dropout的概念,使得每层中神经元随机地打开和关闭,防止过拟合...
  • CNN主要的经典结构包括:LeNet、AlexNet、ZFNet、VGG...LeNet是卷积神经网络的祖师爷LeCun在1998年提出,用于解决手写数字识别的视觉任务。自那时起,CNN的最基本的架构就定下来了:卷积层、池化层、全连接层。如今...
  • 卷积神经网络(0)——发展历程

    千次阅读 2020-04-04 23:26:09
    视频来源:图神经网络在线研讨会2020 1. GNN在干什么 目前较火的CNN在欧式空间中已经表现出了强大的处理能力,其最大的特点在于平移不变性,这种特性能够很好的处理欧式空间的中的数据,但是, 图则是一类典型的非欧...
  • 卷积神经网络从lenet到DPN发展历程

    千次阅读 2018-06-06 22:19:43
    最早的卷积网络,已经有了卷积层,池化层和全连接层。二,AlexNet2012,ImageNet Classification with DeepConvolutional Neural NetworksImageNet Top5错误率:16.4%,而两年前非深度学习的方法的最好错误率是28.2%...
  • 浅聊卷积神经网络发展

    千次阅读 2018-09-23 10:30:53
    卷积神经网络的发展主要是为了解决人类视觉问题,不过现在其它方向也都会使用。发展历程主要从Lenet5-&gt;Alexnet-&gt;VGG-&gt;GooLenet-&gt;ResNet等。 Lenet5 上世界80年代发明了卷积层,但由于...
  • pytorch学习笔记卷积神经网络

    千次阅读 2020-09-14 23:00:36
    以全连接层为基础的深度神经网络DNN是整个深度...简单回顾卷积神经网络发展历程。日本科学家福岛邦彦在1986年提出了Neocognitron(神经认知机),直接启发了后来的卷积神经网络。Yann LeCun于1998年提出的卷积神经
  • 卷积神经网络内容概括

    千次阅读 2019-08-22 15:52:03
    卷积神经网络内容概括 卷积神经网发展历程和基本概念 内容概括 什么是卷积神经网络 以卷积结构为主,搭建起来的深度网络。 将图片作为网络的输入(n(批次),w(宽度),h(长度),c(图的通道数量)),自动提取特征...
  • AlexNet Output size: 通道数和滤波器数量保持一致,均为64 H/W = (H - K + 2P)/S + 1 = (227-11+4)/4+1=56 Memory(KB): Number of output elements: C * H* W=64*56 *56=200704; Bytes per element=4 (for 32-...
  • paper:Faster R-CNN: Towards Real-Time Object Detection with Region ...Faster R-CNN1 发展历程1.1 目前的卷积神经网络1.2 Faster R-CNN发展由来1.2.1 CNN1.2.2 RCNN(基于区域的卷积神经网络)1.2.3 Fast RC
  • 卷积神经网络基础CNN发展历程全连接层单个神经元卷积层局部感知:权值共享:激活函数卷积过程矩阵大小计算池化层 来源:B站up @霹雳吧啦Wz:卷积神经网络基础 CNN(Convolutional Neural Network)雏形:LeCun的...
  • 学习经典卷积神经网络目的就是了解卷积神经网络的发展历程,要知道先进算法的网络架构都是从经典卷积神经网络发展而来,废话不多说下面直接介绍LeNet-5卷积神经网络。 网络架构: 其结构如右图所示,下面将逐层的...
  • 解析卷积神经网络

    2019-01-27 11:42:39
    包含2017深度学习的发展历程网络介绍。 具体内容如下: 1.绪论 2.基础理论篇 3.实践应用篇 4.附录
  • 可视化探索卷积神经网络提取特征

    千次阅读 2018-12-06 08:16:24
    卷积神经网络的发展主要是为了解决人类视觉问题,不过现在其它方向也都会使用。发展历程主要从Lenet5-&gt;Alexnet-&gt;VGG-&gt;GooLenet-&gt;ResNet等。 传统神经网络 传统BP神经网络层与层之间都是...
  • 大数据成就未来 卷积神经网络CNN 深度学习 深度学习发展历程[TensorFlow实战google深度学习框架] 1. 感知机网络解决线性可分问题20世纪40年代 2. BP神经网络解决线性不可分问题20世纪80年代 3. 深度神经网络海量图片...
  • 周飞燕在2017年的计算机学报发表的一篇《卷积神经网络研究综述》,里面对卷积神经网络从开始有这个概念到2017年的发展历程,以及各个算法的优缺点等进行了综合概述。
  • 基于卷积神经网络的图像去噪(基础篇) 发展历程 基于深度学习的图像去噪,区别于传统去噪,但也有一定发展历程。从浅层模型到深度模型,从含噪图像映射去噪图像到含噪图像映射噪声图像(也就是残差学习),学习...
  • 给出了CNN卷积神经网络原理、组成和在计算机视觉领域的发展历程。然后着重介绍了 CNN在雷达自动目标识别中的研究现状,其中详细介绍了合成孔径雷达(SAR)图像目标的检测与识别方法。接下 来对雷达自动目标识别面临...
  • 卷积神经网络中经典操作

    千次阅读 2019-05-20 13:08:43
    CNN从2012年的AlexNet发展至今,科学家们发明出各种各样的CNN模型,一个比一个深,一个比一个准确,一个比一个轻量。对近几年一些具有变革性的工作进行简单盘点,附带这些操作的来源,全面了解一下CNN的前进历程。 ...
  • 卷积神经网络CNN原理详解

    千次阅读 2019-11-20 11:28:36
    看了深度学习框架pytorch的相关书籍,感觉CNN的原理还不太懂,因此上网查找相关内容进行进一步学习,...CNN有几个经典模型在其发展历程中有着里程碑的意义,它们分别是:LeNet、Alexnet、Googlenet、VGG、DRL等。 ...
  • 卷积神经网络发展历史中的第一件里程碑事件发生在上世纪60年代左右的神经科学中,1959 年提出猫的初级视皮层中单个神经元的“感受野”概念,紧接着于1962年发现了猫的视觉中枢里存在感受野、双目视觉和其他功能结构...
  • 百度飞桨PaddlePaddle-21天零基础实践深度学习-卷积神经网络基础计算机视觉主要任务应用场景发展历程卷积神经网络卷积卷积计算填充(padding)步幅(stride)感受野(Receptive Field)多输入通道、多输出通道和批量...
  • 卷积神经网络(CNN)可以说是深度学习发展的一个缩影,特别是现在在计算机视觉方面已经得到了非常成熟的应用,在目标检测、目标追踪等方面也是独领风骚,本文将讲述卷积神经网络近些年来的发展历程,以及它到底创新在...

空空如也

空空如也

1 2 3 4 5 6
收藏数 101
精华内容 40
关键字:

卷积神经网络发展历程