[译]CS231n 卷积神经网络对于图像识别的应用--(一)(CS231n Convolutional Neural Networks for Visual Recognition)

卷积神经网络(CNNs/ConvNets)

卷积神经网络与上一章的普通神经网络非常相似:它们由具有可学习的权重和偏差的神经元组成。每个神经元接收一些输入,执行点积并且可选地以非线性跟随它。整个网络仍然表示单个可微分的分数函数:从一端的原始图像像素到另一端的各类别得分。 他们在最后一个(完全连接)层上仍然有一个损失函数(例如SVM / Softmax),并且我们学习正规神经网络开发的所有技巧仍然适用。

那么有什么地方有区别? ConvNet架构明确假设输入是图像,这允许我们将某些属性编码到架构中。 这些使得前向功能更有效地实现并大大减少网络中的参数数量。

概述

回顾:常规神经网络。 正如我们在上一章中所看到的,神经网络接收一个输入(单个矢量),并通过一系列隐藏层进行变换。 每个隐藏层由一组神经元组成,其中每个神经元完全连接到前一层中的所有神经元,并且其中单个层中的神经元完全独立地运行并且不共享任何连接。 最后一个完全连接的层被称为“输出层”,在分类问题中它的输出代表每个类的得分。

常规神经网络不能很好地处理完整图像规模的问题。在CIFAR-10中,图像仅具有尺寸32×32×3(32宽,32高,3个颜色通道),因此在常规神经网络的第一隐藏层中的单个完全连接的神经元将具有32×32×3 = 3072个权重 。 这个数量仍然是可接受的,但很明显的是,这个完全连接的结构不能扩展到更大的图像。 例如,有更大尺寸的图像,比如:200x200x3,将导致具有200 * 200 * 3 = 120,000个权重的神经元。 此外,我们几乎肯定希望有几层这样的全联接神经元,所以参数会更多! 显然,这种完全连接是很浪费的,并且大量的参数将很快导致过度拟合。

3D卷积神经元: 卷积神经网络充分利用了输入是图像的这个前提,以更敏感的方式来设计网络结构。特别不同于常规神经网络的是,ConvNet的层具有以3维排列的神经元:宽度,高度,深度。(注意,这里的词深度指的是卷积层的第三维,而不是指完整神经网络的深度,完整网络的深度是指网络中的总层数。)

例如,在CIFAR-10中的输入图像,是一个激活层,并且该层的体积有具体的尺寸32x32x3(分别是宽度,高度,深度)。正如我们将很快看到的,层中的神经元将仅连接到其之前的层的小区域,而不是以完全连接的方式连接到所有神经元。此外,对于CIFAR-10的最终输出层具有尺寸1x1x10,因为在ConvNet架构的结尾,我们将把整个图像缩小为沿着深度维度排列的类分数的单个向量。 这里是一个可视化表示:
常规卷积
上:一个常规的3层神经网络。 下:ConvNet在三维(宽度,高度,深度)中布置其神经元,上图中我们选取了一个层来可视化展示。 ConvNet的每一层都将3D形式的输入转换为3D形式的输出,并激活后续的神经元。 在此示例中,红色输入图层保存图像,因此其宽度和高度将是图像的尺寸,深度将为3(红色,绿色,蓝色通道)。


在神经网络中,卷积是用层来实现的。每一层相当于有一个API(译者:理解为每一层有一个固定抽取特征的方法):它将输入的3D形式的参数代入一个可微方法,得到一个3D形式的输出。

用于构建CNN的层

如上所述,一个简单的ConvNet是一系列层,ConvNet的每一层通过可微函数将一个卷的激活转换为另一个卷。 我们使用三种主要类型的层来构建ConvNet体系结构:卷积层,池层和完全连接层(正如在常规神经网络中看到的)。 我们将堆叠这些层以形成一个完整的ConvNet架构。

例子概述:接下来我们看一个构建CNN的例子,CIFAR-10 中的CNN可以是这个结构的:[输入层(INPUT)-卷积层(CONV)-RELU激活层-池层(POOL)-全联接层(FC)],更具体的介绍如下:

  • INPUT [32x32x3]将保持图像的原始像素值,在这种情况下是宽度32,高度32和具有三个颜色通道R,G,B的图像。
  • CONV层将计算连接到输入中的局部区域的神经元的输出,对每组局部连接将计算连接的权重和对应输入的点积。 如果我们决定使用12个过滤器,这可能会导致输出的形式变为[32x32x12]。
  • RELU层会对上一层的输出应用激活函数max(0,x),经过RELU之后,数据的大小不变化——仍是[32x32x12]
  • POOL层将沿着空间维度(宽度,高度)执行下采样(压缩)操作,从而产生诸如[16×16×12]的输出结果。
  • FC(即完全连接)层将计算各类别得到的分数,输出的形式为[1x1x10],其中10个数字中的每一个对应该类别的分数,例如CIFAR-10的10个类别。 与普通神经网络一样,顾名思义,该层中的每个神经元都将连接到前一卷中的所有节点。

这样,ConvNets将原始图像逐层从原始像素值转换为最终的各类的分数。 注意,一些图层包含参数,而其他图层不包含。 特别的是,CONV / FC层执行的变换不仅是输入体积中的激活,而且是参数(神经元的权重和偏差)的函数。 另一方面,RELU / POOL层将实现固定功能。 CONV / FC层中的参数将使用梯度下降进行训练,以便ConvNet计算的类别分数与每个图像的训练集中的标签一致。

总结:
- ConvNet架构在最简单的情况下是将图像输入转换成输出,输出通常是各类的分数
- 其中有可能包含几个不同种类的层。(例如流行的:CONV / FC / RELU / POOL)
- 每个层接受一个3D形式的参数,并通过可谓函数将其转换为一个3D形式的输出。
- 每个层可能有也可能没有参数(如,CONV/FC有参数,RELU/POOL没有参数)
- 每个层可能有也可能没有超参数(如,CONV / FC / POOL有,RELU没有)
图
以上是一个卷积神经网络的激活例子。左侧是输入的原始图像,右侧输出的是各分类的分数。每组变量的沿处理路径的处理过程体现在一列中。因为3D类型的变量不容易可视化展示,我们把每个切片展示在一行中。最后一层产出每个分类的得分,因为篇幅所限,只显示前5得分的分类。


我们现在来看各个层和他们的超参数(贝叶斯方法中,控制模型参数分布的参数,被称为超参数)和连接的信息。

卷积层

Conv层是卷积网络的核心构建块,它完成大部分计算繁重的工作。

概述。让我们首先讨论撇开神经网络理论来看卷积层的功能。 卷积层的参数包括一组可学习的过滤器。每个过滤器是一个小空间(有长宽深),它会延伸处理整个输入。例如,ConvNet的第一层上的有一个大小5X5X3的经典过滤器(即,5个像素的宽度和高度,以及因为图像具有深度3个颜色通道,因此有3的深度)。在运算期间,我们在输入的宽度和高度上滑动(更准确地说是卷积)使用每个滤波器,并计算在各个位置处的滤波器自身和(滤波器覆盖的面积内的)输入之间的点积。当我们在输入图片的宽度和高度上滑动滤波器时,我们将产生一个二维激活图,给出该滤波器在各个空间位置的产出。直观地看,网络会学习在出现某些特征时被激活的过滤器(例如,第一层上某种方向的边缘或者某种颜色的斑点,或者较高层上出现的整个蜂窝状或者轮状图案)(译注:即是从神经网络的角度看,某些过滤器的激活意味着出现了某个特征,网络可以通过学习这些过滤器的激活情况来记忆这个特征)。现在,我们将在每个卷积层中使用一整套过滤器(例如12个过滤器),并且他们中的每一个将产出一个2维激活图像,我们将沿着深度维度(RPG或灰度)堆叠这些激活图,并产生(三维的)输出。

在神经网络角度。如果你是喜欢神经网络的人,3D输出中的每一个值也可以被解释为一个神经元的输出,它只查看输入中的一个小区域,并与同一过滤器中的所有神经元共享参数(因为这些数字都源于应用相同的滤波器)。我们现在讨论神经元连接的细节,它们在空间中的排列,以及它们的参数共享方案。

局部连接。当处理高维输入如图像时,如上所述,将神经元连接到先前体积中的所有神经元是不切实际的。相反,我们将每个神经元连接到输入体积的局部区域。这种连接的空间范围是称为神经元的接受场的超参数(即,过滤器大小)。过滤器的深度即输入的深度。再次强调如何处理空间维度(宽、高)和深度维度的不对等性:连接在空间(宽、高)上是局部的,但总是处理输入的整个深度。(译注:就像用一个激光扫描仪处理一个木板,每次都处理木板上的一小块面积以及这块面积对应的厚度——也就是整块木板的厚度。

示例1. 假设输入图片大小为[32x32x3](例如,RGB CIFAR-10的图像)。如果过滤器大小为5×5,则卷积层中的每个神经元将具有到输入图片中的[5×5×3]区域的连接和对应权重,总共5×5×3 = 75个权重(和+1偏差参数)。请注意,沿深度轴的大小必须为3,因为这是输入的深度。

示例2.假设输入图片的大小为[16x16x20]。然后使用3×3的滤波器,卷积层中的每个神经元现在将具有与输入音量的总共3×3×20 = 180个连接。注意,连接在空间上是局部的(例如3×3),但是沿着输入深度(20)是完整的。


图图

上图:红色的表示一个示例的输入变量(例如,一张32x32x3 的CIFAR-10图像),蓝色的是第一卷积层,以及卷积层中的神经元。卷积层中的每个神经元在空间上仅连接到输入体中的局部区域,并连接到全深度(即,所有颜色通道)。注意,沿着深度存在多个神经元(在该示例中为5个)(译注:有5个过滤器?),所有神经元都在输入中查看相同的区域 - 参见下文中关于深度列的讨论。

下图:来自神经网络卷的神经元保持不变:他们仍然计算它们的权重的点积,随后是一个非线性激活函数,但是它们的连通性现在局限于局部空间。


空间布局。我们已经解释了Conv层中每个神经元到输入值的局部连接性,但是我们还没有讨论输出值中有多少个神经元或者它们是如何排列的。三个超参数控制输出体积的大小:深度,步幅和零填充(边际填充)。我们下面将讨论这些:

  1. 首先,输出的深度是一个超参数:它对应于我们想要使用的过滤器的数量,每个滤波器都在学习着从输入中寻找不同的特征。例如,如果第一卷积层采用原始图像作为输入,则沿着深度维度的不同神经元(译注:不同的过滤器)可以在存在各种定向边缘或颜色块的情况下激活。我们将一组对应同一区域的神经元叫做深度列(一些人也喜欢术语维度)。

  2. 第二,我们必须指定我们滑动过滤器的步幅。当步幅为1时,我们一次移动过滤器一个像素。当步幅是2时(或不常见的3或更多,虽然这在实践中很少见),过滤器一次跳跃2像素。(步幅为2)将在空间上产生较小的输出量。

  3. 正如我们将很快看到的,有时在图片周围一圈填充入0值是方便我们进行卷积运算的。该零填充的大小是由超参数指定的。零填充的好处是,它将允许我们控制输出卷的空间大小(最常见的是,我们将使用它来精确保留输入卷的空间大小,使得输入和输出宽度和高度相同)(译注:可以用它来保留图片边角的信息和特征)。

我们可以根据输入空间的大小(W)计算出输出的空间大小,卷积层各神经元的输入大小(F),步幅(S),以及在边框上使用的零填充的数量(P)。卷积层要用多少神经元可以用这个公式算出:(W-F + 2P)/ S + 1。例如,对于7x7输入,具有步幅=1和填充域=0的3x3滤波器,我们将得到5x5的输出。使用步幅2,我们将得到一个3x3的输出。让我们再看一个图形的例子:


这里写图片描述
上图是一个空间布局的例子。在该示例中,仅存在一个空间维度(x轴),输入大小是W = 5,一个神经元具有F = 3的输入域大小,并且P = 1的零填充。左: (5 - 3 + 2)/ 1 + 1 = 5的输出。右:神经元使用S = 2的跨度,给出大小为(5 - 3 + 2) / 2 + 1 = 3.请注意,步幅S = 3不能使用,因为它使过滤器不能完全覆盖到整个输入。在等式中可以证明,因为(5-3 + 2)= 4不能被3整除。

在这个例子中,神经元权重为[1, 0,-1](如右图所示),其偏差为零。这些权重在所有黄色神经元之间共享(参见下面的参数共享)。


使用零填充。在上面左边的例子中,注意输入维度是5,输出维度是相等的:也是5。这是因为我们的连接域(过滤器的大小)是3,我们使用的零填充为1。如果没有使用零填充,则输出将具有仅为3的空间维度,因为这是最“适用”于这个输入的输出数。因此通常,当步幅为S = 1时,将零填充设置为P =(F-1)/ 2确保输入域和输出域在空间上具有相同的大小。以这种方式使用零填充是非常常见的,当我们更多地讨论ConvNet架构时,我们将讨论这样做的全部原因。

步幅的约束。再次注意,空间布置超参数是相互约束的。例如,当输入具有大小W = 10时,不使用填充P = 0,并且滤波器大小是F = 3,则不可能使用步长S = 2 ,因为(W-F + 2P)/ S + 1 =(10-3 + 0)/2+1=4.5,不是整数,神经元不能“整”且对称地覆盖输入。因此,超参数的这种设置被认为是无效的,并且ConvNet库可以通过抛出异常或零填充以使其适合,或者裁剪输入以使其适合。正如我们将在ConvNet架构部分中看到的,适当调整ConvNets的大小,以便所有的维度“工作”可以是一个头痛的问题,使用零填充和一些设计指南将大大方便我们解决这个问题。

实际例子Krizhevsky et al。这是一个在2012年赢得ImageNet挑战的架构,接受[227x227x3]尺寸的图像作为输入。在第一卷积层上,它使用具有接收域大小F = 11,跨度S = 4并且没有零填充P = 0的神经元。由于(227-11)/ 4 + 1 = 55,并且由于Conv层具有K = 96的深度,因此Conv层输出体积具有尺寸[55×55×96]。55 * 55 * 96中每个神经元连接到输入体积中大小为[11×11×3]的区域。此外,每个深度列中的96个神经元连接到输入的相同[11×11×3]区域,当然没个神经元具有不同的权重。有趣的是,如果你看的是实际的论文,如果它声称输入图像是224x224这是肯定不正确的,因为(224 - 11)/ 4 + 1很明显不是一个整数。这在ConvNets的历史中混淆了许多人,很少人知道发生了什么。我自己最好的猜测是,Alex使用零填充的3个额外的像素,他没有在说明中提到。

参数共享。参数共享方案在卷积层用以控制参数的数量。使用上面的真实例子,我们看到在第一Conv层中有55 * 55 * 96 = 290,400个神经元,并且每个具有11 * 11 * 3 = 363个权重和1个偏差。总而言之,这在ConvNet的第一层上增加了290400 * 364 = 105705,600个参数。显然,这个数字非常高。

事实证明,通过做一个合理的假设,我们可以显著地减少参数的数量:如果一个特征对于在某个位置(x,y)处的计算是有用的,则它应当在另一位置(x2,y2)处也是有用的。换句话说,将深度列中的每个输出叫做一个深度切片(例如,尺寸[55×55×96]的卷具有96个深度切片,每个尺寸为[55×55]),我们将约束每个深度切片中的神经元使用相同的权重和偏差。使用此参数共享方案,在我们的示例中的第一卷积层现在将仅具有96个唯一的权重集合(每个深度切片一个),总共96 * 11 * 11 * 3 = 34,848个唯一权重,或34,944个参数+96偏差)。或者说,每个深度切片中的所有55 * 55个神经元现在将使用相同的参数。实践中,在反向传播期间,空间中的每个神经元都将计算其权重的梯度,但是这些梯度将只在各个深度切片上累加,并且仅更新每个切片对应的那组权重。

注意,如果一个深度切片中的所有神经元都使用相同的权重向量,则卷积层的计算则可以看做是神经元的权重集和输入变量之间的卷积(由此得名:卷积层)。这就是为什么我们通常将与输入进行卷积运算的权重集称作过滤器(或内核)。


TBC

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值