Deep Learning-TensorFlow (8) CNN卷积神经网络_《TensorFlow实战》及经典网络模型(上)

来源:互联网 发布:基于hadoop的数据分析 编辑:程序博客网 时间:2024/06/11 19:49

环境:Win8.1 TensorFlow1.0.1

软件:Anaconda3 (集成Python3及开发环境)

TensorFlow安装:pip install tensorflow (CPU版) pip install tensorflow-gpu (GPU版)


转载:

1. 《TensorFlow实战》,黄文坚

2. 独家 |《TensorFlow实战》作者黄文坚:四大经典CNN网络技术原理


1. 前言

在上一篇博文中,我们介绍了郑泽宇(才云科技)的《Tensorflow:实战Google深度学习框架》的前四章内容,了解的 TensorFlow 框架下深度学习的基本构成。后六章的内容如下:

  • 第五章利用之前介绍的优化(激活去线性、多隐藏层、指数衰减学习率、正则化、滑动平均模型)建立 MNIST 数据上的 DNN 网络,和实现过程中使用变量作用域和共享变量增加程序可读性,以及 Model 的 Save 和 Restore ;
  • 第六章介绍图像识别问题及 ImageNet 的 ILSVRC 赛事,讲述了 CNN 的网络结构组成——卷积层和池化层,建立了 LeNet-5 模型处理 MNIST 问题,以及如何利用已经训练好的模型迁移到新问题上;
  • 第七章介绍 TensorFlow 对于数据输入、数据预处理、多线程处理的 API;
  • 第八章第九章分别介绍了 RNN+LSTM 和 TensorBoard;
  • 第十章介绍了 TensorFlow 上的多 GPU 和分布式训练。

总的来说,较为完整地介绍了使用 TensorFlow 建立深度学习模型需要具备的基础知识。如果要进一步研究和开发,还需要对经典的网络模型进行探究,这部分内容是此书缺省的。


目前在售的另一本 TensorFlow 书籍,由黄文坚所写的《TensorFlow实战》第6章讲解了关于四大经典 CNN 网络:AlexNetVGGNetGoogle Inception Net 和 ResNet 的基本原理。本文主要节选自作者《TensorFlow实战》第6章,关于这四大 CNN 网络实现方式可参考《TensorFlow实战》,其中有这几种网络的详细实现步骤。


2. 简介

四种经典的卷积神经网络,它们分别是:

NameRankTop-5LaysInstitutionAlexNetILSVRC 2012年冠军16.4%8层Toronto HintonVGGNetILSVRC 2014年亚军7.3%19层Oxford (Visual Geometry Group) and DeepmindGoogle Inception NetILSVRC 2014年冠军6.7%22层GoogleResNetILSVRC 2015年冠军3.57%152层Microsoft

这4个经典的网络都在各自的年代率先使用了很多先进的卷积神经网络结构,对卷积网络乃至深度学习有非常大的推动作用,也象征了卷积神经网络在2012—2015这四年间的快速发展。如上表所示,ILSVRC 的 top-5 错误率在最近几年取得重大突破,而主要的突破点都是在深度学习和卷积神经网络,成绩的大幅提升几乎都伴随着卷积神经网络的层数加深。


而传统机器学习算法目前在 ILSVRC 上已经难以追上深度学习的步伐了,以至于逐渐被称为浅层学习(Shallow Learning)。目前在 ImageNet 数据集上人眼能达到的错误率大概在5.1%,这还是经过了大量训练的专家能达到的成绩,一般人要区分1000种类型的图片是比较困难的。而 ILSVRC 2015年冠军——152层 ResNet 的成绩达到错误率3.57%,已经超过了人眼,这说明卷积神经网络已经基本解决了 ImageNe t数据集上的图片分类问题。


前面提到的计算机视觉比赛 ILSVRC 使用的数据都来自 ImageNet,如下图所示。ImageNet 项目于2007年由斯坦福大学华人教授李飞飞创办,目标是收集大量带有标注信息的图片数据供计算机视觉模型训练。ImageNet 拥有1500万张标注过的高清图片,总共拥有22000类,其中约有100万张标注了图片中主要物体的定位边框。ImageNet 项目最早的灵感来自于人类通过视觉学习世界的方式,如果假定儿童的眼睛是生物照相机,他们平均每200ms就拍照一次(眼球转动一次的平均时间),那么3岁大时孩子就已经看过了上亿张真实世界的照片,可以算得上是一个非常大的数据集。ImageNet 项目下载了互联网上近10亿张图片,使用亚马逊的土耳其机器人平台实现众包的标注过程,有来自世界上167个国家的近5万名工作者帮忙一起筛选、标注。




每年度的 ILSVRC 比赛数据集中大概拥有120万张图片,以及1000类的标注,是 ImageNet 全部数据的一个子集。比赛一般采用 top-5 和 top-1 分类错误率作为模型性能的评测指标。


3. AlexNet

2012年,Hinton 的学生 Alex Krizhevsky 提出了深度卷积神经网络模型 AlexNet,它可以算是 LeNet 的一种更深更宽的版本。AlexNet 中包含了几个比较新的技术点,也首次在 CNN 中成功应用了 ReLU、Dropout 和 LRN 等Trick。同时 AlexNet 也使用了 GPU 进行运算加速,作者开源了他们在 GPU上 训练卷积神经网络的 CUDA 代码。


AlexNet 包含了6亿3000万个连接,6000万个参数和65万个神经元,拥有5个卷积层,其中3个卷积层后面连接了最大池化层,最后还有3个全连接层。AlexNet 以显著的优势赢得了竞争激烈的 ILSVRC 2012比赛,top-5 的错误率降低至了16.4%,相比第二名的成绩26.2%错误率有了巨大的提升。AlexNet 可以说是神经网络在低谷期后的第一次发声,确立了深度学习(深度卷积网络)在计算机视觉的统治地位,同时也推动了深度学习在语音识别、自然语言处理、强化学习等领域的拓展。


AlexNet 将 LeNet 的思想发扬光大,把 CNN 的基本原理应用到了很深很宽的网络中。AlexNet 主要使用到的新技术点如下:

  • 成功使用 ReLU 作为 CNN 的激活函数,并验证其效果在较深的网络超过了 Sigmoid,成功解决了 Sigmoid 在网络较深时的梯度弥散问题。虽然 ReLU 激活函数在很久之前就被提出了,但是直到 AlexNet 的出现才将其发扬光大。
  • 训练时使用 Dropout 随机忽略一部分神经元,以避免模型过拟合。Dropout 虽有单独的论文论述,但是 AlexNet 将其实用化,通过实践证实了它的效果。在 AlexNet 中主要是最后几个全连接层使用了 Dropout。
  • 在 CNN 中使用重叠的最大池化。此前 CNN 中普遍使用平均池化,AlexNet 全部使用最大池化,避免平均池化的模糊化效果。并且 AlexNet 中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
  • 提出了 LRN 层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
  • 使用 CUDA 加速深度卷积网络的训练,利用 GPU 强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet 使用了两块 GTX 580 GPU 进行训练,单个 GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将 AlexNet 分布在两个 GPU 上,在每个 GPU 的显存中储存一半的神经元的参数。因为 GPU 之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块 GPU 也是非常高效的。同时,AlexNet 的设计让 GPU 之间的通信只在网络的某些层进行,控制了通信的性能损耗。
  • 数据增强,随机地从256´256的原始图像中截取224´224大小的区域(以及水平翻转的镜像),相当于增加了(256-224)2´2=2048倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的 CNN 会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值。同时,AlexNet 论文中提到了会对图像的 RGB 数据进行 PCA 处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个 Trick 可以让错误率再下降1%。

关于 AlexNet 的网络结构这里不再介绍,详细可参考《Deep Learning-TensorFlow (3) CNN卷积神经网络_AlexNet前瞻》


4. VGGNet

VGGNet 是牛津大学计算机视觉组(Visual Geometry Group)Google DeepMind 公司的研究员一起研发的的深度卷积神经网络。


VGGNet 探索了卷积神经网络的深度与其性能之间的关系,通过反复堆叠3´3的小型卷积核2´2的最大池化层,VGGNet成功地构筑了16~19层深的卷积神经网络。VGGNet 相比之前 state-of-the-art 的网络结构,错误率大幅下降,并取得了 ILSVRC 2014 比赛分类项目的第2名和定位项目的第1名。同时 VGGNet 的拓展性很强,迁移到其他图片数据上的泛化性非常好。VGGNet 的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3´3)和最大池化尺寸(2´2)。


到目前为止,VGGNet 依然经常被用来提取图像特征(!!!)。VGGNet训练后的模型参数在其官方网站上开源了,可用来在 domain specific 的图像分类任务上进行再训练(相当于提供了非常好的初始化权重),因此被用在了很多地方。


VGGNet 论文中全部使用了3´3的卷积核和2´2的池化核,通过不断加深网络结构来提升性能。下图所示为 VGGNet 各级别的网络结构图,以及随后的每一级别的参数量,从11层的网络一直到19层的网络都有详尽的性能测试。虽然从A到E每一级网络逐渐变深,但是网络的参数量并没有增长很多,这是因为参数量主要都消耗在最后3个全连接层。前面的卷积部分虽然很深,但是消耗的参数量不大,不过训练比较耗时的部分依然是卷积,因其计算量比较大。这其中的D、E也就是我们常说的VGGNet-16VGGNet-19。C很有意思,相比B多了几个1´1的卷积层,1´1卷积的意义主要在于线性变换,而输入通道数和输出通道数不变,没有发生降维






VGGNet 拥有5段卷积,每一段内有2~3个卷积层,同时每段尾部会连接一个最大池化层用来缩小图片尺寸。每段内的卷积核数量一样,越靠后的段的卷积核数量越多:64 – 128 – 256 – 512 – 512。其中经常出现多个完全一样的3´3的卷积层堆叠在一起的情况,这其实是非常有用的设计。如下图所示,两个3´3的卷积层串联相当于1个5´5的卷积层,即一个像素会跟周围5´5的像素产生关联,可以说感受野大小为5´5。而3个3´3的卷积层串联的效果则相当于1个7´7的卷积层。除此之外,3个串联的3´3的卷积层,拥有比1个7´7的卷积层更少的参数量,只有后者的一半。最重要的是,3个3´3的卷积层拥有比1个7´7的卷积层更多的非线性变换(前者可以使用三次ReLU激活函数,而后者只有一次),使得CNN对特征的学习能力更强。


两个串联3´3的卷积层功能类似于一个5´5的卷积层


VGGNet 在训练时有一个小技巧,先训练级别A的简单网络,再复用A网络的权重来初始化后面的几个复杂模型,这样训练收敛的速度更快。在预测时,VGG 采用 Multi-Scale 的方法,将图像 scale 到一个尺寸 Q,并将图片输入卷积网络计算。然后在最后一个卷积层使用滑窗的方式进行分类预测,将不同窗口的分类结果平均,再将不同尺寸 Q的结果平均得到最后结果,这样可提高图片数据的利用率并提升预测准确率。同时在训练中,VGGNet 还使用了 Multi-Scale 的方法做数据增强,将原始图像缩放到不同尺寸S,然后再随机裁切224´224的图片,这样能增加很多数据量,对于防止模型过拟合有很不错的效果。实践中,作者令S在[256,512]这个区间内取值,使用 Multi-Scale 获得多个版本的数据,并将多个版本的数据合在一起进行训练。下图为 VGGNet 使用 Multi-Scale 训练时得到的结果,可以看到D和E都可以达到7.5%的错误率。最终提交到 ILSVRC 2014 的版本是仅使用 Single-Scale 的6个不同等级的网络与 Multi-Scale 的D网络的融合,达到了7.3%的错误率。不过比赛结束后作者发现只融合 Multi-Scale 的D和E可以达到更好的效果,错误率达到7.0%,再使用其他优化策略最终错误率可达到6.8%左右,非常接近同年的冠军 Google Inceptin Net。




5. InceptionNet V1

Google Inception Net 首次出现在 ILSVRC 2014 的比赛中(和 VGGNet 同年),就以较大优势取得了第一名。那届比赛中的 Inception Net 通常被称为 Inception V1,它最大的特点是控制了计算量和参数量的同时,获得了非常好的分类性能—— top-5 错误率6.67%,只有 AlexNet 的一半不到。Inception V1 有22层深,比 AlexNet 的8层或者 VGGNet 的19层还要更深。但其计算量只有15亿次浮点运算,同时只有500万的参数量,仅为AlexNet参数量(6000万)的1/12,却可以达到远胜于AlexNet的准确率,可以说是非常优秀并且非常实用的模型。


Inception V1 降低参数量的目的有两点:

第一,参数越多模型越庞大,需要供模型学习的数据量就越大,而目前高质量的数据非常昂贵;

第二,参数越多,耗费的计算资源也会更大。


Inception V1 参数少但效果好的原因除了模型层数更深、表达能力更强外,还有两点:

一是去除了最后的全连接层,用全局平均池化层(即将图片尺寸变为1´1)来取代它。全连接层几乎占据了 AlexNet 或 VGGNet 中90%的参数量,而且会引起过拟合,去除全连接层后模型训练更快并且减轻了过拟合。用全局平均池化层取代全连接层的做法借鉴了 Network In Network(以下简称 NIN )论文。


Network In Network

二是Inception V1中精心设计的 Inception Module 提高了参数的利用效率,其结构如下图所示。这一部分也借鉴了 NIN 的思想,形象的解释就是 Inception Module 本身如同大网络中的一个小网络,其结构可以反复堆叠在一起形成大网络。不过 Inception V1 比 NIN 更进一步的是增加了分支网络,NIN 则主要是级联的卷积层和MLPConv 层,如上图。一般来说卷积层要提升表达能力,主要依靠增加输出通道数,但副作用是计算量增大和过拟合。每一个输出通道对应一个滤波器,同一个滤波器共享参数,只能提取一类特征,因此一个输出通道只能做一种特征处理。而 NIN 中的 MLPConv 则拥有更强大的能力,允许在输出通道之间组合信息,因此效果明显。可以说,MLPConv 基本等效于普通卷积层后再连接1´1的卷积和ReLU激活函数,最后一层的每一个 Feature Map 做全局平均池化得到 Softmax 的一个向量值。

Inception Module


我们再来看 Inception Module 的基本结构,其中有4个分支:第一个分支对输入进行1´1的卷积,这其实也是 NIN 中提出的一个重要结构。1´1的卷积是一个非常优秀的结构,它可以跨通道组织信息,提高网络的表达能力,同时可以对输出通道升维和降维。可以看到 Inception Module 的4个分支都用到了1´1卷积,来进行低成本(计算量比3´3小很多)的跨通道的特征变换。第二个分支先使用了1´1卷积,然后连接3´3卷积,相当于进行了两次特征变换。第三个分支类似,先是1´1的卷积,然后连接5´5卷积。最后一个分支则是3´3最大池化后直接使用1´1卷积。我们可以发现,有的分支只使用1´1卷积,有的分支使用了其他尺寸的卷积时也会再使用1´1卷积,这是因为1´1卷积的性价比很高,用很小的计算量就能增加一层特征变换和非线性化。Inception Module 的4个分支在最后通过一个聚合操作合并(在输出通道数这个维度上聚合,在 TensorFlow 中使用tf.concat(3, [], []) 函数可以实现矩阵合并)Inception Module 中包含了3种不同尺寸的卷积和1个最大池化,增加了网络对不同尺度的适应性,这一部分和 Multi-Scale 的思想类似。早期计算机视觉的研究中,受灵长类神经视觉系统的启发,Serre 使用不同尺寸的 Gabor 滤波器处理不同尺寸的图片,Inception V1 借鉴了这种思想。Inception V1 的论文中指出,Inception Module 可以让网络的深度和宽度高效率地扩充,提升准确率且不致于过拟合。


人脑神经元的连接是稀疏的,因此研究者认为大型神经网络的合理的连接方式应该也是稀疏的。稀疏结构是非常适合神经网络的一种结构,尤其是对非常大型、非常深的神经网络,可以减轻过拟合并降低计算量,例如卷积神经网络就是稀疏的连接。Inception Net 的主要目标就是找到最优的稀疏结构单元(即 Inception Module ),论文中提到其稀疏结构基于 Hebbian 原理,这里简单解释一下 Hebbian 原理:


神经反射活动的持续与重复会导致神经元连接稳定性的持久提升,当两个神经元细胞A和B距离很近,并且A参与了对B重复、持续的兴奋,那么某些代谢变化会导致A将作为能使B兴奋的细胞。


总结一下即“一起发射的神经元会连在一起”(Cells that fire together, wire together),学习过程中的刺激会使神经元间的突触强度增加。受 Hebbian 原理启发,另一篇文章 Provable Bounds for Learning Some Deep Representations 提出,如果数据集的概率分布可以被一个很大很稀疏的神经网络所表达,那么构筑这个网络的最佳方法是逐层构筑网络:将上一层高度相关(correlated)的节点聚类,并将聚类出来的每一个小簇(cluster)连接到一起。这个相关性高的节点应该被连接在一起的结论,即是从神经网络的角度对 Hebbian 原理有效性的证明。


在 Inception Module 中,通常1´1卷积的比例(输出通道数占比)最高,3´3卷积和5´5卷积稍低。而在整个网络中,会有多个堆叠的 Inception Module,我们希望靠后的Inception Module 可以捕捉更高阶的抽象特征,因此靠后的 Inception Module 的卷积的空间集中度应该逐渐降低,这样可以捕获更大面积的特征。因此,越靠后的Inception Module中,3´3和5´5这两个大面积的卷积核的占比(输出通道数)应该更多。


Inception Net 有22层深,除了最后一层的输出,其中间节点的分类效果也很好。因此在 Inception Net 中,还使用到了辅助分类节点(auxiliary classifiers),即将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中。这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个Inception Net 的训练很有裨益。


当年的 Inception V1 还是跑在 TensorFlow 的前辈 DistBelief 上的,并且只运行在 CPU 上。当时使用了异步的 SGD 训练,学习速率每迭代8个 epoch 降低4%。同时, Inception V1 也使用了 Multi-Scale、Multi-Crop 等数据增强方法,并在不同的采样数据上训练了7个模型进行融合,得到了最后的 ILSVRC 2014 的比赛成绩—— top-5 错误率6.67%

0 0
原创粉丝点击