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