卷积神经网络(CNN)入门指南

卷积神经网络(CNN)入门指南

 

卷积神经网络(CNN)入门指南

 

 

引言

卷积神经网络:听起来像是生物与数学还有少量计算机科学的奇怪结合,但是这些网络在计算机视觉领域已经造就了一些最有影响力的创新。2012年神经网络开始崭露头角,那一年Alex Krizhevskyj在ImageNet竞赛上(ImageNet可以算是竞赛计算机视觉领域一年一度的“奥运会”竞赛)将分类错误记录从26%降低到15%,这在当时是一个相当惊人的进步。从那时起许多公司开始将深度学习应用在他们的核心服务上,如Facebook将神经网络应用到他们的自动标注算法中,Google(谷歌)将其应用到图片搜索里,Amazon(亚马逊)将其应用到产品推荐服务,Pinterest将其应用到主页个性化信息流中,Instagram也将深度学习应用到它们的图像搜索架构中。

 

卷积神经网络(CNN)入门指南

 

然而最经典的,或者说最流行的神经网络使用范例是将其用于图像处理领域。提到图像处理,本文主要介绍的是如何使用卷积神经网络来进行图像分类。

问题空间

图像分类是将输入图像(猫、狗等)进行分类输出或者将其分类成最能描述图像特征的类别的任务。对于人类来说,认知是我们出生之后就学会的第一个技能,也是作为成年人来说非常自然和轻松的技能。我们可以毫不犹豫迅速识别出我们周围的环境以及物体,当我们看到一张图片或者观察周遭环境时,大部分时间我们都能马上对场景做出判断并且给每个物体都打上标识,这些甚至都不需要刻意去观察。这些技能能够迅速识别其模式,从我们以前的经验中做出推论,然后将其运用至不同的图片或者环境中——这些都是我们与机器不同的地方。

 

卷积神经网络(CNN)入门指南

 

输入与输出

当计算机看到一张图片时(即输入一张图片),它所看到的是一系列的像素值。根据图片的分辨率与大小,计算机将看到的是一个32×32×3的数字阵列(3指代的是RGB—颜色值)。我们稍微将一下这个,假设我们有一张480 x 480的JPG格式图片,它的表达阵列即为480 x 480 x 3。这些数字中的每一个值都可以从0取到255,它描述了在这一点上的像素强度。这些数字虽然对于我们进行图像分类时没有任何意义,但其却是计算机在图像输入时唯一获取的数据。这个理念就是你给电脑指定相关数据排列,它将图像是一个特定的类别的可能性进行输出(如80—猫,15—狗,05—鸟等)。

我们希望电脑做什么

现在我们了解到问题是在输入和输出上,让我们来考虑如何解决这个问题。我们希望电脑能做到的是在所有的给定图像中分辨出不同的类别,它能找到那些“狗之所以是狗”或者“猫之所以是猫”的特性。这个就是在我们的头脑中潜意识里进行认知识别的过程,当我们看到一张狗的图像时,我们能够将其分类因为图像上有爪子或者四条腿等明显的特征。以类似的方式计算机能够进行图像分类任务,通过寻找低层次的特征如边缘和曲线,然后运用一系列的卷积层建立一个更抽象的概念。这是卷积神经网络应用的一个总体概述,接下来我们来探讨下细节。

架构

对于卷曲神经网络更详细的介绍是将图片通过一系列的卷积、非线性、池(采样)、全连接层,然后得到一个输出。

 

卷积神经网络(CNN)入门指南

 

一个卷积神经网络由若干卷积层、Pooling层、全连接层组成。你可以构建各种不同的卷积神经网络,它的常用架构模式为:

INPUT -> [[CONV]*N -> POOL?]*M -> [FC]*K

也就是N个卷积层叠加,然后(可选)叠加一个Pooling层,重复这个结构M次,最后叠加K个全连接层

对于图1展示的卷积神经网络:

INPUT -> CONV -> POOL -> CONV -> POOL -> FC -> FC

按照上述模式可以表示为:

INPUT -> [[CONV]*1 -> POOL]*2 -> [FC]*2

也就是:N=1, M=2, K=2

 

第一层—Convolution Layer(卷积层)

 

卷积神经网络(CNN)入门指南

 

卷积神经网络的第一层是卷积层,第一件事是你要记住卷曲层的输入时什么。像我们之前提到的,输入的是一个5×5×3的系列像素值。解释卷积层的最好方式是想象一个手电筒正在图像的左上方进行照射,假设手电照射的区域是3 x 3的范围。再想象下这个手电筒在输入图像的各个区域进行滑动。在机器学习术语中,这个手电筒叫做filter(过滤器),它照射着的区域被称为接受场。这个过滤器也是一系列的数据(这些数据被称为权重或者参数)。

 

卷积神经网络(CNN)入门指南

 

 

卷积神经网络(CNN)入门指南

 

上面图片移动步长设置为1,设置为2时

 

卷积神经网络(CNN)入门指南

卷积神经网络(CNN)入门指南

我们注意到,当步幅设置为2的时候,Feature Map就变成2*2了。这说明图像大小、步幅和卷积后的Feature Map大小是有关系的。事实上,它们满足下面的关系:

 

卷积神经网络(CNN)入门指南

在上面两个公式中,W2是卷积后Feature Map的宽度;W1是卷积前图像的宽度;F是filter的宽度;P是Zero Padding数量,Zero Padding是指在原始图像周围补几圈0,如果P的值是1,那么就补1圈0;S是步幅;H2是卷积后Feature Map的高度;H1是卷积前图像的宽度。

 

咱们在从高阶角度来谈谈这个卷积层的任务,这些过滤器中每个都可以被认为是特征标识符。当我说特征时,我说的是如直边、简单的颜色和曲线等。思考一下,所有的图像都有同样的最简单的特征。我们的第一个过滤器是7×7×3,而且是一个曲线探测器。(在这一部分让我们忽略一个事实,过滤器是3个单位深的,只考虑顶部过滤器的深度和图像。)作为一个曲线检测器,过滤器将有一个更高的数值且有曲线的形状的像素结构(记住关于这些过滤器,我们考虑的只是数字)。

 

卷积神经网络(CNN)入门指南

 

 

现在,让我们回到数学可视化部分。当我们在输入的左上角有了这种滤波器后,它会在哪个区域的过滤器和像素值之间计算乘积。现在让我们以一个我们要分类的图像为例,把我们的过滤器放在左上角。

 

卷积神经网络(CNN)入门指南

 

 

记住,我们需要做的是使用图像中的原始像素值在过滤器中进行乘积。

 

卷积神经网络(CNN)入门指南

 

 

基本上在输入图像中,如果有一个形状是类似于这种滤波器的代表曲线,那么所有的乘积累加在一起会导致较大的值!现在让我们看看当我们移动我们的过滤器时会发生什么。

 

卷积神经网络(CNN)入门指南

 

 

检测值竟然要低得多!这是因为在图像中没有任何部分响应曲线检测过滤器。记住,这个卷积层的输出是一个特征图。因此,在简单的情况下一个过滤器的卷积(如果该过滤器是一个曲线检测器),特征图将显示其中大部分可能是在图片中的曲线区域。在这个例子中,我们的28×28×1特征图左上方的值将是6600,这种高值意味着很可能是在输入中有某种曲线导致了过滤器的**。因为没有任何东西在输入使过滤器**(或更简单地说,在该地区的原始图像没有一个曲线),其在我们的**图右上方的值将是0。记住,这仅仅只是一个过滤器。这个过滤器将检测线向外和右边的曲线,我们可以有其他的曲线向左或直接到边缘的过滤器线条。过滤器越多,**图越深,我们从于输入中获取的信息也就越多。

声明:在这一节中描述的过滤器是简化的,其主要目的是描述在一个卷积过程中的数学过程。在下图中你会看到一些对训练过的网络中第一个卷积层的过滤器的实际显示示例,尽管如此,主要的论据仍然是相同的。

第一个卷积层的过滤器被设计用来探测。他们检测到低阶的特征如边缘和曲线。正如想象的那样,为了预测图像的类型,我们需要神经网络能够识别更高阶的特征,如手、爪子、耳朵。当穿过另一个卷积层时,卷积层的第一输出成为第二卷积层的输入,这有难以视觉化想象。当我们谈论第一层时,输入的只是原始图像。然而,当我们谈论第二个卷积层时,输入是第一层的结果**图(S)。因此,每一层的输入基本上是描述某些低阶特征在原始图像中的位置。现在当你应用一组过滤器(通过第二卷积层),输出将被**且代表更高阶的特征。这些特征的类型可能是半圆(曲线和直线边缘的组合)或方形(几个直边的组合)。当通过网络、更多的卷积层,可以**地图,代表更多和更复杂的特征。在神经网络的结束,可能有一些**的过滤器,表示其在图像中看到手写字迹或者粉红色的物体时等等。

 

卷积神经网络(CNN)入门指南

 

Pooling(池化层)

Pooling层主要的作用是下采样,通过去掉Feature Map中不重要的样本,进一步减少参数数量。Pooling的方法很多,最常用的是Max Pooling。Max Pooling实际上就是在n*n的样本中取最大值,作为采样后的样本值。下图是2*2 max pooling:

 

卷积神经网络(CNN)入门指南

 

除了Max Pooing之外,常用的还有Mean Pooling——取各样本的平均值。

通过这个池化层,我们来减少计算资源,但是必须注意的是,池化层会损失图像的精确度。

 

全连接层

全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。由于其全相连的特性,一般全连接层的参数也是最多的。这层基本上将一个输入量(无论输出是卷积或ReLU或池层)和输出一个N,N是程序选择类别的N维向量,具体过程如下图所示。这个全连接层的工作方式是,它着眼于前一层的输出(代表高阶特征的**图),并确定哪些功能是最相关特定的类。例如如果该程序预测,一些图像是一只狗,它在**图中会有高的值,代表高阶特征如一个爪子或4条腿等。类似地,如果该程序是预测一些图像是鸟的功能,它在**图中会有高阶值,代表高阶特征如如翅膀或喙等。