卷积神经网络

图像分类对于计算机而言是一项艰巨的任务。卷积神经网络代表了一种数据驱动的方法来应对这一挑战。这篇文章将涉及图像表示以及构成卷积神经网络的各层。

看到汽车图像并输出类别的CNN。


神经网络结构

这篇文章是关于理解神经网络如何学习对视觉数据进行分类和分类的系列文章中的第二篇。一篇文章中,我探讨了神经网络起作用的原因:它们依赖于这样一个事实,即大多数数据可以由一组更小,更简单的功能来表示。神经网络由许多节点组成,这些节点学习如何将训练数据最好地分为类或其他指定的组,并且许多层节点可以创建越来越复杂的边界来分离和分组这些数据。

完整的神经网络。


影像分类

在图像分类的情况下,我们需要一个神经网络来查看图像并为该图像输出正确的类。让我们以汽车的图像为例。

图像分类管道。

对我们来说,查看此图像并识别汽车很简单,但是当我们为神经网络提供此图像时,它会看到什么?

图像作为像素网格

神经网络(和计算机)将图像视为数值网格。在下面,您将看到汽车的灰度图像的放大部分。图像被分解成精细的网格,每个网格单元称为一个像素。对于灰度图像,每个像素的值都在0到255之间,其中0是黑色,而255是白色。灰色阴影介于两者之间。

灰度像素值0-255。

对于标准彩色图像,每个(x,y)像素位置都有红色,绿色和蓝色像素值。我们可以将其视为三个图像的堆栈,每个图像分别代表红色,绿色和蓝色分量。您可能会看到彩色像素值写为三个数值的列表。例如,对于RGB像素值,它 [255,0,0]是纯红色而[200,0,200]紫色。这样,我们可以将任何图像视为具有一定宽度,高度颜色深度的3D体积灰度图像的色深为1。

xy空间中的彩色图像,对于3个RGB颜色通道,深度为3。

要创建图像分类器,我们需要一种算法,该算法可以查看这些像素值并将该图像分类为汽车。我们还希望分类器能够在变化的光照条件下(夜间或晴天)检测到这辆车,并且我们希望分类器能够很好地泛化,以便可以识别不同环境和姿势的各种汽车。 。

各种汽车在不同情况下的图像。

如果只看一小幅汽车图像样本,就会发现每个图像的像素值确实不同。因此,挑战就变成了:我们如何创建一个分类器,对于这些像素值网格中的任何一个,如何将它们中的每个分类为汽车。

数据驱动方法

由于没有明确的方法来创建关于构成汽车的像素值的规则集,因此我们将采用数据驱动的方法:

  1. 收集带有真实类标签的图像集
  2. 训练模型以产生准确的,可预测的班级标签。

汽车图像的真实和预测类别标签。

在此示例中,我们计划训练卷积神经网络。在该网络训练过程中,它应该了解汽车的哪些部分是重要的识别对象,例如车轮和窗户,并且应该具有足够的通用性,以识别各种位置和环境中的汽车。


卷积神经网络

为了完成此图像分类任务,我们将使用卷积神经网络(CNN),这是一种可以在3D图像空间中查找和表示模式的特殊神经网络。许多神经网络查看单个输入(在这种情况下,单个像素值),但是卷积神经网络可以查看图像区域中的像素组并学习查找空间图案。

每个CNN都由多层组成,三种主要类型的层是卷积层,池层和完全连接层,如下图所示。通常,您会看到CNN由许多层组成,尤其是卷积和池化层。这些层中的每一层都是由节点组成,这些节点查看一些输入数据并产生输出,因此让我们仔细研究一下这些层中的每一个!

看到汽车图像并输出类别的CNN。

卷积层

卷积层可以被认为是该网络特征提取器,它学会在输入图像中查找空间特征。通过将一系列许多不同的图像滤镜(也称为卷积核)应用于输入图像来生成此层。这些过滤器是非常小的值网格,可在图像上逐像素滑动,并生成经过过滤的输出图像,其大小将与输入图像大致相同。多个内核将产生多个过滤后的输出图像。

卷积层由多个滤镜组成。

假设我们有四个不同的卷积核,它们将产生四个不同的,经过滤波的图像作为输出。这样的想法是,每个滤镜都会从输入图像中提取不同的特征,这些特征最终将有助于对图像进行分类,例如,一个滤镜可能会检测该图像中对象的边缘,而另一个滤镜可能会检测颜色的独特图案。这些过滤器堆叠在一起,构成了卷积层。


高通滤波器

让我们仔细研究一种卷积核:高通图像滤波器。高通滤波器旨在检测小区域内强度的突然变化。因此,在一小块像素中,高通滤波器将突出显示从暗像素变为亮像素的区域(反之亦然)。我将研究灰度图像中强度和像素值的模式。

汽车的被过滤的图象。

例如,如果我们将汽车的图像通过高通滤镜放置,我们期望可以检测到像素值从亮到暗突然改变的汽车边缘。对象的边缘通常是强度突然变化的区域,因此,高通滤镜有时被称为“边缘检测滤镜”。

卷积核

我将要讨论的过滤器是矩阵的形式,也称为卷积核,它们只是修改图像的数字网格。下面是一个高通滤波器的示例,它是一个进行边缘检测的3x3内核。

具有行值[0,-1,0],[-1,4,-1],[0,-1,0]的3x3边缘检测滤波器。

您可能会注意到,此3x3网格中的所有元素总和为零。对于边缘检测滤波器,重要的是所有元素的总和为零,因为它正在计算相邻像素之间的差异或变化。如果这些像素权重之和不等于零,则计算得出的差异将为正或负加权,分别具有使整个滤波图像变亮或变暗的效果。

卷积

为了将此过滤器应用于图像,将输入图像F(x,y)与内核K卷积。卷积由星号表示(不要误认为是乘法)。它涉及到获取一个内核(即我们的小网格),并将其逐像素传递到图像上,以创建另一个边缘检测的输出图像,其外观取决于内核值。

过滤通过汽车的图像。

我将使用3x3边缘检测过滤器来介绍一个具体示例。为了更好地查看像素级操作,我将放大汽车的图像。

放大汽车右上边缘附近的像素区域。

对于此灰度图像中的每个像素,我们将其内核放置在其上方,以使所选像素位于内核的中心,并执行卷积。在下图中,我以一个值为200的中心像素为例。

内核覆盖在3x3像素区域上。

完整卷积的步骤如下:

  1. 将内核中的值与其匹配的像素值相乘。因此,将3x3内核左上角的值(0)乘以我们图像区域(150)一角的像素值
  2. 将所有这些值对相乘得到总和,以得到一个新值,在这种情况下为175。此值将是已过滤输出图像中与所选中心像素相同(x,y)位置的新像素值。

卷积运算。

对输入图像中的每个像素重复此过程,直到获得完整的,经过过滤的输出为止。

重物

在继续之前,我想添加一些术语。内核中的值乘以其相应的像素值称为权重这是因为它们确定了像素在形成新的输出图像中的重要性(或重要性)。您会注意到中心像素的权重为4,这意味着它的权重为正。在3x3色块中的所有像素中,中心像素对于确定输出的经过滤波的图像中的像素值最重要。

3x3内核权重值突出显示。

内核还包含值为-1的负权重。这些对应于直接位于中心像素上方,下方以及左侧和右侧的像素。这些像素是最接近中心像素,因为它们对称地围绕中心分布,我们可以说,这个内核将检测围绕在其左右两侧的中央像素强度的任何变化,并在其顶部和底部。

图像边框

卷积不起作用的唯一像素是图像边界处的像素。3x3内核无法完美放置在图像边缘或角落的中心像素上。实际上,有几种处理方法,最常见的方法是用0的边界(或另一个灰度值)填充该图像,以便我们可以完美地将内核覆盖在原始图像的所有像素值上图像,或者忽略图像边界处的像素值,而只关注可以完全覆盖3x3卷积核的像素。

卷积核,移至图像的边缘,无法完全覆盖像素。

通常,图像的边缘没有很多有用的信息,但是如果您选择忽略此信息,则每个经过过滤的图像都将比原始输入图像小一点。对于3x3内核,我们实际上会从图像的每一侧损失一个像素,从而导致过滤后的输出的宽度和高度比原始图像小两个像素。您也可以选择制作更大的过滤器。3x3是最小的尺寸之一,非常适合查看较小的像素区域,但是如果要分析较大的图像,则可能需要增加面积并使用5x5、7x7或更大的内核。通常,您需要一个奇数,以便内核很好地覆盖中心像素。

3x3水平边缘检测滤波器。

上面是另一种类型的边缘检测滤波器;该过滤器正在计算中心像素周围的差异,但它仅查看周围像素值的底部和顶部。结果是一个水平边缘检测器。这样,您可以创建定向的边缘检测器!

看到汽车图像并输出类别的CNN。

因此,这些卷积核在应用于图像时会生成一个滤波图像,而几个滤波后的图像会构成一个卷积层。


激活功能

回想一下,灰度图像的像素值在0-255范围内。但是,神经网络在0到1之间的缩放“强度”值上工作得最好(我们在上一篇文章中简要提到了这一点)。因此,实际上,CNN的输入图像是像素值为0(黑色)到1(白色)之间的灰度图像;浅灰色的值可能像0.78。将图像从0-255的像素值范围转换为0-1的范围称为标准化然后,对该归一化的输入图像进行滤波并创建卷积层。通过卷积运算创建的滤波图像中的每个像素值都将落在不同的范围内。甚至可能会有负的像素值。

为了解决像素值的这种变化,在卷积层之后,CNN应用激活函数来转换每个像素值。

ReLu激活功能。

在CNN中,您经常会使用ReLu(Rectified Linear Unit)激活功能;此功能只是将所有负像素值变成0(黑色)。对于输入x,ReLU函数对于x> 0的所有值返回x,对于x≤0的所有值返回0。激活函数还将非线性引入模型中,这意味着CNN将能够找到可以有效地分离和分类一些训练数据的非线性阈值/边界。


最大池层

卷积层之后是池化层;最常见的池化层类型是最大池层。这些层中的每一层都查看图像中的像素值,因此,为了描述最大池化,我将集中在一个小的像素区域上。首先,maxpooling操作将图像分成较小的块,通常为2x2像素区域。

2x2像素色块。

让我们进一步放大其中的四个补丁。最大池化层由补丁大小2x2和跨度定义。可以将补丁视为maxpooling层用来选择最大像素值的2x2窗口。然后,该窗口在图像上上下移动一些步幅。对于2x2大小且跨度为2的补丁,此窗口将完全覆盖图像。较小的跨度将看到一些小块重叠,较大的跨度将完全丢失一些像素。因此,我们通常会看到补丁大小和步幅大小相同。

Maxpooling 2x2步幅框在4x4图像上移动而没有重叠。

对于每个2x2修补程序,maxpooling层查看修补程序中的每个值,并仅选择最大值。在红色色块中,它选择140,在黄色色中选择90,依此类推,直到从四个色块中剩下四个值为止。

2x2像素色块。

现在,您可能想知道为什么我们首先要使用maxpooling层,特别是因为该层正在丢弃像素信息。我们出于某些原因使用maxpooling层。

一,降维; 当输入图像通过CNN向前移动时,我们正在xy空间中拍摄相当平坦的图像,并在减小其高度和宽度的同时扩大其深度尺寸。网络提取有关图像内容的信息,并将其压缩成表示形式,该表示形式将构成可以由全连接层看到的合理数量的输入。其次,maxpooling使网络可以抵抗输入图像中较小的像素值变化。想象一下,小补丁中的某些像素值更亮或更暗,或者某个对象向右移动了几个像素。对于相似的图像,即使补丁的像素值略有不同,在连续的合并层中提取的最大值也应相似。第三,通过减少图像数据在CNN中向前移动的宽度和高度,模拟后面图层的视野增加例如,放置在原始输入图像上的3x3内核将立即看到3x3像素区域,但是将相同的内核应用于原始输入图像的合并版本(例如,图像的宽度和高度减小了两倍) 2),将看到相同数量的像素,但是3x3区域对应于原始输入图像中2倍大的区域这允许稍后的卷积层在输入图像的较大区域中检测特征。

还有其他一些使用maxpooling 的网络,例如Capsule Networks,您可以在单独的博客文章中进行阅读


全连接层

卷积神经网络的末尾是一个完全连接的层(有时不止一个)。完全连接意味着在最后一个池化层末尾产生的每个输出都是该完全连接层中每个节点的输入。例如,对于最终的池化层,该池化生成的输出堆栈的高度和宽度为20像素,深度为10像素(已过滤图像的数量),完全连接的层将看到20x20x10 = 4000个输入。最后一个全连接层的作用是生成一个类分数列表,您可以在一篇文章中看到该列表,并根据早期的卷积层和池化层提取的图像特征进行分类;因此,最后一个完全连接的层将具有与类一样多的节点。

看到汽车图像并输出类别的CNN。


CNN层,摘要

CNN由许多层组成:一系列卷积层+激活层和最大池化层,以及至少一个最终的全连接层,可以为给定图像生成一组类分数。CNN的卷积层充当特征提取器;他们从训练图像的像素值中提取形状和颜色图案。重要的是要注意,卷积层的行为及其学习提取的特征完全由权重定义组成网络中的卷积内核。CNN使用称为反向传播的过程学习在训练过程中找到最佳权重,该过程查看CNN在训练过程中造成的任何分类错误,找出该CNN中哪个权重导致该错误,并相应地更改这些权重。


PyTorch代码示例

如果您想了解如何使用PyTorch创建此类CNN图层,请查看我的Github教程资料库您可以选择浏览代码,查看输出结果或设置本地环境,然后在自己的计算机上运行代码(存储库中记录了设置本地环境的说明readme)。

卷积层,激活函数和最大池化层在第一本笔记本中:1.卷积NN层,可视化

以PyTorch代码执行的所有CNN层的输出。

请注意,在第一个笔记本中,我已经明确定义了卷积层的权重。但是,当我们要训练图像数据的神经网络时,将不会给该网络任何权重值;它将为从输入图像中提取特征的卷积核学习最佳权重。这些学习的功能将用于分离不同类别的数据。


如果您对我的工作和想法感兴趣,请查看我的Twitter或通过LinkedIn与我联系

撰写于2018年6月3日