点击上方“小白学视觉”,选择加"星标"或“置顶”
英文原文:https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/
卷积神经网络(ConvNets 或CNN )是一类神经网络,已经证明在图像识别和分类等领域非常有效。 除了为机器人和自动驾驶汽车提供视力外,卷积神经网络还成功识别了面部,物体和交通标志。
图一
在 上面的 图1中,卷积神经网络能够识别场景,并且能够建议相关的标题(“足球运动员踢足球”),而图2显示了用于识别日常物品,人类和动物。 最近,卷积神经网络在几个自然语言处理任务(例如语句分类)中也有效。
因此,卷积神经网络是当今大多数机器学习从业者的重要工具。 然而,了解卷积神经网络并首次学会使用它们有时可能是一种令人生畏的过程。 本博文的主要目的是了解卷积神经网络如何在图像上工作。
如果你不熟悉神经网络,我建议你阅读这篇关于多层感知器的简短教程,以便在继续之前了解它们的工作原理。 多层感知器在本文中称为“全连接层”。
LeNet架构(1990年代)
LeNet是最早推动深度学习领域的卷积神经网络之一。Yann LeCun的这项开创性工作自1988年以来经过多次成功迭代后被命名为 LeNet5 [ 3 ]。 那时,LeNet架构主要用于字符识别任务,例如阅读邮政编码,数字等。
下面,我们将直观了解LeNet架构如何识别图像。 近年来已经在LeNet基础上提出了几种改进的新的架构,但它们都使用了LeNet的主要概念,如果你对前者有清楚的了解,则相对容易理解。
图三:一个简单的ConvNeto
图3中 的卷积神经网络在 结构上与原始LeNet类似,并将输入图像分为四类:狗,猫,船或鸟(原始LeNet主要用于字符识别任务)。 从上图可以看出,在接收船只图像作为输入时,神经网络在所有四个类别中正确地为船只的分配了最高概率(0.94)。 输出层中所有概率的总和应为1(本文稍后将对此进行说明)。
图3 所示卷积神经网络中有四个主要操作:
卷积
非线性部分(ReLU)
池化或子采样
分类(全连接层)
这些操作是每个 卷积神经网络 的基本构建块 ,因此了解这些工作如何是开发对卷积神经网络的正确理解的重要一步。 下面我们将尝试直观地理解每个操作。
图像是像素值的矩阵
实质上,每个图像都可以表示为像素值矩阵。
图4:每个图像都是像素值矩阵。
通道 是用于指代图像的某个组件的常规术语。 来自标准数码相机的图像将具有三个通道 —— 红色,绿色和蓝色 —— 你可以将这些通道想象为三个彼此堆叠的2d矩阵(每种颜色一个),每个都具有0到255范围内的像素值。
灰度 图像则只有一个通道。 出于本文的目的,我们将仅考虑灰度图像,因此我们将使用表示图像的单个2d矩阵。 矩阵中每个像素的值范围为0到255 —— 0表示黑色,255表示白色。
卷积步骤
卷积神经网络的名字来自 “卷积”运算符 。 卷积神经网络中卷积的主要目的是从输入图像中提取特征。 卷积通过使用输入数据的小方块学习图像特征来保持像素之间的空间关系。 我们不会在这里讨论卷积的数学细节,但会尝试理解它对图像的作用。
如上所述,每个图像都可以被视为像素值矩阵。 考虑像素值仅为0和1的5 x 5图像(请注意,对于灰度图像,像素值范围为0到255,下面的绿色矩阵是像素值仅为0和1的特殊情况):
另外,考虑另一个3 x 3矩阵,如下所示:
然后,可以计算5 x 5图像和3 x 3矩阵的卷积,如 下面 图5中的动画 所示:
图5:卷积操作。 输出矩阵称为卷积特征或特征图。
我们花点时间了解上面的计算是如何完成的。 将橙色矩阵滑过原始图像(绿色)1个像素(也称为“步幅”),对于每个位置,我们计算元素乘法(在两个矩阵之间)并相加得到一个整数输出作为输出矩阵的一个元素(粉红色)。 注意,3×3矩阵仅“看到”每个步幅中的输入图像的一部分。
在CNN术语中,3×3矩阵称为“ 过滤器 ”或“核”或“特征检测器”,通过在图像上滑动过滤器并计算点积而形成的矩阵称为“卷积特征”或“激活图”或' “特征图” '。 重要的是要注意,过滤器充当原始输入图像的特征检测器。
从上面的动画可以明显看出,不同的过滤器矩阵将使得相同的输入图像产生不同的特征图。 例如,请考虑以下输入图像:
在下表中,我们可以看到上面图像与不同过滤器卷积作用的结果。 如图所示,我们可以在卷积运算[ 8] 之前通过更改过滤器矩阵的数值来执行边缘检测,锐化和模糊等操作 —— 这意味着不同的过滤器可以检测图像中的不同特征,例如边缘,曲线等,更多这样的例子可以在8.2.4节中找到
理解卷积操作的另一个好方法是查看下面图6中的动画:
【因文件太大无法上传显示】
图6:卷积操作。
一个过滤器(具有红色轮廓)在输入图像(卷积操作)上滑动以产生特征图。另一个过滤器(带有绿色轮廓)在同一图像上的卷积给出了不同的特征图,如图所示。值得注意的是,卷积操作捕获原始图像中的局部依赖关系。还要注意这两个不同的过滤器如何从同一原始图像生成不同的特征图。请记住,如上所述,上面的图像和两个过滤器都是数字矩阵。
实际上,CNN的在训练过程中会自己学习这些过滤器的值(虽然我们训练过程之前还需要指定参数,如过滤器数量,过滤器大小,网络架构等)我们拥有的过滤器数量越多,提取的图像特征就越多,我们的网络对未见过的图片识别效果越好。
特征图(卷积特征)的大小由三个参数[ 4 ]控制,我们需要在执行卷积步骤之前确定它们:
深度: 深度对应于我们用于卷积运算的过滤器数量。在图7所示的网络中 ,我们使用三个不同的过滤器对原始船图像进行卷积,从而产生三个不同的特征图,如图所示。你可以将这三个特征图视为堆叠的2d矩阵,因此,特征图的“深度”将为3。
图7
步幅: 步幅是我们在输入矩阵上滑动过滤器矩阵的像素数。当步幅为1时,我们一次移动过滤器一个像素。当步幅为2时,当我们滑动它们时,过滤器一次跳跃2个像素。拥有更大的步幅将产生更小的特征图。
零填充: 有时,在边界周围用零填充输入矩阵很方便,这样我们就可以将过滤器应用于输入图像矩阵的边界元素。零填充的一个很好的特性是它允许我们控制特征图的大小。添加零填充也称为宽卷积 , 不使用零填充将是一个窄卷积 。 [ 14 ]中 已经清楚地解释了这一点 。
在 上面的 图3中的 每个卷积操作之后,都使用了称为ReLU的附加操作 。ReLU代表修正线性单元,是一种非线性操作。 其输出由下式给出:
图8:ReLU操作
ReLU是元素级别操作(作用于每个像素,它将特征图中的所有负像素值替换为零。ReLU的目的是在我们的卷积神经网络中引入非线性因素,因为我们希望神经网络学习的大多数真实数据都是非线性的(卷积是线性操作 —— 元素级矩阵乘法和加法,所以我们通过引入像ReLU这样的非线性函数来解释问题的非线性部分。)
可以从下面的图9 清楚地理解ReLU操作。它显示了ReLU操作应用于上面图6中 获得的一个特征图。此处的输出特征图也称为“修正”特征图。
图9:ReLU操作。
也可以使用 其他非线性函数(例如 tanh或 sigmoid)代替ReLU,但已发现ReLU在大多数情况下表现更好。
空间池化(也称为子采样或下采样)可降低每个特征图的维度,而保留了最重要的信息。 空间池化有几种不同类型:最大,平均,总和池化等。
在最大池化的情况下,我们定义空间邻域(例如,2×2窗口)并从该窗口内的修正特征图中获取最大元素。 我们也可以取平均值(平均池化)或该窗口中所有元素的总和,而不是取最大元素。 在实践中,最大池化已被证明效果更好。
图10 显示出了通过使用2×2窗口在修正特征图(在卷积+ ReLU操作之后获得)上的最大池操作的示例。
图10:最大池。
我们将2 x 2窗口滑动2个单元格(也称为“步幅”),并在每个区域中取最大值。如图10 所示 ,这降低了我们的特征图的维度。
在图11 所示的网络中,池化操作分别应用于每个特征图(请注意,由于这个原因,我们从三个输入图中获得三个输出图)。
图11:应用于修正特征图的池
图12显示了池化对我们在 上面 图9中的ReLU操作之后收到的修正特征图的影响 。
图12:池化。
池化的功能是逐步减小输入表示的空间大小[ 4 ]。 特别地,池化
使输入表示(特征维度)更小,更易于管理
减少网络中的参数和计算次数,因此控制过拟合 [ 4 ]
使网络对输入图像中的小变换,失真和平移不变(输入中的小失真不会改变池化的输出 —— 因为我们采用局部邻域中的最大/平均值)。
帮助我们实现图像的几乎尺度不变的表示(确切的术语是“等变的”)。 这是非常强大的,因为这样无论图像中的对象位于何处,我们都可以检测到( 详见 [ 18 ]和[ 19 ])。
图13
到目前为止,我们已经看到了卷积,ReLU和池化的工作原理。 重要的是要理解这些层是任何CNN的基本构建块。 如图13 所示 ,我们有两组卷积,ReLU和池化层 —— 第二个卷积层使用六个过滤器对第一个池化的输出进行卷积,产生六个特征图。 然后,ReLU将单独应用于所有这六个特征图。 然后,我们分别对六个修正特征图中的每一个执行最大池操作。
这些层一起从图像中提取有用的特征,在我们的网络中引入非线性并减少特征维度,同时旨在使特征在某种程度上与缩放和平移相同[ 18 ]。
第二个池化层的输出充当全连接层的输入,我们将在下一节中讨论。
全连接层是传统的多层感知器,它在输出层使用softmax激活函数(也可以使用其他分类器,如SVM,但在本文中将坚持使用softmax)。 术语“全连接”意味着前一层中的每个神经元都连接到下一层的每个神经元。 如果你不熟悉多层感知器, 我建议你阅读 这篇文章。
卷积和池化层的输出表示输入图像的高级特征。 全连接层的目的是基于训练数据集使用这些特征将输入图像分类为各种类。 例如,我们要执行的图像分类任务有四种可能的输出,如 下面的 图14 所示(注意图14没有显示全连接层中节点之间的连接)
图14:全连接层 - 每个节点连接到相邻层中的每个其他节点
除了分类之外,添加全连接层也是学习这些特征的非线性组合的(通常)廉价方式。 卷积和池化层的大多数特征可能对分类任务有利,但这些特征的组合可能更好[ 11 ]。
这里通过使用Softmax函数 作为全连接层的输出层中的激活函数来确保全连接层的输出概率之和为1。Softmax函数接收任意实数向量,将其压缩为0到1之间的值且分量值总和为1的向量。
如上所述,卷积+池化层充当输入图像的特征提取器,而全连接层充当分类器。
请注意,在 下面的 图15 中,由于输入图像是船,因此Boat类的目标概率为1,其他三个类的目标概率为0,即
输入图像=船
目标矢量= [0,0,1,0]
图15:训练卷积神经网络
卷积网络的整体训练过程可概括如下:
步骤1: 我们用随机值初始化所有过滤器和参数/权重
步骤2:网络将训练图像作为输入,经过前向传播步骤(卷积,ReLU和池化操作以及全连接层中的前向传播)并找到每个类的输出概率。
可以说上面船形图的输出概率是[0.2,0.4,0.1,0.3]
由于权重是为第一个训练示例随机分配的,因此输出概率也是随机的。
第3步: 计算输出层的总误差(所有4个类的总和)
总误差=Σ½(目标概率 - 输出概率)²
步骤4: 使用反向传播计算 相对于网络中所有权重的误差 梯度 ,并使用梯度下降 来更新所有过滤器值/权重和参数值,以最小化输出误差。
权重的调整与它们对总误差的贡献成比例。
当再次输入相同的图像时,输出概率现在可能是[0.1,0.1,0.7,0.1],这更接近目标矢量[0,0,1,0]。
这意味着网络已经学会 通过调整其权重/过滤器来正确地对该特定图像进行分类,从而减少输出误差。
过滤器数量,过滤器大小,网络结构等参数都已在步骤1之前得到修复,并且在训练过程中不会发生变化 —— 只更新过滤器矩阵和连接权重的值。
步骤5: 对训练集中的所有图像重复步骤2-4。
上述步骤 训练 出的卷积神经网络 —— 这实际上意味着卷积神经网络的所有权重和参数现在已经过优化,可以正确分类来自训练集的图像。
当一个新的(未见过的)图像被输入到卷积神经网络中时,网络将经前向传播并输出每个类的概率(对于新图像,输出概率使用经过正确分类所有以前的训练样例的优化过的权重来计算)。 如果我们的训练集足够大,网络将很好地推广到新图像并将它们分类为正确的类别。
注1: 上述步骤过于简单,省去了数学细节,以便为训练过程提供直观的解释。 有关数学公式和深入地理解 请参见[ 4 ]和[ 12 ]。
注2: 在上面的例子中,我们使用了两组交替的卷积和池化层。 但请注意,这些操作可以在一个卷积神经网络中重复多次。 事实上,今天一些表现最好的卷积神经网络拥有数十个卷积和池化层! 此外,在每个卷积层之后没有必要具有池化层。 从下面的 图16 中可以看出, 在进行卷积操作之前,我们可以连续进行多次卷积 + ReLU操作。在下面的图16中还要注意卷积神经网络的每一层如何显示的。
图16
一般来说,我们拥有的卷积步骤越多,我们的网络能够学会识别的功能就越复杂。 例如,在图像分类中,卷积神经网络可以从第一层中学习检测原始像素边缘,然后在第二层中使用边缘检测简单形状,然后使用这些形状来检测更高级别的特征,例如面部形状在较高层[ 14 ]。 这在 下面的 图17 中 得到了证明 —— 这些特征是使用 卷积深度信念网络学习的 ,这里的图仅用于演示这个想法(这只是一个例子:实际上卷积过滤器可能检测出对人们来说没有意义的对象) 。
图17:来自卷积深度信念网络的学习特征
Adam Harley 创建了一个在手写数字MNIST数据库上训练的卷积神经网络的可视化[ 13 ]。 我强烈建议你 使用它 来了解CNN工作的细节。
我们在下图中可以看到神经网络对于输入数字“8”的操作细节。 请注意, 图18 中 的可视化 不会单独显示ReLU操作。
图18:可视化在手写数字上训练的卷积神经网络。
输入图像包含1024个像素(32×32图像),并且第一个卷积层(卷积层1)通过将六个唯一的5×5(步幅1)过滤器与输入图像卷积而形成。 如图所示,使用六个不同的过滤器产生深度为六的特征图。
卷积层1之后是池化层1,它在卷积层1中的六个特征图上分别进行2×2最大池化(步长2)。你可以将鼠标指针移动到池化层中的任何像素上,并能观察到它来自于2 x 2网格在前一个卷积层中的作用(如图19所示)。你会注意到2 x 2网格中具有最大值(最亮的一个)的像素成为池化层的像素。
图19:可视化池操作。
池化层1之后是16个5×5(步长1)卷积过滤器,它们执行卷积运算。 接下来是池化层2,它执行2×2最大池化(步长为2)。 这两层的作用与上述的相同。
然后我们有三个全连接(FC)层。 有:
第一个FC层中有120个神经元
第二个FC层中有100个神经元
第三个FC层中的10个神经元对应于10个数字 —— 也称为输出层
请注意,在图20中 ,输出层中的10个节点中的每个节点都连接到第2个全连接层中的100个节点(因此名称为“全连接”)。
另外,请注意输出层中唯一的明亮节点如何对应于'8' —— 这意味着网络正确地对我们的手写数字进行分类(较亮的节点表示其输出较高,即8在所有其他数字中的概率最高)。
图20:可视化全连接层。
此处 提供了相同可视化的三维版本 。
自20世纪90年代初以来,卷积神经网络就已存在。 我们讨论了上面的LeNet,它 是最早的卷积神经网络之一。 其他一些有影响力的架构列在下面[ 3 ] [ 4 ]。
LeNet(20世纪90年代): 本文已经介绍过。
20世纪90年代至2012年: 从20世纪90年代末到2010年初,卷积神经网络正在孵化。 随着越来越多的数据和计算能力的提高,卷积神经网络可以解决的任务变得越来越有趣。
AlexNet(2012) - 2012年,Alex Krizhevsky(以及其他人)发布了AlexNet ,它是LeNet的更深和更广泛的版本,并在2012年以巨大优势赢得了困难的ImageNet大规模视觉识别挑战赛(ILSVRC)。它是对于以前的方法的一个重大突破,当前CNN的广泛应用都归因于这项工作。
ZF Net(2013) - 2013年 ILSVRC冠军是来自Matthew Zeiler和Rob Fergus的卷积网络。它被称为ZFNet (Zeiler&Fergus Net的简称)。它是AlexNet基础上通过调整架构超参数进行的改进。
GoogLeNet(2014) - 2014年 ILSVRC获奖者是谷歌Szegedy等人 的卷积网络。 它的主要贡献是开发了一个 初始模块 ,它大大减少了网络中的参数数量(4M,与AlexNet相比,60M)。
VGGNet(2014年) - 2014年ILSVRC 的亚军是被称为VGGNet 的网络 。 它的主要贡献在于表明网络的深度(层数)是良好性能的关键组成部分。
ResNets(2015) - 由Kaiming He(和其他人)开发的 残余网络 是ILSVRC 2015的获胜者.ResNets目前是迄今为止最先进的卷积神经网络模型,是在实践中使用卷积神经网络的默认选择(截至2016年5月) 。
DenseNet(2016年8月) - 最近由黄高(和其他人)发布, 密集连接的卷积网络 使每一层以前馈方式直接连接到每个其他层。 事实证明,DenseNet在五项极具竞争力的物体识别基准测试任务中,比先前最先进的架构有了显着的改进。 在这里 查看Torch实现。
THE END
在这篇文章中,我试图用简单的术语解释卷积神经网络背后的主要概念。 有几个细节我过度简化/跳过,但希望这篇文章给你一些关于它们如何工作的直觉。
这篇文章最初的灵感来自 Denny Britz 的 理解卷积神经网络在自然语言处理上的运用(我建议阅读), 这里的一些解释都是基于这篇文章。若想对于一些概念更透彻的了解,我鼓励你去阅读 斯坦福大学的在卷积神经网络课程的笔记以及下文引用中提到的其他优秀的资源。 如果你在理解上述任何概念或遇到问题/建议时遇到任何问题,请随时在下面发表评论。
本文中使用的所有图像和动画属于各自的作者,如下面的参考文献部分所列。
karpathy/neuraltalk2: Efficient Image Captioning code in Torch, Examples
Shaoqing Ren, et al, “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”, 2015, arXiv:1506.01497
Neural Network Architectures, Eugenio Culurciello’s blog
CS231n Convolutional Neural Networks for Visual Recognition, Stanford
Clarifai / Technology
Machine Learning is Fun! Part 3: Deep Learning and Convolutional Neural Networks
Feature extraction using convolution, Stanford
Wikipedia article on Kernel (image processing)
Deep Learning Methods for Vision, CVPR 2012 Tutorial
Neural Networks by Rob Fergus, Machine Learning Summer School 2015
What do the fully connected layers do in CNNs?
Convolutional Neural Networks, Andrew Gibiansky
A. W. Harley, “An Interactive Node-Link Visualization of Convolutional Neural Networks,” in ISVC, pages 867-877, 2015 (link). Demo
Understanding Convolutional Neural Networks for NLP
Backpropagation in Convolutional Neural Networks
A Beginner’s Guide To Understanding Convolutional Neural Networks
Vincent Dumoulin, et al, “A guide to convolution arithmetic for deep learning”, 2015, arXiv:1603.07285
What is the difference between deep learning and usual machine learning?
How is a convolutional neural network able to learn invariant features?
A Taxonomy of Deep Convolutional Neural Nets for Computer Vision
Honglak Lee, et al, “Convolutional Deep Belief Networks for Scalable Unsupervised Learning of Hierarchical Representations” (link)
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~