卷积神经网络(CNN)

from  http://blog.jobbole.com/113819/?utm_source=blog.jobbole.com&utm_medium=relatedPostsphp

 

什么是卷积神经网络,它为什么重要?

卷积神经网络(也称做 ConvNets 或 CNN)是神经网络的一种,它在图像识别和分类等领域已被证实很是有效。 卷积神经网络除了为机器人和自动驾驶汽车的视觉助力以外,还能够成功识别人脸,物体和交通标志。html

图1python

图1所示,卷积神经网络可以识别图片的场景而且提供相关标题(“足球运动员正在踢足球”),图2则是利用卷积神经网络识别平常物品、人类和动物的例子。最近,卷积神经网络在一些天然语言处理任务(如语句分类)中也发挥了很大做用。git

图2github

所以,卷积神经网络是当今大多数机器学习实践者的重要工具。可是,理解卷积神经网络并开始尝试运用着实是一个痛苦的过程。本文的主要目的是了解卷积神经网络如何处理图像。web

对于刚接触神经网络的人,我建议你们先阅读这篇关于多层感知机的简短教程 ,了解其工做原理以后再继续阅读本文。多层感知机即本文中的“彻底链接层”。网络

LeNet 框架(20世纪90年代)

LeNet 是最先推进深度学习领域发展的卷积神经网络之一。这项由 Yann LeCun 完成的开创性工做自1988年以来屡次成功迭代以后被命名为 LeNet5。当时 LeNet 框架主要用于字符识别任务,例如阅读邮政编码,数字等。框架

接下来,咱们将直观地了解 LeNet 框架如何学习识别图像。 近年来有人提出了几种基于 LeNet 改进的新框架,可是它们的基本思路与 LeNet 并没有差异,若是您清楚地理解了 LeNet,那么对这些新的框架理解起来就相对容易不少。机器学习

图3: 一个简单的卷积神经网络ide

3中的卷积神经网络在结构上与原始的 LeNet 相似,并将输入图像分为四类:狗,猫,船或鸟(原始的 LeNet 主要用于字符识别任务)。 从上图能够看出,接收船只图像做为输入时,神经网络在四个类别中正确地给船只分配了最高几率值(0.94)。输出层中全部几率的总和应该是1(以后会作解释)。

的卷积神经网络中有四个主要操做:

  1. 卷积
  2. 非线性变换(ReLU)
  3. 池化或子采样
  4. 分类(彻底链接层)

这些操做是全部卷积神经网络的基本组成部分,所以了解它们的工做原理是理解卷积神经网络的重要步骤。下面咱们将尝试直观地理解每一个操做。

一张图片就是一个由像素值组成的矩阵

实质上,每张图片均可以表示为由像素值组成的矩阵。

图4: 每张图片就是一个像素矩阵

通道(channel)是一个传统术语,指图像的一个特定成分。标准数码相机拍摄的照片具备三个通道——红,绿和蓝——你能够将它们想象为三个堆叠在一块儿的二维矩阵(每种颜色一个),每一个矩阵的像素值都在0到255之间。

灰度图像只有一个通道。 鉴于本文的科普目的,咱们只考虑灰度图像,即一个表明图像的二维矩阵。矩阵中每一个像素值的范围在0到255之间——0表示黑色,255表示白色。

卷积

卷积神经网络的名字来源于“卷积”运算。在卷积神经网络中,卷积的主要目的是从输入图像中提取特征。经过使用输入数据中的小方块来学习图像特征,卷积保留了像素间的空间关系。咱们在这里不会介绍卷积的数学推导,但会尝试理解它是如何处理图像的。

正如前文所说,每一个图像能够被看作像素值矩阵。考虑一个像素值仅为0和1的5 × 5大小的图像(注意,对于灰度图像,像素值范围从0到255,下面的绿色矩阵是像素值仅为0和1的特殊状况):

另外,考虑另外一个 3×3 矩阵,以下图所示:

上述5 x 5图像和3 x 3矩阵的卷积计算过程如5中的动画所示:

图5:卷积操做。输出矩阵称做“卷积特征”或“特征映射”

咱们来花点时间理解一下上述计算是如何完成的。将橙色矩阵在原始图像(绿色)上以每次1个像素的速率(也称为“步幅”)移动,对于每一个位置,计算两个矩阵相对元素的乘积并相加,输出一个整数并做为最终输出矩阵(粉色)的一个元素。注意,3 × 3矩阵每一个步幅仅能“看到”输入图像的一部分。

在卷积神经网路的术语中,这个3 × 3矩阵被称为“过滤器”或“核”或“特征探测器”,经过在图像上移动过滤器并计算点积获得的矩阵被称为“卷积特征”或“激活映射”或“特征映射”。重要的是要注意,过滤器的做用就是原始输入图像的特征检测器。

从上面的动画能够明显看出,对于同一张输入图像,不一样的过滤器矩阵将会产生不一样的特征映射。例如,考虑以下输入图像:

在下表中,咱们能够看到上图在不一样过滤器下卷积的效果。如图所示,只需在卷积运算前改变过滤器矩阵的数值就能够执行边缘检测,锐化和模糊等不一样操做 [8] —— 这意味着不一样的过滤器能够检测图像的不一样特征,例如边缘, 曲线等。更多此类示例可在 这里 8.2.4节中找到。

另外一个理解卷积操做的好方法能够参考下面6中的动画:

图6: 卷积操做

一个过滤器(红色边框)在输入图像上移动(卷积操做)以生成特征映射。在同一张图像上,另外一个过滤器(绿色边框)的卷积生成了不一样的特征图,如图所示。须要注意到,卷积操做捕获原始图像中的局部依赖关系很重要。还要注意这两个不一样的过滤器如何从同一张原始图像获得不一样的特征图。请记住,以上图像和两个过滤器只是数值矩阵。

实际上,卷积神经网络在训练过程当中会本身学习这些过滤器的值(尽管在训练过程以前咱们仍须要指定诸如过滤器数目、大小,网络框架等参数)。咱们拥有的过滤器数目越多,提取的图像特征就越多,咱们的网络在识别新图像时效果就会越好。

特征映射(卷积特征)的大小由咱们在执行卷积步骤以前须要决定的三个参数[4]控制:

  • 深度:深度对应于咱们用于卷积运算的过滤器数量。在7所示的网络中,咱们使用三个不一样的过滤器对初始的船图像进行卷积,从而生成三个不一样的特征图。能够将这三个特征地图视为堆叠的二维矩阵,所以,特征映射的“深度”为3。

图7

  • 步幅:步幅是咱们在输入矩阵上移动一次过滤器矩阵的像素数量。当步幅为1时,咱们一次将过滤器移动1个像素。当步幅为2时,过滤器每次移动2个像素。步幅越大,生成的特征映射越小。
  • 零填充:有时,将输入矩阵边界用零来填充会很方便,这样咱们能够将过滤器应用于输入图像矩阵的边界元素。零填充一个很好的特性是它容许咱们控制特征映射的大小。添加零填充也称为宽卷积,而不使用零填充是为窄卷积。 这在[14]中有清楚的解释。

非线性部分介绍(ReLU)

如上文3所示,每次卷积以后,都进行了另外一项称为 ReLU 的操做。ReLU 全称为修正线性单元(Rectified Linear Units),是一种非线性操做。 其输出以下图所示:

图8: ReLU 函数

ReLU 是一个针对元素的操做(应用于每一个像素),并将特征映射中的全部负像素值替换为零。ReLU 的目的是在卷积神经网络中引入非线性因素,由于在实际生活中咱们想要用神经网络学习的数据大多数都是非线性的(卷积是一个线性运算 —— 按元素进行矩阵乘法和加法,因此咱们但愿经过引入 ReLU 这样的非线性函数来解决非线性问题)。

9能够很清楚地理解 ReLU 操做。它展现了将 ReLU 做用于6中某个特征映射获得的结果。这里的输出特征映射也被称为“修正”特征映射。

图9: ReLU 操做

其余非线性函数诸如 tanh 或 sigmoid 也能够用来代替 ReLU,可是在大多数状况下,ReLU 的表现更好。

池化

空间池化(也称为子采样或下采样)可下降每一个特征映射的维度,并保留最重要的信息。空间池化有几种不一样的方式:最大值,平均值,求和等。

在最大池化的状况下,咱们定义一个空间邻域(例如,一个2 × 2窗口),并取修正特征映射在该窗口内最大的元素。固然咱们也能够取该窗口内全部元素的平均值(平均池化)或全部元素的总和。在实际运用中,最大池化的表现更好。

10展现了经过2 × 2窗口在修正特征映射(卷积+ ReLU 操做后获得)上应用最大池化操做的示例。

图10: 最大池化

咱们将2 x 2窗口移动2个单元格(也称为“步幅”),并取每一个区域中的最大值。如10所示,这样就下降了特征映射的维度。

11所示的网络中,池化操做分别应用于每一个特征映射(所以,咱们从三个输入映射中获得了三个输出映射)。

图11: 在修正特征映射上应用池化

12展现了咱们对9中通过 ReLU 操做以后获得的修正特征映射应用池化以后的效果。

图12: 池化

池化的做用是逐步减小输入的空间大小[4]。具体来讲有如下四点:

  • 使输入(特征维度)更小,更易于管理
  • 减小网络中的参数和运算次数,所以能够控制过拟合 [4]
  • 使网络对输入图像微小的变换、失真和平移更加稳健(输入图片小幅度的失真不会改池化的输出结果 —— 由于咱们取了邻域的最大值/平均值)。
  • 能够获得尺度几乎不变的图像(确切的术语是“等变”)。这是很是有用的,这样不管图片中的物体位于何处,咱们均可以检测到,(详情参阅[18]和[19])。

至此…

图13

目前为止,咱们已经了解了卷积,ReLU 和池化的工做原理。这些是卷积神经网络的基本组成部分,理解这一点很重要。如13所示,咱们有两个由卷积,ReLU 和 Pooling 组成的中间层 —— 第二个卷积层使用六个过滤器对第一层的输出执行卷积,生成六个特征映射。而后将 ReLU 分别应用于这六个特征映射。接着,咱们对六个修正特征映射分别执行最大池化操做。

这两个中间层的做用都是从图像中提取有用的特征,在网络中引入非线性因素,同时对特征降维并使其在尺度和平移上等变[18]。

第二个池化层的输出即彻底链接层的输入,咱们将在下一节讨论。

彻底链接层

彻底链接层是一个传统的多层感知器,它在输出层使用 softmax 激活函数(也可使用其余分类器,好比 SVM,但在本文只用到了 softmax)。“彻底链接”这个术语意味着前一层中的每一个神经元都链接到下一层的每一个神经元。 若是对多层感知器不甚了解,我建议您阅读这篇文章

卷积层和池化层的输出表明了输入图像的高级特征。彻底链接层的目的是利用这些基于训练数据集获得的特征,将输入图像分为不一样的类。例如,咱们要执行的图像分类任务有四个可能的输出,如14所示(请注意,图14没有展现出彻底链接层中节点之间的链接)

图14: 彻底链接层——每一个节点都与相邻层的其余节点链接

除分类以外,添加彻底链接层也是一个(一般来讲)比较简单的学习这些特征非线性组合的方式。卷积层和池化层获得的大部分特征对分类的效果可能也不错,但这些特征的组合可能会更好[11]。

彻底链接层的输出几率之和为1。这是由于咱们在彻底链接层的输出层使用了 softmax 激活函数。Softmax 函数取任意实数向量做为输入,并将其压缩到数值在0到1之间,总和为1的向量。

正式开始——使用反向传播进行训练

如上所述,卷积+池化层用来从输入图像提取特征,彻底链接层用来作分类器。

注意,在15中,因为输入图像是船,对于船类目标几率为1,其余三个类为0

  • 输入图像 = 船
  • 目标向量 = [0, 0, 1, 0]

图15:训练卷积神经网络

卷积网络的总体训练过程归纳以下:

  • 步骤1:用随机值初始化全部过滤器和参数/权重
  • 步骤2:神经网络将训练图像做为输入,通过前向传播步骤(卷积,ReLU 和池化操做以在彻底链接层中的前向传播),获得每一个类的输出几率。
  • 假设上面船只图像的输出几率是 [0.2,0.4,0.1,0.3]
  • 因为权重是随机分配给第一个训练样本,所以输出几率也是随机的。
  • 步骤3:计算输出层的总偏差(对全部4个类进行求和)
  • 总偏差=∑ ½(目标几率 – 输出几率)²
  • 步骤4:使用反向传播计算网络中全部权重的偏差梯度,并使用梯度降低更新全部过滤器值/权重和参数值,以最小化输出偏差。
  • 根据权重对总偏差的贡献对其进行调整。
  • 当再次输入相同的图像时,输出几率可能就变成了 [0.1,0.1,0.7,0.1],这更接近目标向量 [0,0,1,0]。
  • 这意味着网络已经学会了如何经过调整其权重/过滤器并减小输出偏差的方式对特定图像进行正确分类。
  • 过滤器数量、大小,网络结构等参数在步骤1以前都已经固定,而且在训练过程当中不会改变 —— 只会更新滤器矩阵和链接权值。
  • 步骤5:对训练集中的全部图像重复步骤2-4。

 

经过以上步骤就能够训练出卷积神经网络 —— 这实际上意味着卷积神经网络中的全部权重和参数都已通过优化,能够对训练集中的图像进行正确分类。

当咱们给卷积神经网络中输入一个新的(未见过的)图像时,网络会执行前向传播步骤并输出每一个类的几率(对于新图像,计算输出几率所用的权重是以前优化过,并可以对训练集彻底正确分类的)。若是咱们的训练集足够大,神经网络会有很好的泛化能力(希望如此)并将新图片分到正确的类里。

注1为了给你们提供一个直观的训练过程,上述步骤已经简化了不少,而且忽略了数学推导过程。若是想要数学推导以及对卷积神经网络透彻的理解,请参阅 [4] 和 [12]。

2上面的例子中,咱们使用了两组交替的卷积和池化层。但请注意,这些操做能够在一个卷积神经网络中重复执行屡次。实际上,如今效果最好的一些卷积神经网络都包含几十个卷积和池化层! 另外,每一个卷积层以后的池化层不是必需的。从下面的16中能够看出,在进行池化操做以前,咱们能够连续进行多个卷积 + ReLU 操做。另外请注意图16卷积神经网络的每一层是如何展现的。

图16

卷积神经网络的可视化

通常来讲,卷积步骤越多,神经网络可以学习识别的特征就更复杂。例如,在图像分类中,卷积神经网络在第一层可能会学习检测原始像素的边缘,而后在第二层利用这些边缘检测简单形状,而后在更高级的层用这些形状来检测高级特征,例如面部形状 [14]。17演示了这个过程 —— 这些特征是使用卷积深度信念网络学习的,这张图片只是为了演示思路(这只是一个例子:实际上卷积过滤器识别出来的对象可能对人来讲并无什么意义)。

图17: 卷积深度信念网络学习特征

Adam Harley 建立了一个基于 MNIST 手写数字数据集 [13]训练卷积神经网络的可视化。我强烈推荐你们 使用它来了解卷积神经网络的工做细节。

咱们在下图中能够看到神经网络对于输入数字“8”的具体操做细节。请注意,18中并未单独显示ReLU操做。

图18:基于手写数字训练卷积神经网络的可视化

输入图像包含 1024 个像素点(32 × 32 图像),第一个卷积层(卷积层1)由六个不一样的5 × 5(步幅为1)过滤器与输入图像卷积而成。如图所示,使用六个不一样的过滤器获得深度为六的特征映射。

卷积层1以后是池化层1,它在卷积层1中的六个特征映射上分别进行2 × 2最大池化(步幅为2)。将鼠标指针移动到池化层的任意像素上,能够观察到它来自于2 x 2网格在前一个卷积层中的做用(如19所示)。注意到2 x 2网格中具备最大值(最亮的那个)的像素点会被映射到池化层。

图19:池化操做可视化

池化层1以后是十六个执行卷积操做的5 × 5(步幅为1)卷积过滤器。而后是执行2 × 2最大池化(步幅为2)的池化层2。 这两层的做用与上述相同。

而后有三个彻底链接(FC)层:

  • 第一个FC层中有120个神经元
  • 第二个FC层中有100个神经元
  • 第三个FC层中的10个神经元对应于10个数字 —— 也称为输出层

注意,在20中,输出层的10个节点每个都链接到第二个彻底链接层中的所有100个节点(所以称为彻底链接)。

另外,注意为何输出层中惟一明亮的节点是’8’ —— 这意味着神经网络对咱们的手写数字进行了正确分类(节点亮度越高表示它的输出更高,即8在全部数字中具备最高的几率)。

图20:彻底链接层可视化

该可视化系统的 3D 版本在此

其余卷积神经网络框架

卷积神经网络始于20世纪90年代初。咱们已经讨论了LeNet,它是最先的卷积神经网络之一。下面列出了其余一些有影响力的神经网络框架 [3] [4]。

  • LeNet (20世纪90年代)本文已详述。
  • 20世纪90年代到2012年:从20世纪90年代后期到2010年初,卷积神经网络正处于孵化期。随着愈来愈多的数据和计算能力的提高,卷积神经网络能够解决的任务变得愈来愈有趣。
  • AlexNet(2012 – 2012年,Alex Krizhevsky(和其余人)发布了 AlexNet,它是提高了深度和广度版本的 LeNet,并在2012年以巨大优点赢得了 ImageNet 大规模视觉识别挑战赛(ILSVRC)。这是基于以前方法的重大突破,目前 CNN 的普遍应用都要归功于 AlexNet。
  • ZF Net(2013 – 2013年 ILSVRC 获奖者来自 Matthew Zeiler 和 Rob Fergus 的卷积网络。它被称为 ZFNet(Zeiler 和 Fergus Net 的简称)。它在 AlexNet 的基础上经过调整网络框架超参数对其进行了改进。
  • GoogLeNet2014 – 2014年 ILSVRC 获奖者是 Google 的 Szegedy 等人的卷积网络。其主要贡献是开发了一个初始模块,该模块大大减小了网络中的参数数量(4M,而 AlexNet 有60M)。
  • VGGNet2014 – 2014年 ILSVRC 亚军是名为 VGGNet 的网络。其主要贡献在于证实了网络深度(层数)是影响性能的关键因素。
  • ResNets2015 – 何凯明(和其余人)开发的残差网络是2015年 ILSVRC 的冠军。ResNets 是迄今为止最早进的卷积神经网络模型,而且是你们在实践中使用卷积神经网络的默认选择(截至2016年5月)。
  • DenseNet20168月) – 最近由黄高等人发表,密集链接卷积网络的每一层都之前馈方式直接链接到其余层。 DenseNet 已经在五项竞争激烈的对象识别基准测试任务中证实本身比以前最早进的框架有了显着的改进。具体实现请参考这个网址

结论

本文中,我尝试着用一些简单的术语解释卷积神经网络背后的主要概念,同时简化/略过了几个细节部分,但我但愿这篇文章可以让你直观地理解其工做原理。

本文最初是受 Denny Britz 《理解卷积神经网络在天然语言处理上的运用》这篇文章的启发(推荐阅读),文中的许多解释是基于这篇文章的。为了更深刻地理解其中一些概念,我鼓励您阅读斯坦福大学卷积神经网络课程笔记以及一下参考资料中提到的其余很棒的资源。若是您对上述概念的理解遇到任何问题/建议,请随时在下面留言。

文中所使用的全部图像和动画均属于其各自的做者,陈列以下。

参考

  1. karpathy/neuraltalk2: Efficient Image Captioning code in Torch, Examples
  2. Shaoqing Ren, et al, “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”, 2015, arXiv:1506.01497
  3. Neural Network Architectures, Eugenio Culurciello’s blog
  4. CS231n Convolutional Neural Networks for Visual Recognition, Stanford
  5. Clarifai/Technology
  6. Machine Learning is Fun! Part 3: Deep Learning and Convolutional Neural Networks
  7. Feature extraction using convolution, Stanford
  8. Wikipedia article on Kernel (image processing)
  9. Deep Learning Methods for Vision, CVPR 2012 Tutorial
  10. Neural Networks by Rob Fergus, Machine Learning Summer School 2015
  11. What do the fully connected layers do in CNNs?
  12. Convolutional Neural Networks, Andrew Gibiansky
  13. W. Harley, “An Interactive Node-Link Visualization of Convolutional Neural Networks,” in ISVC, pages 867-877, 2015 (link). Demo
  14. Understanding Convolutional Neural Networks for NLP
  15. Backpropagation in Convolutional Neural Networks
  16. A Beginner’s Guide To Understanding Convolutional Neural Networks
  17. Vincent Dumoulin, et al, “A guide to convolution arithmetic for deep learning”, 2015, arXiv:1603.07285
  18. What is the difference between deep learning and usual machine learning?
  19. How is a convolutional neural network able to learn invariant features?
  20. A Taxonomy of Deep Convolutional Neural Nets for Computer Vision
  21. Honglak Lee, et al, “Convolutional Deep Belief Networks for Scalable Unsupervised Learning of Hierarchical Representations” (link)

图13,第二次作卷积的时候,是对第一次的结果应用6个过滤器吗?那第二次卷积以后是否是应该有3*6 = 18个特征映射啊?

在原文博客评论区找到了上面问题的解答,第二次作卷积的时候,对每一个过滤器,把第一次的3个映射作某种处理结合成1个,而后对这1个进行卷积。 详细可见 论文 http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf 中table1及周围的说明

相关文章
相关标签/搜索