卷积神经网络¶
在前面的章节中,我们遇到过图像数据。 这种数据的每个样本都由一个二维像素网格组成, 每个像素可能是一个或者多个数值,取决于是黑白还是彩色图像。 到目前为止,我们处理这类结构丰富的数据的方式还不够有效。 我们仅仅通过将图像数据展平成一维向量而忽略了每个图像的空间结构信息,再将数据送入一个全连接的多层感知机中。 因为这些网络特征元素的顺序是不变的,因此最优的结果是利用先验知识,即利用相近像素之间的相互关联性,从图像数据中学习得到有效的模型。
本章介绍的卷积神经网络(convolutional neural network,CNN)是一类强大的、为处理图像数据而设计的神经网络。 基于卷积神经网络架构的模型在计算机视觉领域中已经占主导地位,当今几乎所有的图像识别、目标检测或语义分割相关的学术竞赛和商业应用都以这种方法为基础。
现代卷积神经网络的设计得益于生物学、群论和一系列的补充实验。 卷积神经网络需要的参数少于全连接架构的网络,而且卷积也很容易用GPU并行计算。 因此卷积神经网络除了能够高效地采样从而获得精确的模型,还能够高效地计算。 久而久之,从业人员越来越多地使用卷积神经网络。即使在通常使用循环神经网络的一维序列结构任务上(例如音频、文本和时间序列分析),卷积神经网络也越来越受欢迎。 通过对卷积神经网络一些巧妙的调整,也使它们在图结构数据和推荐系统中发挥作用。
在本章的开始,我们将介绍构成所有卷积网络主干的基本元素。 这包括卷积层本身、填充(padding)和步幅(stride)的基本细节、用于在相邻区域汇聚信息的汇聚层(pooling)、在每一层中多通道(channel)的使用,以及有关现代卷积网络架构的仔细讨论。 在本章的最后,我们将介绍一个完整的、可运行的LeNet模型:这是第一个成功应用的卷积神经网络,比现代深度学习兴起时间还要早。 在下一章中,我们将深入研究一些流行的、相对较新的卷积神经网络架构的完整实现,这些网络架构涵盖了现代从业者通常使用的大多数经典技术。
6.1. 从全连接层到卷积¶
6.1.1. 不变性¶
想象一下,假设我们想从一张图片中找到某个物体。 合理的假设是:无论哪种方法找到这个物体,都应该和物体的位置无关。卷积神经网络正是将**空间不变性**(spatial invariance)的这一概念系统化,从而基于这个模型使用较少的参数来学习有用的表示。
现在,我们将上述想法总结一下,从而帮助我们设计适合于计算机视觉的神经网络架构。
-
平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。
-
局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。
6.1.2. 多层感知机的限制¶
~
6.1.3. 卷积¶
~
6.1.4. “沃尔多在哪里”回顾¶
~
6.1.5. 小结¶
-
图像的平移不变性使我们以相同的方式处理局部图像,而不在乎它的位置。
-
局部性意味着计算相应的隐藏表示只需一小部分局部图像像素。
-
在图像处理中,卷积层通常比全连接层需要更少的参数,但依旧获得高效用的模型。
-
卷积神经网络(CNN)是一类特殊的神经网络,它可以包含多个卷积层。
-
多个输入和输出通道使模型在每个空间位置可以获取图像的多方面特征。
6.2. 图像卷积¶
6.2.1. 互相关运算¶
严格来说,卷积层是个错误的叫法,因为它所表达的运算其实是**互相关运算(cross-correlation)**,而不是卷积运算。
6.2.2. 卷积层¶
~
6.2.3. 图像中目标的边缘检测¶
~
6.2.4. 学习卷积核¶
~
6.2.5. 互相关和卷积¶
~
6.2.6. 特征映射和感受野¶
~
6.2.7. 小结¶
-
二维卷积层的核心计算是二维互相关运算。最简单的形式是,对二维输入数据和卷积核执行互相关操作,然后添加一个偏置。
-
我们可以设计一个卷积核来检测图像的边缘。
-
我们可以从数据中学习卷积核的参数。
-
学习卷积核时,无论用严格卷积运算或互相关运算,卷积层的输出不会受太大影响。
-
当需要检测输入特征中更广区域时,我们可以构建一个更深的卷积网络。
6.3. 填充和步幅¶
6.3.1. 填充¶
在应用多层卷积时,我们常常丢失边缘像素。 由于我们通常使用小卷积核,因此对于任何单个卷积,我们可能只会丢失几个像素。 但随着我们应用许多连续卷积层,累积丢失的像素数就多了。 解决这个问题的简单方法即为填充(padding):在输入图像的边界填充元素。
在许多情况下,我们需要设置\(p_h = k_h - 1\) 和 \(p_w = k_w - 1\),这样输入和输出具有相同的高度和宽度。 这样可以使我们更容易地预测卷积层的输出形状。
卷积神经网络中卷积核的高度和宽度通常为奇数,例如1、3、5或7。 选择奇数的好处是,保持空间维度的同时,我们可以在顶部和底部填充相同数量的行,在左侧和右侧填充相同数量的列。
Tip
举个例子,如果卷积核是3行3列,我们可以在输入的四周各填充1行或列,这样输出的高度和宽度就与输入相同。如果卷积核是5行5列,那么我们需要在输入的四周各填充2行或列。
6.3.2. 步幅¶
我们将每次滑动元素的数量称为步幅(stride)。
6.3.3. 小结¶
-
填充可以增加输出的高度和宽度。这常用来使输出与输入具有相同的高和宽。
-
步幅可以减小输出的高和宽,例如输出的高和宽仅为输入的高和宽的\(\frac{1}{n}\)(n是一个大于1的整数)。
-
填充和步幅可用于有效地调整数据的维度。
6.4. 多输入多输出通道¶
6.4.1. 多输入通道¶
当输入包含多个通道时,需要构造一个与输入数据具有相同输入通道数的卷积核,以便与输入数据进行互相关运算。假设输入的通道数为\(c_i\),那么卷积核的输入通道数也需要为\(c_i\)。如果卷积核的窗口形状是\(k_h \times k_w\),那么当\(c_i = 1\)时,我们可以把卷积核看作形状为\(k_h \times k_w\)的二维张量。
然而,当\(c_i > 1\)时,我们卷积核的每个输入通道将包含形状为\(k_h \times k_w\)的张量。将这些张量在输入通道维度上连结,我们将得到一个形状为\(c_i \times k_h \times k_w\)的卷积核。由于输入和卷积核都有\(c_i\)个通道,我们可以对每个输入通道和卷积核的通道进行互相关运算,再将这\(c_i\)个互相关运算的二维输出按通道相加,得到一个二维张量。这就是多输入通道的互相关运算。
Note
总之就是通过相加来降维。
6.4.2. 多输出通道¶
到目前为止,不论有多少输入通道,我们还只有一个输出通道。然而,正如我们在 6.1.4.1节中所讨论的,每一层有多个输出通道是至关重要的。在最流行的神经网络架构中,随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。直观地说,我们可以将每个通道看作对不同特征的响应。而现实可能更为复杂一些,因为每个通道不是独立学习的,而是为了共同使用而优化的。因此,多输出通道并不仅是学习多个单通道的检测器。
用\(c_i\)和\(c_o\)分别表示输入和输出的通道数,并设卷积核的高和宽分别为\(k_h\)和\(k_w\)。为了获得多个通道的输出,我们可以为每个输出通道创建一个形状为\(c_i \times k_h \times k_w\)的卷积核张量,这样卷积核的形状是\(c_o \times c_i \times k_h \times k_w\)。在互相关运算中,每个输出通道先获取所有输入通道,再以对应该输出通道的卷积核计算出结果。
6.4.3. 1x1卷积层¶
\(1 \times 1\)卷积,即\(k_h = k_w = 1\),看起来似乎没有多大意义。 毕竟,卷积的本质是有效提取相邻像素间的相关特征,而\(1 \times 1\)卷积显然没有此作用。 尽管如此,\(1 \times 1\)仍然十分流行,经常包含在复杂深层网络的设计中。下面,让我们详细地解读一下它的实际作用。
因为使用了最小窗口,\(1 \times 1\)卷积失去了卷积层的特有能力——在高度和宽度维度上,识别相邻元素间相互作用的能力。 其实\(1 \times 1\)卷积的唯一计算发生在通道上。
图6.4.2展示了使用\(1 \times 1\)卷积核与3个输入通道和2个输出通道的互相关计算。 这里输入和输出具有相同的高度和宽度,输出中的每个元素都是从输入图像中同一位置的元素的线性组合。 我们可以将\(1 \times 1\)卷积层看作在每个像素位置应用的全连接层,以\(c_i\)个输入值转换为\(c_o\)个输出值。 因为这仍然是一个卷积层,所以跨像素的权重是一致的。 同时,卷积层需要的权重维度为\(c_i \times c_o\),再额外加上一个偏置。
6.4.4. 小结¶
- 多输入多输出通道可以用来扩展卷积层的模型。
- 当以每像素为基础应用时,\(1 \times 1\)卷积层相当于全连接层。
- \(1 \times 1\)卷积层通常用于调整网络层的通道数量和控制模型复杂性。
6.5. 汇聚层¶
通常当我们处理图像时,我们希望逐渐降低隐藏表示的空间分辨率、聚集信息,这样随着我们在神经网络中层叠的上升,每个神经元对其敏感的感受野(输入)就越大。
而我们的机器学习任务通常会跟全局图像的问题有关(例如,“图像是否包含一只猫呢?”),所以我们最后一层的神经元应该对整个输入的全局敏感。通过逐渐聚合信息,生成越来越粗糙的映射,最终实现学习全局表示的目标,同时将卷积图层的所有优势保留在中间层。
此外,当检测较底层的特征时(例如 6.2节中所讨论的边缘),我们通常希望这些特征保持某种程度上的平移不变性。例如,如果我们拍摄黑白之间轮廓清晰的图像X,并将整个图像向右移动一个像素,即Z[i, j] = X[i, j + 1],则新图像Z的输出可能大不相同。而在现实中,随着拍摄角度的移动,任何物体几乎不可能发生在同一像素上。即使用三脚架拍摄一个静止的物体,由于快门的移动而引起的相机振动,可能会使所有物体左右移动一个像素(除了高端相机配备了特殊功能来解决这个问题)。
本节将介绍汇聚(pooling)层,它具有双重目的:降低卷积层对位置的敏感性,同时**降低对空间降采样表示的敏感性**。
6.5.1. 最大汇聚层和平均汇聚层¶
~
6.5.2. 填充和步幅¶
6.5.3. 多个通道¶
在处理多通道输入数据时,汇聚层在每个输入通道上单独运算,而不是像卷积层一样在通道上对输入进行汇总。 这意味着汇聚层的输出通道数与输入通道数相同。
6.5.4. 小结¶
-
对于给定输入元素,最大汇聚层会输出该窗口内的最大值,平均汇聚层会输出该窗口内的平均值。
-
汇聚层的主要优点之一是减轻卷积层对位置的过度敏感。
-
我们可以指定汇聚层的填充和步幅。
-
使用最大汇聚层以及大于1的步幅,可减少空间维度(如高度和宽度)。
-
汇聚层的输出通道数与输入通道数相同。
6.6. 卷积神经网络(LeNet)¶
通过之前几节,我们学习了构建一个完整卷积神经网络的所需组件。 回想一下,之前我们将softmax回归模型( 3.6节)和多层感知机模型( 4.2节)应用于Fashion-MNIST数据集中的服装图片。 为了能够应用softmax回归和多层感知机,我们首先将每个大小为28*28的图像展平为一个784维的固定长度的一维向量,然后用全连接层对其进行处理。 而现在,我们已经掌握了卷积层的处理方法,我们可以在图像中保留空间结构。 同时,用卷积层代替全连接层的另一个好处是:模型更简洁、所需的参数更少。
本节将介绍LeNet,它是最早发布的卷积神经网络之一,因其在计算机视觉任务中的高效性能而受到广泛关注。 这个模型是由AT&T贝尔实验室的研究员Yann LeCun在1989年提出的(并以其命名),目的是识别图像 (LeCun et al., 1998)中的手写数字。 当时,Yann LeCun发表了第一篇通过反向传播成功训练卷积神经网络的研究,这项工作代表了十多年来神经网络研究开发的成果。
当时,LeNet取得了与支持向量机(support vector machines)性能相媲美的成果,成为监督学习的主流方法。 LeNet被广泛用于自动取款机(ATM)机中,帮助识别处理支票的数字。 时至今日,一些自动取款机仍在运行Yann LeCun和他的同事Leon Bottou在上世纪90年代写的代码呢!
6.6.1. LeNet¶
~
6.6.2. 模型训练¶
~
6.6.3. 小结¶
-
卷积神经网络(CNN)是一类使用卷积层的网络。
-
在卷积神经网络中,我们组合使用卷积层、非线性激活函数和汇聚层。
-
为了构造高性能的卷积神经网络,我们通常对卷积层进行排列,逐渐降低其表示的空间分辨率,同时增加通道数。
-
在传统的卷积神经网络中,卷积块编码得到的表征在输出之前需由一个或多个全连接层进行处理。
-
LeNet是最早发布的卷积神经网络之一。