赞
踩
卷积神经网络(ConvNets或CNNs)是一类在图像识别和分类等领域非常有效的神经网络。除了增强机器人和自动驾驶汽车的视觉功能外,ConvNets还成功地被用于人脸、物体和交通标志的识别。
在上面的图1中,ConvNet能够识别场景,系统能够提示相关的说明(“一个足球运动员正在踢足球”),而图2显示了一个ConvNet用于识别日常对象、人和动物的示例。最近,ConvNets在一些自然语言处理任务(如句子分类)中也很有效。
因此,ConvNets是当今大多数机器学习实践者的重要工具。然而,第一次理解并学习使用ConvNets有时可能是一种令人生畏的经历。这篇文章的主要目的是帮助初学者理解卷积神经网络如何处理图像的。
如果你是神经网络的新手,我建议你在继续学习之前,先阅读一下这篇关于多层感知机的简短教程,了解一下它们是如何工作的。在这篇文章中,多层感知机被称为“全连接层”。
LeNet是最早推动深度学习领域的卷积神经网络之一。Yann LeCun的这项开创性工作被命名为LeNet-5,这是在1988年[3]之后的多次成功迭代之后命名的。当时,LeNet体系结构主要用于字符识别任务,如读取邮政编码、数字等。
下面,我们将对LeNet架构如何学习识别图像进行直观了解。近年来提出了一些新的体系结构,它们都是对LeNet的改进,但它们都使用了LeNet的主要概念,如果你对LeNet已经有清晰的理解,则相对更容易理解。
图3中的卷积神经网络在结构上与原始的LeNet相似,将输入图像分为四类:狗、猫、船或鸟(原始的LeNet主要用于字符识别任务)。从上图可以看出,当接收到一个船的图像作为输入时,该网络正确地为船分配了四个类别中最高的概率(0.94)。输出层中所有概率的总和应该是1(在本文后面解释)。
在上图3所示的ConvNet中有四个主要操作:
这些操作是每个卷积神经网络的基本构件,因此了解这些操作的工作原理是发展对卷积神经网络的良好理解的重要一步。我们将在下面尝试理解每个操作背后的原理。
本质上来说,每个图像都可以表示为像素值矩阵。
通道是一个常规术语,用来指代图像的某个组成部分。一个标准数码相机的图像有三个通道——红、绿、蓝——你可以把它们想象成三个2D矩阵堆叠在一起(每种颜色一个),每个像素值在0到255之间。
另一方面,灰度图像只有一个通道。出于这篇文章的目的,我们将只考虑灰度图像,因此我们将有一个表示图像的单一2D矩阵。矩阵中每个像素的值范围从0到255,0表示黑色,255表示白色。
卷积神经网络得名于“卷积”运算符。卷积的主要目的是从输入图像中提取特征。卷积通过使用输入数据的小方块学习图像特征,来保持像素之间的空间关系。我们将不在这里讨论卷积的数学细节,但会尝试了解卷积在图像上的工作原理。
如前所述,每个图像都可以看作是像素值的矩阵。考虑一个像素值只有0和1的5×5图像(注意,对于灰度图像,像素值的范围是0到255,下面的绿色矩阵是像素值只有0和1的特殊情况):
此外,考虑另一个3×3矩阵如下所示:
然后计算5×5图像与3×3矩阵的卷积,如下图5所示的动画所示:
花一点时间来了解上面的计算是如何完成的。我们将橙色矩阵在原始图像(绿色)上滑动1个像素(也称为“步长”),并针对每个位置(在两个矩阵之间)计算逐元素的乘法,然后将乘法输出相加以获得最终的整数,该整数形成输出矩阵的单个元素(粉红色)。请注意,在每个步幅中,3×3的矩阵仅“看到”一部分输入图像。
在CNN的术语中,3×3矩阵被称为“滤波器”、“核函数”或“特征检测器”,通过在图像上滑动滤波器并计算点积形成的矩阵被称为“卷积特征(Convolved Feature)”或“激活图(Activation Map)”或“特征图(Feature Map)”。需要注意的是,滤波器充当原始输入图像的特征检测器。
从上面的动画可以明显看出,对于相同的输入图像,不同的滤波矩阵值会产生不同的特征图。以下面的输入图像为例:
在下表中,我们可以看到上述图像与不同滤波器卷积的效果。如图所示,我们可以通过在卷积运算[8]之前改变滤波矩阵的数值来执行边缘检测、锐化和模糊等操作,这意味着不同的滤波器可以从图像中检测出不同的特征,例如边缘、曲线等。更多这样的例子可以在这篇文章的8.2.4节中找到。
了解卷积操作的另一种好方法是查看下面的图6中的动画:
一个过滤器(带有红色轮廓)在输入图像上滑动(卷积操作)以生成一个特征图。另一个过滤器(带有绿色轮廓线)在同一图像上的卷积得到不同的特征图,如图所示。需要注意的是,卷积操作捕获了原始图像中的局部相关性。还要注意这两个不同的过滤器如何从相同的原始图像生成不同的特征图。请记住,上面的图像和两个过滤器只是我们在上面讨论过的数值矩阵。
在实践中,CNN在训练过程中会自己学习这些滤波器的值(虽然在训练过程之前我们还需要指定过滤器的数量、过滤器的大小、网络的架构等参数)。我们拥有的过滤器数量越多,提取的图像特征就越多,我们的网络在识别图像中人眼不可见的图案方面就变得越好。
Feature Map (Convolved Feature)的大小由三个参数[4]控制,在进行卷积步骤之前我们需要确定:
步长(Stride):步长是我们在输入矩阵上滑动滤波矩阵的像素个数。当步长为1时,我们一次移动一个像素的滤波器。当步长为2时,当我们滑动滤波器时,滤波器一次跳跃2个像素。拥有更大的步幅将产生更小的特征图。
零填充(Zero-padding):有时,在边界周围用零填充输入矩阵很方便,因此我们可以将滤波器应用于输入图像矩阵的边界元素。零填充的一个优点是它允许我们控制特征图的大小。添加零填充也称为宽卷积(wide convolution),不使用零填充将是窄卷积(narrow convolution)。 在[14]中已经清楚地解释了这一点。
在上面的图3中,每个卷积操作之后都会使用一个称为ReLU的附加操作。ReLU是经过整流的线性单元,是一个非线性操作。其输出为:
ReLU是一种按元素的操作(按像素应用),并将特征图中的所有负像素值替换为零。ReLU的目的是在我们的ConvNet中引入非线性,因为我们希望我们的ConvNet学习的大多数现实世界数据都是非线性的(卷积是线性运算–-元素明智的矩阵乘法和加法运算,因此我们通过引入诸如ReLU之类的非线性函数来解决非线性问题)。
ReLU操作可以从下面的图9中清楚地理解。它显示了应用于图6中获得的一个特征映射的ReLU操作。这里的输出特征图也称为“经过校正的(Rectified)”特征图。
其他非线性函数如tanh或sigmoid也可以代替ReLU,但ReLU在大多数情况下表现得更好。
空间池化(也称为次采样或下采样)降低了每个特征图的维数,但保留了最重要的信息。空间池化可以有不同的类型:Max、Average、Sum等。
在“最大池化”的情况下,我们定义一个空间邻域(例如2×2窗口),并从该窗口内经过校正的特征图中获取最大的元素。除了获取最大元素外,我们还可以获取该窗口中所有元素的平均值(平均池)或总和。 在实践中,Max Pooling已显示出更好的效果。
图10显示了一个使用2×2窗口在经过卷积的特征图(ReLU操作后得到)上进行最大池化操作的例子。
图12显示了在上面图9中的ReLU操作之后,不同池化操作对我们接收到的校正后的特征图的影响。
池化的功能是逐渐减小输入表示的空间大小[4]。 特别是池化:
到目前为止,我们已经了解了卷积、ReLU和池化的工作原理。重要的是要了解,这些层是任何CNN的基本构建模块。如图13所示,我们有两组卷积,ReLU层和池化层:第二个卷积层使用6个滤波器对第一个池化层的输出进行卷积,总共生成6个特征图。然后将ReLU分别应用于所有这6个功能映射。然后,我们分别在六个经过修正的特征图上执行最大池化(Max Pooling)操作。
这些层一起从图像中提取有用的特征,在我们的网络中引入非线性并减少特征维数,同时使特征在缩放和平移[18]时具有一定的等变异性。
第二个池化层的输出作为全连接层的输入,我们将在下一节讨论。
全连接层是传统的多层感知机,在输出层使用softmax激活函数(也可以使用其他分类器,如SVM,但本文将坚持softmax)。术语“完全连接”意味着前一层的每个神经元都连接到下一层的每个神经元。如果你不熟悉多层感知机,我推荐你阅读这篇文章。
卷积和池化层的输出表示了输入图像的高级特征。全连通层的目的是利用这些特征将输入图像根据训练数据集分为不同的类。例如,我们要执行的图像分类任务有四个可能的输出,如下面的图14所示(注意,图14没有显示全连接层中的节点之间的连接):
除了分类之外,添加完全连接的层也是学习这些功能的非线性组合的一种(通常)廉价的方法。来自卷积层和池化层的大多数特征可能对分类任务很有用,但是这些特征的组合甚至可能更好[11]。
全连通层输出的概率之和为1。这是通过使用Softmax作为激活函数在输出层的全连接层。Softmax函数获取任意实值分数的向量,并将其压扁为0到1之间的值向量,其和为1。
如前所述,卷积+池化层充当输入图像的特征提取器,而全连接层充当分类器。
注意,在下面的图15中,由于输入的图像是一个船,那么船这一类别的目标概率为1,其他三个类的目标概率为0,即:
卷积网络的整体训练过程总结如下:
以上步骤对卷积神经网络进行了训练:这本质上意味着对卷积神经网络的所有权值和参数进行了优化,从而正确地对训练集中的图像进行分类。
当一个新的(不可见的)图像输入到ConvNet时,网络将进行前向传播步骤,并为每个类输出一个概率(对于一个新的图像,使用经过优化的权值来计算输出概率,以正确分类之前的所有训练示例)。如果我们的训练集足够大,网络将(有希望)很好地泛化到新的图像,并将它们分类到正确的类别。
注意:
一般来说,我们的卷积步骤越多,我们的网络能够学习识别的复杂特征就越多。例如,在图像分类中,ConvNet可以学习从第一层的原始像素中检测边缘,然后使用这些边缘来检测第二层的简单形状,然后使用这些形状来阻止更高层次的特征,例如在更高层次[14]中的面部形状。下面的图17演示了这一点:这些特征是使用卷积深度置信网络( Convolutional Deep Belief Network)学习的,这里的图只是为了演示这个思想(这只是一个例子)。
Adam Harley创建了卷积神经网络的惊人可视化效果,该网络在MNIST手写数字数据库上进行了训练[13]。我强烈建议你试用它,以了解CNN的工作原理的详细信息。
我们将在下面看到网络是如何为输入“8”工作的。注意,图18中的可视化并没有单独显示ReLU操作。
输入图像包含1024个像素(32×32的图像),第一个卷积层(卷积层1)由6个特殊的5×5 (步长为1)滤波器与输入图像卷积而成。如前所述,使用6个不同的滤波器生成深度为6的特征图。
卷积层1之后是池化层1,在卷积层1的6个特征图上分别进行2×2的最大池化(步长为2)。你可以将鼠标指针移动到池化层中的任意像素上,并观察它在前一个卷积层中形成的2x2网格(如图19所示)。你将注意到,在2x2网格中具有最大值(最亮的那个)的像素将进入池化层。
池化层1之后是16个5×5(步长为1)的卷积滤波器,执行卷积运算。接下来是池化层2,它实现了2×2的最大池化(步长为2)。
然后我们有三个全连接层(full-connected layer,FC)。它们是:
注意,在图20中,输出层中的10个节点分别连接到第二个全连接层中的所有100个节点(因此称为全连接)。
另外,请注意输出层中唯一的亮节点对应于“8”——这意味着网络正确地对我们的手写数字进行了分类(亮节点表示它的输出更高,即在所有其他数字中8的概率最高)。
这里提供了相同可视化的3D版本。
卷积神经网络自20世纪90年代初就出现了。上面我们讨论了LeNet,它是最早的卷积神经网络之一。下面列出了一些其他有影响力的架构。
在这篇文章中,我试图用简单的术语来解释卷积神经网络背后的主要概念。有几个细节我已经过度简化/跳过了,但希望这篇文章能让你对它们的工作原理有一些直观的认识。
这篇文章的灵感来自于Denny Britz的文章《Understanding Convolutional Neural Networks for NLP》(我建议大家读一读),这里的许多解释都是基于这篇文章。为了更透彻地理解其中的一些概念,我建议你阅读一下斯坦福大学关于ConvNets的课程笔记,以及下面参考资料中提到的其他优秀资源。
本文中使用的所有图片和动画都属于各自的作者,如下面的参考资料部分所列。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。