摘要: 卷积神经网络是一种识别和理解图像的神经网络。本文将从不同的层次来介绍卷积神经网络。
手把手教你理解卷积神经网络(一)
本文将继续为你介绍关于卷积神经网络的知识。为了保持文章的简洁性和全面性我将为你提供研究论文的链接,里边会有更为详细的解释。
确定宽度和填充(Stride and Padding)
让我们看看转换层,还记得滤波器、接受域和卷积吗?现在我们可以改变两个主要参数来修改每层的运行状态。在选择滤波器大小之后,还要选择宽度和填充。
用宽度来控制滤波器如何在输入量的上下范围内进行卷积。例如,一个7*7的输入量,一个3*3的滤波器(忽略第三维度的简单性),宽度为1。
看看你是否能尽力猜出随着宽度增加到2,输出量会发生什么变化。
因此,正如你所看到的那样,接受域现在在两个单元之间来回变换,并且输出体积也缩小了。请注意,如果我们试图将宽度调整为3,那么我们就有间隔的问题了,还要确保接受域适合输入量。通常来说,开发者如果希望接受域重叠较少,并且希望有较小的空间维度,则会增大宽度。
让我们看看填充部分,但是在开始之前,让我们考虑一个场景。当你把三个5*5*3的滤波器应用到一个32*32*3的输入量时会发生什么呢?输出量会是28*28*3。注意,空间维度减少了。当我们保持应用转换层时,输出量的大小将比我们想象的减少的快。在我们网络的前面的那些层中,我们想尽可能多地保存原始输入量的信息,这样我们就可以提取那些低级的特性了。这样说吧,我们想应用同样的转换层,但想要的输出量要保持在32 x 32 x 3。要做到这一点,我们可以对该层应用一个大小为2的零填充。零填充在边界上以零为输入的量。如果我们考虑两个中的一个零填充,那么这将会导致一个36*36*3的输入量。
如果你有一个为1的宽度,并且你把零填充的大小设置为:
当滤波器的大小为K时,输入量和输出量将始终具有相同的空间维度。
对于任何给定的转换层的输出量的计算公式是:
上面的公式中,O是输出的高度/长度,W是输入的高度/长度,K是滤波器的大小,P是填充,S是宽度。
选择参数(Choosing Hyperparameters)
我们如何知道用了多少层,有多少转换层,滤波器的大小是多少,或者宽度和填充是什么值呢?这些问题我们都不知晓,因为网络将在很大程度上依赖于你的数据类型。数据可以根据大小、图像的复杂度、图像处理任务的类型以及更多的不同因素而变化。当看着你的数据集时,一个考虑如何选择参数的方式是在一个适当的规模找到正确的创建图像抽象的组合。
ReLU (被调整的线性单元)层
在每个转换层的后面,就是常规的应用非线性层(或激活层)。这一层的目的是非线性地引入一个系统,这个系统基本上是在转换层一直计算线性操作(只是元素方式的乘法和加法运算)。
在之前,一直用的是非线性函数,如tanh和sigmoid,但研究人员发现ReLU层的效率远远更好,这是因为在对精度没有产生显著不同的情况下,网络能训练的更快(因为计算效率更高)。它也有助于缓和消失梯度的麻烦,这是一个问题,因为较低层的网络训练是非常缓慢的,因为在这些层里梯度呈指数级别的下降层(解释这个问题可能超出了本文的范围,点击这里和这里来查看具体的解释和描述)。ReLU层调用函数f(x)= max(0,x)来提供输入量的所有值。基本上来说,这一层刚好改变所有的负激活为0。这一层在不影响转换层的接受域的情况下,提高了模型和整个网络的非线性的属性。
池化层(Pooling Layers)
经过一些ReLU层,开发者可以选择应用一个池化层,它也被称为缩减采样层。在这一类别中,也有其它几个层的选择,与最大池化(maxpooling)一起是最受欢迎的。这基本上需要一个滤波器(通常大小为2*2)和相同尺寸的宽度。然后将其应用于输入量和在每个有滤波器卷积的子区域中输出的最大数量。
池化层的其他选项是平均池化和L2-norm池化。这个层背后的直观理解是,一旦我们知道一个特定的特征是在原始输入量中(将会有一个高激活值),它的确切位置并不像它相对于其它特征的位置那么重要。可以想象,这一层极大地减少了输入量的空间维度(长度和宽度的变化,而不是深度)。这有两个主要目的。首先,参数或权重的数量减少了75%,从而降低了计算的成本。其次,它将控制过度拟合,这指的是当一个模型被调整到训练样本时,它不能很好地为验证和测试集进行标准化。过度拟合的表现是,有一个模型,在训练集上得到100%或99%的表现,但在测试数据上只有50%。
Dropout Layers
现在,Dropout Layers在神经网络中有一个非常特殊的功能。在上一节中,我们讨论了过度拟合的问题,训练结束后,网络的权重被调整到了已给的训练样本,当提供了新的训练样本时网络就执行的不那么好了。Dropout的想法在本质上是过于简单化的。这一层“删除”一个随机激活集,通过将它们设置为零。即使某些激活被删除了,网络也应该能够为特定的样本提供正确的分类或输出。它确保网络变得不“适合”训练数据,从而有助于缓解过度拟合的问题。一个重要的注意事项是,这一层仅用于训练期间,而不是在测试期间使用。
网络层的网络(Network in Network Layers)
网络层的网络指的是一个应用1 x 1大小的滤波器的转换层。首先,既然接受域通常要比它们映射到的空间大,你可能想知道为什么层的类型会有帮助。然而,我们必须记住,这些1x1卷积的跨度是有一定深度的,所以可以认为它是一个1 x 1 x N的卷积,其中N是滤波器在这一层中应用的数量。
分类、定位、检查、分割(Classification, Localization, Detection, Segmentation)
当我们执行一个类似于对象本地化这样的任务时,不仅仅是生成一个类标签,还包括一个用来描述对象在图片中位置的包围盒(bounding box)。
我们也有对象检测的任务,需要对图像中的所有对象进行定位。因此,将有多个包围盒和多个类标签。
最后,我们还进行了对象分割,其中的任务是输出一个类标签以及一个输入图像中每个对象的轮廓。
迁移学习(Transfer Learning)
现在,在深度学习社区的一个常见的误解是:没有超大的数据量,你不可能创建有效的深度学习模型。数据固然是创建网络的关键部分,但也不是决定部分,迁移学习的思想有助于减少数据需求。迁移学习是接受预训练模型(由其他人在大数据集上训练过的网络的权重和参数)并用自己的数据集对模型进行“微调”的过程。这个想法是这个预先训练的模型将作为一个特征提取器。你将删除网络的最后一层,并用自己的分类器来代替。然后冻结所有其它层的权重,并正常地训练网络(冻结这些层意味着在梯度下降/优化过程中不改变权重)。
我们正在探讨的是预训练模型在ImageNet上训练(ImageNet是一个数据集,在1000以上个类里包含1400万幅图像)。当考虑网络上那些较低的层时,我们知道它们将检测到像边缘和曲线这样的特征。现在,除非你有一个非常独特的问题空间和数据集,你的网络也将需要检测曲线和边缘。与其通过一个随机的权重初始化值来训练整个网络,我们可以使用预训练模型的权重,并致力于在更重要的层(更高的层)上进行训练。如果你的数据集与ImageNet完全不同,那么你就要训练更多的层并冻结两个较低的层。
数据扩展技术(Data Augmentation Techniques)
现在,我们可能对数据在卷积神经网络中的重要性没什么感觉了,因此让我们谈论一下让你的数据集变大的方法,仅仅是用两个简单的变换。正如我们前面提到过的,当计算机用一个图像作为输入时,它将输入一个像素值的数组。假设整个图像被左移1个像素。对你和我来说,这个变化是潜移默化的。然而,对于一个计算机来说,这一改变可能相当地重要,因为图像的分类或标签不会改变,而数组改变了。以改变数组表示的方式改变训练数据的方法,同时保持标签相同,称为数据扩展技术。这是一种人工扩展数据集的方法。人们使用的一些流行的扩展是灰度、水平翻转、垂直翻转、随作物、色恐慌、平移、旋转等等。通过将其中的两个转换应用到训练数据中,你就可以轻松地将训练样本的数量扩大一倍或三倍。
以上为译文。
文章原标题《A Beginner's Guide to Understanding Convolutional Neural Networks》,
译者:Mags,审校:袁虎。
原文链接
干货好文,请关注扫描以下二维码: