from http://blog.jobbole.com/113819/?utm_source=blog.jobbole.com&utm_medium=relatedPostsphp
卷积神经网络(也称做 ConvNets 或 CNN)是神经网络的一种,它在图像识别和分类等领域已被证实很是有效。 卷积神经网络除了为机器人和自动驾驶汽车的视觉助力以外,还能够成功识别人脸,物体和交通标志。html
图1python
如图1所示,卷积神经网络可以识别图片的场景而且提供相关标题(“足球运动员正在踢足球”),图2则是利用卷积神经网络识别平常物品、人类和动物的例子。最近,卷积神经网络在一些天然语言处理任务(如语句分类)中也发挥了很大做用。git
图2github
所以,卷积神经网络是当今大多数机器学习实践者的重要工具。可是,理解卷积神经网络并开始尝试运用着实是一个痛苦的过程。本文的主要目的是了解卷积神经网络如何处理图像。web
对于刚接触神经网络的人,我建议你们先阅读这篇关于多层感知机的简短教程 ,了解其工做原理以后再继续阅读本文。多层感知机即本文中的“彻底链接层”。网络
LeNet 是最先推进深度学习领域发展的卷积神经网络之一。这项由 Yann LeCun 完成的开创性工做自1988年以来屡次成功迭代以后被命名为 LeNet5。当时 LeNet 框架主要用于字符识别任务,例如阅读邮政编码,数字等。框架
接下来,咱们将直观地了解 LeNet 框架如何学习识别图像。 近年来有人提出了几种基于 LeNet 改进的新框架,可是它们的基本思路与 LeNet 并没有差异,若是您清楚地理解了 LeNet,那么对这些新的框架理解起来就相对容易不少。机器学习
图3中的卷积神经网络在结构上与原始的 LeNet 相似,并将输入图像分为四类:狗,猫,船或鸟(原始的 LeNet 主要用于字符识别任务)。 从上图能够看出,接收船只图像做为输入时,神经网络在四个类别中正确地给船只分配了最高几率值(0.94)。输出层中全部几率的总和应该是1(以后会作解释)。
图3 的卷积神经网络中有四个主要操做:
这些操做是全部卷积神经网络的基本组成部分,所以了解它们的工做原理是理解卷积神经网络的重要步骤。下面咱们将尝试直观地理解每一个操做。
实质上,每张图片均可以表示为由像素值组成的矩阵。
图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所示,每次卷积以后,都进行了另外一项称为 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]。具体来讲有如下四点:
图13
目前为止,咱们已经了解了卷积,ReLU 和池化的工做原理。这些是卷积神经网络的基本组成部分,理解这一点很重要。如图13所示,咱们有两个由卷积,ReLU 和 Pooling 组成的中间层 —— 第二个卷积层使用六个过滤器对第一层的输出执行卷积,生成六个特征映射。而后将 ReLU 分别应用于这六个特征映射。接着,咱们对六个修正特征映射分别执行最大池化操做。
这两个中间层的做用都是从图像中提取有用的特征,在网络中引入非线性因素,同时对特征降维并使其在尺度和平移上等变[18]。
第二个池化层的输出即彻底链接层的输入,咱们将在下一节讨论。
彻底链接层是一个传统的多层感知器,它在输出层使用 softmax 激活函数(也可使用其余分类器,好比 SVM,但在本文只用到了 softmax)。“彻底链接”这个术语意味着前一层中的每一个神经元都链接到下一层的每一个神经元。 若是对多层感知器不甚了解,我建议您阅读这篇文章。
卷积层和池化层的输出表明了输入图像的高级特征。彻底链接层的目的是利用这些基于训练数据集获得的特征,将输入图像分为不一样的类。例如,咱们要执行的图像分类任务有四个可能的输出,如图14所示(请注意,图14没有展现出彻底链接层中节点之间的链接)
图14: 彻底链接层——每一个节点都与相邻层的其余节点链接
除分类以外,添加彻底链接层也是一个(一般来讲)比较简单的学习这些特征非线性组合的方式。卷积层和池化层获得的大部分特征对分类的效果可能也不错,但这些特征的组合可能会更好[11]。
彻底链接层的输出几率之和为1。这是由于咱们在彻底链接层的输出层使用了 softmax 激活函数。Softmax 函数取任意实数向量做为输入,并将其压缩到数值在0到1之间,总和为1的向量。
如上所述,卷积+池化层用来从输入图像提取特征,彻底链接层用来作分类器。
注意,在图15中,因为输入图像是船,对于船类目标几率为1,其余三个类为0
图15:训练卷积神经网络
卷积网络的总体训练过程归纳以下:
经过以上步骤就能够训练出卷积神经网络 —— 这实际上意味着卷积神经网络中的全部权重和参数都已通过优化,能够对训练集中的图像进行正确分类。
当咱们给卷积神经网络中输入一个新的(未见过的)图像时,网络会执行前向传播步骤并输出每一个类的几率(对于新图像,计算输出几率所用的权重是以前优化过,并可以对训练集彻底正确分类的)。若是咱们的训练集足够大,神经网络会有很好的泛化能力(希望如此)并将新图片分到正确的类里。
注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)层:
注意,在图20中,输出层的10个节点每个都链接到第二个彻底链接层中的所有100个节点(所以称为彻底链接)。
另外,注意为何输出层中惟一明亮的节点是’8’ —— 这意味着神经网络对咱们的手写数字进行了正确分类(节点亮度越高表示它的输出更高,即8在全部数字中具备最高的几率)。
图20:彻底链接层可视化
该可视化系统的 3D 版本在此。
卷积神经网络始于20世纪90年代初。咱们已经讨论了LeNet,它是最先的卷积神经网络之一。下面列出了其余一些有影响力的神经网络框架 [3] [4]。
本文中,我尝试着用一些简单的术语解释卷积神经网络背后的主要概念,同时简化/略过了几个细节部分,但我但愿这篇文章可以让你直观地理解其工做原理。
本文最初是受 Denny Britz 《理解卷积神经网络在天然语言处理上的运用》这篇文章的启发(推荐阅读),文中的许多解释是基于这篇文章的。为了更深刻地理解其中一些概念,我鼓励您阅读斯坦福大学卷积神经网络课程的笔记以及一下参考资料中提到的其余很棒的资源。若是您对上述概念的理解遇到任何问题/建议,请随时在下面留言。
文中所使用的全部图像和动画均属于其各自的做者,陈列以下。
图13,第二次作卷积的时候,是对第一次的结果应用6个过滤器吗?那第二次卷积以后是否是应该有3*6 = 18个特征映射啊?
在原文博客评论区找到了上面问题的解答,第二次作卷积的时候,对每一个过滤器,把第一次的3个映射作某种处理结合成1个,而后对这1个进行卷积。 详细可见 论文 http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf 中table1及周围的说明