卷积神经网络新手指南之二
引言
本文将进一步探讨有关卷积神经网络的更多细节,注:以下文章中部分内容较为复杂,为了保证其简明性,部分内容详细解释的研究文献会标注在后。
步幅和填充
让我们看回之前的转换层,在第一部分中我们提到过过滤器、接受场。现在,我们可以通过改变2个主要参数来校正每一层的行为。在选择过滤器大小之后,我们也必须选择“步幅”和“填充”。
步幅控制着过滤器如何进行卷积。在第一部分中我们有提到一个例子,过滤器围绕输入体量通过一次移动一个单位进行卷积。过滤器移动的总量即步幅。步长通常以一个方法进行设置使输出量是一个整数,而不是一个分数。让我们看看一个例子,想象一个7×7输入体量,一个3×3过滤器(出于简化角度考虑忽略第三维度),另外还有一个步幅1。这个就是我们习惯的情况。
是不是和之前的一样?你还可以尝试猜测下当步幅增加到2,输出量会发生什么情况。
因此,正如你所看到的那样,接受场正在以2个单位进行移动,同时输出量也会减少。注意如果我们试图将我们的步幅设置为3,那么其在间距和确保接受场适合的输入量两个方面会出现问题。通常情况下,如果程序员希望接受场重叠更少以及更小的空间尺寸的话,他们通常会增加步幅。
现在我们来接着关注填充,在正式开始之前,让我们设想一个场景。当你将三个5×5×3的过滤器应用到一个32×32×3的输入体量中时会发生什么?
注意空间维度会降低。当我们持续应用卷积层时,体量的大小将减少得比我们想的快。在我们神经网络的早期层中,我们要保存尽可能多的原始输入信息,以便我们可以提取这些低阶特征。我们想要应用同样的卷积层,但我们想将输出量保持在32 x 32 x 3。要做到这个,我们可以将大小为2的零填充(zero padding)应用到该层。零填充(zero padding)在边界周围填充了值为零的输入量。如果我们考虑大小为2的零填充(zero padding),那么这将导致在一个36×36×3输入量。
如果有1的步幅并且将零填充(zero padding)的大小设置为
K是过滤器大小,输入和输出量将会一直保持同样的空间维度
对于任何给定的卷积层输出大小的计算公式
O是输出大小,K是过滤器大小,P是填充,S是步幅。
选择超参数
我们怎么确定需要用多少层、多少卷积层、过滤器的大小是什么,或者步幅和填充的值?这些都是重要的问题,并且没有一套所有的研究人员都在使用的标准。这是因为神经网络在很大程度上取决于你所拥有的数据类型。数据大小因为图像的复杂性、图像处理任务的类型以及更多因素而千差万别。当你看着自己的数据集时,选择超参数的一种方式是发现在一个适当的范围创造图像抽象的正确组合。
修正线性单元(ReLU)层
在每个卷积层后,习惯在其后马上添加一个非线性层(或激活层)。这一层的目的是将非线性引入系统,基本上是在卷积层进行线性运算(只是元素的乘法和累加)。在过去都是像tanh 或者sigmoid的线性算法,但研究人员发现ReLU层效果更好,因为网络训练速度能加快很多(因为计算效率)且精度没有显著差异。它也有助于缓解消失的梯度问题,这是因为网络训练较低层的速度非常缓慢,梯度通过不同的层级指数下降。ReLU层的采用的函数f(x)= max(0,x)所有值的输入量。基本上,这一层将所有的负激活变成了0。这一层提高了模型的非线性特性,且整体网络不影响卷积层的接受场。感兴趣的还可以参看深度学习之父Geoffrey Hinton的论文Geoffrey Hinton
池化层(Pooling Layers)
经过一些ReLU层之后,程序员可以选择池化层,它也被称为下采样层。在这一类别中,也有几种层可供选择,但maxpooling(最大池化层)是最受欢迎的。它需要一个过滤器(通常大小2×2)和一个相同的步幅长度,然后将其应用在过滤器卷积周边每一个分区的输入和输出的最大量处。
池层的其他选项(pooling layers)还有是平均池(average pooling)和 L2-norm pooling。这层背后的原因是一旦我们知道一个特定的特性是其原始输入量(将有一个高激活值),那么其确切位置不重要的。可以想象,这一层大大降低了输入体积的空间维度(长度和宽度的变化,但不是深度)。这样做有两个主要目的,首先是参数或权重的量减少了75%,从而降低了计算成本。其次,它能够控制过度拟合。这个术语是指当一个模型针对训练例子如此调整的话,它是不能够概括验证和测试集的。过度拟合的特征是有一个模型能得到100%或99%的训练集,但只有50%的测试数据。
降层(Dropout Layers)
降层在神经网络中有一个十分特别的功能。在上一节中,我们讨论了过度拟合的问题。在训练之后,网络的权重被调整到给定的训练样本上,这样的话当给定新的样本时神经网络的表现并不好。降层这个理念在自然中过分单纯的。
降层通过在前向传播过程中将其设置为零在该层中随机“抛弃”一些激活,就是这么简单。在这个过程中这样做有什么好处呢?在某种程度上,它迫使网络变成“多余”的。即使一些激活在过程中被抛弃,神经网络也应该能够对特定样本提供正确的分类或者输出。它确保网络对于训练数据不会过于“合适”,从而有助于缓解过度拟合的问题。重要的一个这一层只在训练过程中使用,而不是在测试中。
网络层网络
网络层网络指的是一个使用1 x 1大小的过滤器的卷积层。现在,第一眼你可能会想知道为什么这种类型的层会有帮助,因为接受场通常是大于他们映射空间的。然而,我们必须记住这些1×1卷积跨度有一定的深度,所以我们可以认为它是一个1 x 1 x N的卷积,其中N是该层中过滤器应用的数量。实际上这层是执行一个N-D 元素级的相乘,其中N是输入量成层深度。
分类,定位,检测,分割
在这节中我们使用第一部分曾提到过的例子,来看一下图像分类任务。图像分类任务是将输入图像识别并输入一系列的图像类别的过程,然而当我们将对象定位作为任务时,我们的工作不仅是得到一个分类标签,另外还需要划定一个对象在图像中的范围。
同样还有对象检测任务,需要将图像中所有对象进行图像定位任务。因此,在图像中将会有多个划定范围还有多个分类标签。
最后,还有对象分割任务,对象分割任务指的是输出一个类的标签,以及输入图像中的每一个对象的轮廓。
迁移学习(Transfer Learning)
目前在深度社区的一个常见的误解是:没有谷歌那样的数据量的话,不可能建立一个有效的深度学习模型。虽然数据确实是创建神经网络的一个重要组成部分,但是迁移学习的理念能够有助于减少数据的需求。迁移学习是经过一个预先训练的模型(网络的权重和参数已通过一个大数据集或者别人训练),并且用你自己的数据集进行“微调”的过程。这个理念就是预先训练的模型将作为一个特征提取器,将网络的最后一层删除并用自己的分类器替换它(取决于您的问题空间)。然后冻结所有其他层的权重,并正常训练网络(冻结层意味着在梯度下降/优化过程中能够不改变权重)。
让我们来弄清楚为什么这样会有用,举例来说我们在ImageNet上的预先训练模型(ImageNet是一个数据集,包含超过1000类的1400万幅图像)。当我们考虑网络的低层时,我们知道他们会检测到边缘和曲线等特征。现在除非你有一个非常独特的问题空间和数据集,你的网络也会需要检测曲线和边缘。与其通过一个随机初始化的权重来训练整个网络,我们可以使用预先训练的(并冻结)模型的权重,并专注于更重要的(更高的)层级的训练。如果你的数据集与ImageNet等完全不同,那么你就要多培养你的层并冻结一些低级层。
PS : 本文由雷锋网(公众号:雷锋网)独家编译,未经许可拒绝转载!
via Adit Deshpande
雷锋网原创文章,未经授权禁止转载。详情见转载须知。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/60493.html