卷积神经网络(ConvNets或CNN)是神经网络的一个类别,在图像识别和分类等领域已被证明非常有效。除了机器人和自驾车的视觉驱动之外,ConvNets已经成功地识别了面部,物体和交通标志。
在上图1中,ConvNet能够识别场景,系统能够建议相关字幕(“足球运动员正在踢足球”),而图2显示了ConvNets用于识别日常物体,人类和动物。最近,ConvNets在几种自然语言处理任务(例如句子分类)中也是有效的。
因此,ConvNets是当今大多数机器学习从业者的重要工具。然而,了解ConvNets和学习首次使用它们有时可能是一个令人恐惧的体验。这个博文的主要目的是开发一个对卷积神经网络如何在图像上工作的理解。
如果你是一般的神经网络新手,我会推荐阅读这篇关于多层感知器的简短教程,以了解它们的工作原理,然后再继续。多层感知器在这篇文章中被称为“完全连接的层”。
LeNet是第一个卷积神经网络之一,有助于推动深度学习领域。 自1988年以来,Yann LeCun的这项开创性工作被评为LeNet5之后的许多成功迭代[3]。当时LeNet架构主要用于字符识别任务,如阅读邮政编码,数字等。
下面,我们将展开LeNet架构如何学习识别图像的直觉。近年来提出了几种新的架构,即LeNet的改进,但是他们都使用LeNet的主要概念,如果您对前者有一个清晰的了解,那么相对来说更容易理解。
图3中 的卷积神经网络在体系结构与原始LeNet类似,将输入图像分为四类:狗,猫,船或鸟(原LeNet主要用于字符识别任务)。从上图可以看出,在接收到船只图像作为输入时,网络正确地分配了所有四个类别中船的最高概率(0.94)。输出层中所有概率的总和应为一(本文后面将会解释)。
ConvNet有四个主要操作,如图3所示:
这些操作是每个卷积神经网络的基本构建块,因此了解这些工作是如何发展ConvNets的良好理解的重要一步。我们将尝试了解下面这些操作背后的直觉。
本质上,每个图像可以表示为像素值的矩阵。
通道是用于指代图像的某个分量的常规术语。来自标准数码相机的图像将有三个通道 - 红色,绿色和蓝色 - 您可以将其中的三个2d矩阵(每种颜色一个)堆叠起来,每个像素的像素值范围为0到255。
甲灰度图像,另一方面,只有一个信道。为了这个帖子的目的,我们只会考虑灰度图像,所以我们将有一个单一的2d矩阵表示一个图像。矩阵中每个像素的值范围为0到255 - 零表示黑色,255表示白色。
ConvNets从“卷积”运算符中导出其名称。ConvNet的主要目的是从输入图像中提取特征。卷积通过使用小平方的输入数据学习图像特征来保持像素之间的空间关系。我们不会在这里介绍卷积的数学细节,但会尝试了解它对图像的有效性。
如上所述,每个图像可以被认为是像素值的矩阵。考虑像素值仅为0和1的5 x 5图像(请注意,对于灰度图像,像素值范围为0到255,下面的绿色矩阵是像素值仅为0和1的特殊情况):
另外,考虑另外3×3的矩阵,如下所示:
然后,可以如下面的图5中的动画所示计算5×5图像和3×3矩阵的卷积:
花点时间了解上面的计算是如何进行的。我们将原始图像(绿色)上的橙色矩阵滑过1像素(也称为“stride”),对于每个位置,我们计算元素乘法(在两个矩阵之间),并加上乘法输出以得到最终的整数输出矩阵的单个元素(粉红色)。请注意,3×3矩阵在每个步幅中只能看到输入图像的一部分。
在CNN术语中,3×3矩阵称为“过滤器”或“内核”或“特征检测器”,通过将图像上的滤镜滑动并计算点积形成的矩阵称为“卷积特征”或“激活地图”或“功能地图”。重要的是要注意,滤波器作为来自原始输入图像的特征检测器。
从上面的动画可以看出,滤波器矩阵的不同值将为相同的输入图像产生不同的特征图。例如,考虑以下输入图像:
在下表中,我们可以看到上述图像与不同滤镜的卷积效果。如图所示,我们可以通过在卷积运算之前更改滤波器矩阵的数值来执行边缘检测,锐化和模糊等操作[8] - 这意味着不同的滤波器可以检测图像中的不同特征,例如边缘,曲线等。更多这样的例子可以在这里的8.2.4节中找到。
了解卷积操作的另一个好方法是通过查看下面图6中的动画:
一个过滤器(具有红色轮廓)在输入图像上滑动(卷积运算)以产生一个特征图。另一个滤镜(带有绿色轮廓)在同一图像上的卷积给出了不同的特征图,如图所示。重要的是要注意,卷积运算捕获原始图像中的本地依赖关系。还要注意这两个不同滤镜如何从相同的原始图像中生成不同的特征图。记住,上面的图像和上面的两个过滤器只是数字矩阵,我们在上面讨论过。
在实践中,CNN的学习训练过程中对自己的这些过滤器的值(虽然我们还需要指定参数,如过滤器数量,过滤器大小,网络架构的训练过程之前等)。我们拥有的滤镜数量越多,图像特征越多,网络变得越来越难以识别图像中的图像。
特征图(卷积特征)的大小由在卷积步骤执行之前需要决定的三个参数[ 4 ] 控制:
在上面的图3中的每个卷积操作之后,已经使用了称为ReLU的附加操作。ReLU代表整流线性单元,是非线性运算。其输出由下式给出:
ReLU是元素操作(每像素应用),并将特征图中的所有负像素值替换为零。ReLU的目的是在ConvNet中引入非线性,因为我们希望ConvNet学习的大多数真实世界数据将是非线性的(卷积是一个线性运算 - 元素矩阵乘法和加法,所以我们通过引入诸如ReLU的非线性函数来解释非线性)。
ReLU操作可以从下面的图9清楚地看出。它显示了ReLU操作应用于 上面图6中获得的特征图之一。此处的输出特征图也称为“整流”特征图。
也可以使用其他非线性函数(如tanh或sigmoid)来代替ReLU,但是在大多数情况下,ReLU已被发现表现更好。
空间池(也称为二次采样或下采样)降低了每个特征图的维数,但保留了最重要的信息。空间汇总可以是不同的类型:最大,平均,和等。
在Max Pooling的情况下,我们定义一个空间邻域(例如,一个2×2窗口),并从该窗口内的整流特征图中获取最大的元素。而不是使用最大的元素,我们也可以取平均值(Average Pooling)或该窗口中所有元素的总和。在实践中,Max Pooling已经显示出更好的效果。
图10 显示了通过使用2×2窗口的整流功能图(卷积+ ReLU操作后获得)上的最大池操作的示例。
我们将2 x 2窗口滑动2个单元格(也称为“stride”),并在每个区域中取最大值。如图10所示,这降低了我们的特征图的维数。
在图11所示的网络中,池操作分别应用于每个特征图(注意,由于这一点,我们从三个输入图中得到三个输出图)。
图12 显示了在上图9中的ReLU操作后,我们收到的整流功能图集中的效果 。
池的功能是逐步减少输入表示的空间大小[4]。特别是汇集
到目前为止,我们已经看到了卷积,ReLU和Pooling如何工作。重要的是要了解这些层是任何CNN的基本构件。如图13所示,我们有两组卷积,ReLU和Pooling层 - 第二卷卷层使用六个滤镜对第一个Pooling Layer的输出进行卷积,以产生总共六个特征图。然后将ReLU单独应用于所有这六个特征图。然后我们分别对六个整流特征图中的每一个执行Max Pooling操作。
这些层一起从图像中提取有用的特征,在我们的网络中引入非线性,并减少特征维度,同时旨在使特征与缩放和平移具有一些等同性[18]。
第二个集合层的输出作为完全连接层的输入,我们将在下一节讨论。
完全连接层是传统的多层感知器,它在输出层中使用softmax激活功能(其他分类器,如SVM也可以使用,但是会在这篇文章中坚持softmax)。术语“完全连接”意味着上一层中的每个神经元连接到下一层的每个神经元。 如果您不熟悉多层感知器,我建议您阅读这篇文章。
卷积层和汇集层的输出代表输入图像的高级特征。完全连接层的目的是使用这些功能将输入图像分类为基于训练数据集的各种类别。例如,我们设定执行的图像分类任务具有四个可能的输出,如下面的图14所示(请注意,图14未显示完全连接的图层中的节点之间的连接)
除了分类之外,添加完全连接的层也是学习这些特征的非线性组合的(通常)便宜的方式。来自卷积层和层叠层的大多数特征对于分类任务可能是好的,但是这些特征的组合可能更好[11]。
来自完全连接层的输出概率的总和为1.通过使用Softmax作为完全连接层的输出层中的激活功能来确保。Softmax函数采用任意实值分数的向量,并将其压缩到零和一之间的值向量,总和为1。
如上所述,Convolution + Pooling层作为输入图像的特征提取器,而完全连接的层用作分类器。
请注意,在下面的图15中,由于输入图像是船,所以Boat类的目标概率为1,而对于其他三个类,目标概率为0,即
卷积网络的整体训练过程可概述如下:
上述步骤训练ConvNet - 这实质上意味着ConvNet的所有权重和参数现在已经被优化,以正确地对训练集中的图像进行分类。
当ConvNet中输入新的(不可见的)图像时,网络将通过正向传播步骤并输出每个类的概率(对于新图像,输出概率使用已优化的权重计算,以正确分类所有以前的培训示例)。如果我们的训练集足够大,网络将(希望)推广到新的图像,并将其分类为正确的类别。
注1:上述步骤过于简单,避免了数学细节,为培训过程提供了直觉。参见[4]和[12]的数学公式和透彻的理解。
注2:在上面的例子中,我们使用了两组交替的卷积和池层。但请注意,这些操作可以在单个ConvNet中重复任意次数。事实上,一些最好的ConvNets今天有数十个卷积和池层!此外,在每个卷积层之后没有必要具有池化层。从下面的图16可以看出,在进行汇总操作之前,我们可以连续进行多次卷积+重新执行操作。还要注意ConvNet的每一层如下图16所示。
一般来说,我们拥有的卷积步骤越多,我们的网络就越能复杂地识别。例如,在图像分类中,ConvNet可以学习检测第一层中原始像素的边缘,然后使用边缘来检测第二层中的简单形状,然后使用这些形状来阻止更高级的特征,如面部形状在较高层[14]。这在下面的图17中被证明- 这些特征是使用卷积深层信念网络学习的,并且该图被包括在此仅仅是为了演示这个想法(这仅仅是一个例子:现实生活卷积滤波器可以检测到对人类没有意义的对象) 。
亚当·哈雷(Adam Harley)创建了一个在MNIST数据库上训练的卷积神经网络的惊人可视化手写数字[13]。我强烈推荐玩弄它来了解CNN如何工作的细节。
我们将在下面看到如何为输入“8”工作的网络。请注意,图18中的可视化不会单独显示ReLU操作。
输入图像包含1024个像素(32×32图像),并且通过六个唯一的5×5(步幅1)滤波器与输入图像的卷积形成第一卷积层(卷积层1)。如图所示,使用六个不同的滤镜产生深度六的特征图。
卷积层1之后是汇集层1,它在卷积层1中的六个特征图中分别进行2×2最大池(带有步幅2)。您可以将鼠标指针移动到池层中的任何像素上,并观察2 x 2网格在前一个卷积层中形成(如图19所示)。您将注意到,2 x 2网格中具有最大值(最亮的像素)的像素将会进入“池”层。
汇集层1之后是执行卷积运算的十五个5×5(步幅1)卷积滤波器。接下来是Pooling Layer 2,最大池数为2×2(步幅2)。这两层使用与上述相同的概念。
然后我们有三个完全连接(FC)层。有:
请注意,在图20中,输出层中的10个节点中的每一个都连接到第2个完全连接层中的所有100个节点(因此名称为完全连接)。
另外,请注意,输出层中唯一的亮点对应于“8” - 这意味着网络正确地对我们的手写数字进行了分类(亮点表示其输出较高,即8个在所有其他数字中的概率最高)。
相同可视化的3D版本可在此处使用。
卷积神经网络始于20世纪90年代初。我们讨论了LeNet,这 是最早的卷积神经网络之一。其他一些有影响力的架构如下[3] [4]所列。
在这篇文章中,我已经尝试简单地解释卷积神经网络背后的主要概念。有几个细节我已经过度简化/跳过,但希望这篇文章给你一些关于他们如何工作的直觉。
这篇文章最初来自Denny Britz的NLP理解卷积神经网络(我建议阅读),这里的一些解释是基于这篇 文章。对于一些概念更透彻的了解,我会鼓励你去通过音符从斯坦福大学的在ConvNets课程以及根据下文引用中提到的其他优秀的资源。如果您面对任何上述概念或有任何问题/建议,请随时在下面发表评论。
本文中使用的所有图像和动画都属于其参考文献部分所列各自的作者。