A Beginner's Guide To Understanding Convolutional Neural Networks Part 2

来源:互联网 发布:淘宝游戏账号出售 编辑:程序博客网 时间:2024/05/22 14:52

Introduction

        本文将会更加详细地介绍卷积网络。声明:现在我意识到有些内容相当复杂,甚至需要用一整篇文章才能解释清楚。为了内容详尽的同时尽量保证文章精简,我会将有关内容的参考文献链接到本文中。

Stride and Padding

        好的,让我们回忆一下我们的老朋友卷积层。还记得那些滤波器、感知区、卷积吗?现在让我们介绍两个卷积层中的重要参数。步长stride和填充padding。

        步长stride主要用于控制滤波器在输入图像上的卷积行为。如下图例子所示,滤波器在图像上的卷积是每次卷积计算后平移一定距离再次计算。这个距离就是通过步长stride来进行控制的。在这个例子中,步长stride设为1。通常来说,步长stride参数的选择需要考虑到这个步数能够被整除。让我们看一下图中的这个例子:设输入为7*7的图像,滤波器尺寸为3*3(同样忽略了第三维),设定步长为1,那么输出就应该是下图右边的5*5图像。



        还是老样子,不是吗?想想如果我们把步长stride设为2的情形。


        那么,感知区每次就会平移两个单位(像素),那么输出自然就相应的缩小为3*3了。如果我们想要把步长stride设为3,那么在进行卷积时就会有空间上的问题了,同时也难以保证感知区在平移时是否还处于图像内(译者:原因是步数不能整除?)。通常,在设计卷积层时,步长stride越大,那么感知区的重叠就越小,同样地输出的图像也越小。

        现在,让我们看一下填充padding参数。先想象一下这样的场景。当你使用3个5*5*3的滤波器对一个32*32*3的输入图像滤波,那么输出图像应当是28*28*3。注意空间尺寸变小了。然后我们把这个图像再次放入卷积层,会发现尺寸更小了。事实上,在整个网络的开始几层,我们并不希望尺寸缩水得这么快。我们希望能够尽量保留下这些输入图像的信息,才能够比较好地提取底层特征。也就是说,我们想要保证输出仍然是32*32*3。为了实现这个目的,我们在卷积层上引入了尺寸为2的零填充zero padding。它能够在输入图像的边界上形成一层宽度为2,值为0的边界。那么输入图像就变成了36*36*3。如下图所示。

        若设定步长stride为1,同时零填充zero padding的尺寸为:

 

        式中K为滤波器尺寸。那么输入和输出图像的尺寸就会永远保持一致。

        卷积层的输出图像的尺寸可以通过下面公式得出:

        式中O是输出宽/高,W是输入宽/高,K为滤波器尺寸,P为填充padding尺寸,S为步长stride。

Choosing Hyperparameters

         我们该怎样确定在一个系统中,卷积层的数量、滤波器的尺寸、或是步长stride、填充padding这些参数呢?这些可不是细枝末节的问题,另外这些问题也没有一个放之四海而皆准的答案。这是因为系统参数的设定主要取决于你的数据类型。数据的大小、图像的复杂度、图像处理的目的和方式等,都会随着处理目的的不同而发生变化。选择超参数的正确做法是,在检视数据集时通过抽象概念将数据/图像以合适的尺度正确组合起来。

ReLU (Rectified Linear Units) Layers

        按照惯例,每个卷积层之后都紧跟一个非线性层(或激活层activation layer)。由于系统在卷积层的计算主要为线性操作(像素/元素级的乘法和加法计算),因此这层的主要目的在于为系统引入非线性性。在过去,研究人员主要利用双曲正切tanh或S函数sigmoid作为非线性函数进行处理,后来大家发现线性整流层ReLU效果更佳,由于其计算效率能够大大加快整个系统训练的速度。同时它能减轻梯度消失问题vanishing gradient problem,这个问题主要出现在训练时,由于梯度呈指数下降而导致的底层训练十分缓慢的问题(要解释这个问题的话,将会偏离本文的主题,因此请参考这里 here and here )。线性整流层ReLU将输入图像的所有元素通过这样的一个整流函数:f(x) = max(0, x) 。从术语的角度上,本层将所有负激活negative activations都改为0,由此提高了模型与整个系统的非线性特性,而不会影响到卷积层的感知区。

        相关信息可参考Geoffrey Hinton大神(也就是深度学习之父)的论文Paper。

Pooling Layers

        通过线性整流层ReLU处理后,研究人员可能会在其后添加一个池化pooling层,也叫下采样downsampling层。这同样有许多可选的方法,其中最常用的是最大池化maxpooling方法。这种方法定义一个最大值滤波器(通常2*2)以及对应长度的步长stride,然后对输入图像进行滤波输出滤波器经过的每个子区域的最大值。如下图。


        池化层也可以用均值或L2范数(L2-norm,欧氏距离)来计算。池化层的直观意义在于,从输入图像中获取到某个特征(会有较高的激活值activation value),它与其它特征的相对位置比其自身的绝对位置更加重要。从图中不难看出,池化层大大降低了输入图像的空间维度(宽和高,不包括深度)。这就达到了两个目的。首先,参数/权重的个数降低为原来的1/4,计算量相应减少了。第二,它能够防止过拟合overfitting。过拟合表示为由于过度的调优导致模型过于执着满足样本的特征(可能有些是局部特征)而失去了泛用性,从而难以识别其它数据。过拟合overfitting的一个征兆就是,模型在训练集上能获得99%或100%的精确度但在测试数据上仅有50%。

Dropout Layers

        在神经网络中,丢包层dropout layer有一个非常特殊的函数。在上一节,我们介绍了过拟合overfitting问题,当训练完成后,由于对训练集过度调优导致的系统对新数据的识别效果不好。实际上丢包层在前向传播的过程中,故意地把一些随机的激活特征activations设为0值,这样就把它们简单地“丢包”了。那么,这样一个看似不必要、违反常理的简单操作有什么好处呢?事实上,它强行地保证了整个系统的冗余性。也就是说,系统需要满足这样的情形:当输入数据的一部分激活特征activations缺失时,系统也能够将其正确识别。丢包层dropout能够保证系统不会跟训练集过于相似,从而从一定程度上解决过拟合overfitting问题。需要注意的是,丢包层dropout仅用于训练环节。

        更多信息请参考Geoffrey Hinton的文章:Paper.

Network in Network Layers

        网络中的网络层Network in Network(NIN)指的是一个拥有1*1大小滤波器的卷积层。初看你会奇怪网络层有什么用,它投影出来的感知区区域比待投影对象还大。但是,请记住滤波器还有一个维度:深度N。因此这是一个1*1*N的卷积操作。实际上,它进行了一次N-D逐像素乘法,其中N是输入数据的深度。(大概是用子网络结构代替原先的线性卷积)

        更多信息请参考Min Lin的文章:Paper.

Classification, Localization, Detection, Segmentation

        在我们之前的图像分类任务那个例子中,系统将输入的图像处理后输出其分类标签(或类别可能性数组)。但是,如果任务变成目标识别,那么除了需要进行分类外,还需要用一个框划出目标的具体位置。如图。


        另外在一些目标检测的任务中,图中所有目标的位置都需要确定。因此,就需要输出多个定位框和类别标签。

        更进一步地,在目标分割任务中,除开分类标签和定位之外,还需要系统能够将目标的边缘轮廓识别并描绘出来,如下图。


        关于这些算法的实现细节将在Part 3中介绍。如果想提前了解,可以参考如下文章:

        检测/定位算法: RCNN, Fast RCNN, Faster RCNN, MultiBox, Bayesian Optimization, Multi-region, RCNN Minus R, Image Windows

        分割: Semantic Seg, Unconstrained Video, Shape Guided, Object Regions, Shape Sharing

Transfer Learning

        许多人认为只有拥有了google级别的数据量才能训练好一个模型,这是一个常见的对深度学习的误解。诚然,数据量对于整个系统的搭建是至关重要的,然而我们还有迁移学习transfer learning的方法来缓解数据量的需求。迁移学习transfer learning是把已训练的模型(指其他研究人员利用其它大型数据集训练的模型及其参数/权重),利用自己的数据集进行参数调整的过程。方法思路在于,将已训练模型当作一个特征提取器feature extractor。我们需要把模型的最后一层(全连通层?)移除,替换为自己的分类器(取决于我们自己需要解决的问题空间)。然后,冻结其它层的权重/参数,并开展数据训练。冻结是为了防止在梯度下降/优化时参数的改变。

       让我们看看它是怎么工作的。假设我们提到的已训练模型是通过ImageNet进行训练的(ImageNet是一个拥有1400万数据量以及1000多个分类标签的数据库)。如同之前描述的,模型的底层通常是一些基本特征的提取,例如边缘和纹理等,这些特征信息在大部分图像处理问题都是必要的(除非你的问题空间和数据集非常独特)。当进行迁移学习transfer learning时,我们就可以使用这些具有共性的权重并保持它们的值,而不是设定一个随机的初始值,这样我们的训练就可以专注于更重要的层(通常是更高层)。当然,如果你的数据集跟已训练集有很大不同,那么你就需要冻结更少层的参数,而进行更多的训练。

        参考文献:

Paper by Yoshua Bengio (另一个深度学习先行者).
Paper by Ali Sharif Razavian.
Paper by Jeff Donahue.

Data Augmentation Techniques

        我们现在已经对卷积网络中数据的重要性非常清楚了,那么就谈谈该怎样通过一些简单的转换,进一步扩大我们的现有数据集。就像我们之前所说,当电脑输入一组数据(图像)时,输入的形式通常为灰度值数组。假设我们把整幅图像平移1个像素,从我们的角度来说,这种变化是几乎难以察觉的。但是,对电脑来说,若要保证不影响结果,这种变化就相当明显了。这种在保持结果不变的前提下修改训练数据表现形式的方法称为数据扩容方法data augmentation techniques。这是人工扩展数据集的方法。一些常用的扩容方法包括灰度扩展grayscales,水平翻转horizontal flips,垂直翻转vertical flips,随机裁剪random crops,颜色抖动color jitters,翻译(转化?)translations,旋转rotations等等。应用这些变换方法,我们可以很轻易地成倍扩展我们的数据集。

0 0
原创粉丝点击