Zoumana Keita 2023-11-14
全面了解 CNN、其在图像分析中的影响,以及若干关键策略以应对过拟合问题,从而构建稳健的 CNN 与深度学习应用。
什么是卷积神经网络(CNN)?
卷积神经网络(Convolutional Neural Network,简称 CNN),也称为 ConvNet,是一种专门设计用于处理需要物体识别任务的深度学习算法,包括图像分类、目标检测和图像分割等。CNN 被广泛应用于各种实际场景中,例如自动驾驶汽车、安防监控系统等。
CNN 的重要性
CNN 在当今世界具有重要意义,原因如下:
- 与支持向量机(SVM)、决策树等传统机器学习算法不同,CNN 能够自动大规模地提取特征,无需手动进行特征工程,从而显著提升效率。
- 卷积层赋予了 CNN 平移不变性(translation-invariant)特性,使其能够从数据中识别并提取模式和特征,无论这些特征在位置、方向、尺度或平移方面如何变化。
- 多种预训练的 CNN 架构(如 VGG-16、ResNet50、Inceptionv3 和 EfficientNet)已展现出顶尖性能。这些模型可通过“微调”(fine-tuning)技术,仅用少量新数据即可适配到新任务上。
- 除了图像分类任务外,CNN 还具有高度通用性,可应用于自然语言处理、时间序列分析和语音识别等多个领域。
CNN 的灵感来源及其与人类视觉系统的类比
卷积神经网络的设计灵感源自人类视觉皮层的分层结构。以下是两者之间的一些关键相似点与差异:
图示:初级视觉皮层相关区域与卷积神经网络各层之间的对应关系 来源
- 分层架构:CNN 与视觉皮层都具有层次化结构——浅层提取简单特征,深层逐步构建更复杂的特征。这种机制使得系统能够对视觉输入形成越来越精细的表征。
- 局部连接性:视觉皮层中的神经元仅连接输入视野的局部区域,而非整个视野。类似地,CNN 中的神经元也仅通过卷积操作连接输入体(input volume)的一个局部区域。这种局部连接提高了计算效率。
- 平移不变性:视觉皮层中的神经元能在视野任意位置检测特定特征。CNN 通过池化层(pooling layers)对局部特征进行汇总,从而获得一定程度的平移不变性。
- 多特征图:在视觉处理的每个阶段,都会提取多种不同的特征图。CNN 通过在每个卷积层中使用多个滤波器(filter maps)来模拟这一机制。
- 非线性:视觉皮层神经元表现出非线性响应特性。CNN 则通过在每次卷积后应用 ReLU 等激活函数来实现非线性。
尽管 CNN 模拟了人类视觉系统,但其结构更为简化,缺乏复杂的反馈机制,并依赖监督学习而非无监督学习。即便如此,它仍在计算机视觉领域推动了重大进展。
CNN 的核心组件
卷积神经网络由四个主要部分组成。
那么,CNN 是如何通过这些组件进行学习的呢?
这些组件帮助 CNN 模拟人脑识别图像中模式与特征的方式:
- 卷积层(Convolutional layers)
- 修正线性单元(Rectified Linear Unit,简称 ReLU)
- 池化层(Pooling layers)
- 全连接层(Fully connected layers)
本节将通过手写数字分类的例子,深入解释每个组件的定义。
图示:应用于数字识别的 CNN 架构 来源
卷积层(Convolution Layers)
这是 CNN 的第一个构建模块。顾名思义,其核心数学运算是“卷积”——即对代表图像的像素矩阵应用一个滑动窗口函数。该滑动函数称为核(kernel)或滤波器(filter),二者可互换使用。
在卷积层中,会应用多个尺寸相同的滤波器,每个滤波器用于识别图像中的特定模式,例如数字的弯曲、边缘、整体形状等。
简单来说,在卷积层中,我们使用小型网格(称为滤波器或核)在图像上滑动。每个小网格就像一个微型放大镜,用于寻找照片中的特定模式,如直线、曲线或形状。当它在照片上移动时,会生成一个新的网格,突出显示它发现这些模式的位置。
例如,一个滤波器可能擅长识别直线,另一个则擅长识别曲线。通过使用多个不同的滤波器,CNN 能够全面捕捉构成图像的各种模式。
让我们考虑一张 32×32 的手写数字灰度图像。下图所示矩阵中的数值仅为示意。
图示:输入图像及其像素表示
同时,考虑用于卷积的核。它是一个 3×3 的矩阵。核中每个元素的权重在网格中表示出来:黑色网格代表权重为 0,白色网格代表权重为 1。
我们需要手动确定这些权重吗?
在实际应用中,核的权重是在神经网络的训练过程中自动学习得到的。
利用这两个矩阵,我们可以执行卷积运算,具体步骤如下:
- 将核矩阵从图像左上角开始,向右滑动;
- 执行逐元素相乘;
- 将所有乘积结果求和;
- 得到的值即为卷积后矩阵左上角的第一个值;
- 根据滑动窗口的步长(stride)向下移动核;
- 重复步骤 1 至 5,直到覆盖整张图像。
卷积后矩阵的维度取决于滑动窗口的大小:窗口越大,输出维度越小。
图示:使用步长为 1、3×3 核的卷积操作
在文献中,核也常被称为特征检测器(feature detector),因为其权重可以被微调以检测输入图像中的特定特征。
例如:
- 对邻近像素取平均的核可用于模糊图像;
- 减去邻近像素的核可用于边缘检测。
网络中的卷积层数量越多,就越能检测到更抽象的特征。
激活函数(Activation Function)
每次卷积操作后都会应用 ReLU 激活函数。该函数帮助网络学习图像特征之间的非线性关系,从而增强其识别不同模式的能力。此外,ReLU 还有助于缓解梯度消失问题。
池化层(Pooling Layer)
池化层的目标是从卷积后的特征图(即卷积矩阵)中提取最显著的特征。这是通过应用聚合操作实现的,该操作会降低特征图的维度,从而减少训练过程中的内存占用。池化也有助于缓解过拟合。
常见的聚合函数包括:
- 最大池化(Max pooling):取特征图中局部区域的最大值;
- 求和池化(Sum pooling):取局部区域所有值的总和;
- 平均池化(Average pooling):取局部区域所有值的平均值。
下图展示了上述每种池化的示例:
图示:使用步长为 2、2×2 滤波器的最大池化操作
此外,随着池化操作的进行,特征图的维度会逐渐变小。
最后一个池化层会将其特征图展平(flatten),以便全连接层进行处理。
全连接层(Fully Connected Layers)
这些层位于卷积神经网络的最后部分,其输入来自最后一个池化层展平后的一维向量。全连接层同样应用 ReLU 激活函数以引入非线性。
最后,使用 Softmax 预测层为每个可能的输出标签生成概率值,预测结果即为概率最高的那个类别。
CNN 中的过拟合与正则化
过拟合是机器学习模型(尤其是 CNN 深度学习项目)中常见的挑战。当模型过度学习训练数据(“死记硬背”),甚至记住了其中的噪声和异常值时,就会发生过拟合。这会导致模型在训练数据上表现优异,但在新数据(验证集或测试集)上表现糟糕。
这种现象通常表现为:训练误差远低于验证/测试误差。下图对此进行了可视化说明:
图示:欠拟合 vs. 过拟合
深度学习模型(尤其是卷积神经网络)由于其高度复杂性和从大规模数据中学习细节模式的能力,特别容易出现过拟合。
为缓解 CNN 中的过拟合问题,可采用多种正则化技术,如下所示:
图示:7 种缓解 CNN 过拟合的策略
- Dropout(随机失活):在训练过程中随机“关闭”一部分神经元,迫使剩余神经元从输入数据中学习新的特征。
- 批归一化(Batch Normalization):通过对输入层进行归一化(调整并缩放激活值)在一定程度上减少过拟合。该方法还能加速并稳定训练过程。
- 池化层(Pooling Layers):通过降低输入图像的空间维度,为模型提供更抽象的表示形式,从而降低过拟合风险。
- 早停(Early Stopping):在训练过程中持续监控模型在验证集上的表现,一旦验证误差不再改善,立即停止训练。
- 噪声注入(Noise Injection):在训练期间向输入或隐藏层的输出添加噪声,使模型更具鲁棒性,避免泛化能力弱。
- L1 与 L2 正则化:两者均通过在损失函数中加入基于权重大小的惩罚项来防止过拟合。具体而言:
- L1 正则化鼓励权重稀疏,有助于特征选择;
- L2 正则化(又称权重衰减)鼓励权重值较小,防止个别权重对预测产生过大影响。
- 数据增强(Data Augmentation):通过对输入图像进行随机变换(如旋转、缩放、翻转或裁剪)人为扩充训练数据集的规模与多样性。
CNN 的实际应用
卷积神经网络彻底改变了计算机视觉领域,推动了许多现实应用的重大进步。以下是一些典型应用场景:
图示:CNN 的若干实际应用
- 图像分类:CNN 用于图像归类,即将图像分配到预定义的类别中。例如,社交媒体平台可利用此技术自动整理用户照片。
- 目标检测:CNN 能够识别并定位图像中的多个物体。这一能力在零售业货架扫描中至关重要,可用于识别缺货商品。
- 人脸识别:这也是 CNN 的主要应用领域之一。例如,该技术可嵌入安防系统,基于面部特征实现高效门禁控制。
如需动手实践,我们的《使用 TensorFlow 实现卷积神经网络(CNN)教程》将教你如何使用 TensorFlow 2 框架在 Python 中构建并部署 CNN。
用于 CNN 的深度学习框架
深度学习的快速发展很大程度上得益于 TensorFlow、PyTorch 和 Keras 等强大框架,它们大大简化了卷积神经网络及其他深度学习模型的训练过程。
下面简要介绍每个框架:
TensorFlow
TensorFlow 是由 Google 于 2015 年发布的开源深度学习框架,提供了一系列用于机器学习开发与部署的工具。我们的《深度神经网络入门指南》全面介绍了深度神经网络的概念、其在现代人工智能深度学习世界中的重要性,并包含基于 TensorFlow 的实际实现案例。
Keras
Keras 是一个用 Python 编写的高级神经网络框架,支持快速实验与开发。它是开源的,可作为 TensorFlow、CNTK 和 Theano 等后端的接口。我们的课程《使用 Keras 进行 Python 图像处理》将教你如何使用 Keras 构建、训练和评估卷积神经网络,完成图像分析任务。
PyTorch
PyTorch 由 Facebook 人工智能研究部门于 2017 年发布,专为自然语言处理等应用设计,以其动态计算图和内存效率著称。如果你对自然语言处理感兴趣,我们的《PyTorch 自然语言处理综合指南》是一个绝佳起点。
每个项目需求不同,因此选择应基于具体用例中最关键的特性。为帮助做出更明智的决策,下表对这些框架进行了简要对比,突出了各自的独特优势。
| 特性 | TensorFlow | PyTorch | Keras |
|---|---|---|---|
| API 层级 | 高级与低级兼备 | 高级与低级兼备 | 高级 |
| 架构 | 不易使用 | 复杂 | 简洁、清晰、可读性强 |
| 适用数据集 | 大型数据集、高性能 | 大型数据集、高性能 | 较小数据集 |
| 调试 | 调试困难 | 调试能力强 | 网络简单,通常无需调试 |
| 是否提供预训练模型? | 是 | 是 | 是 |
| 速度 | 快、高性能 | 快、高性能 | 慢、性能较低 |
| 编写语言 | C++、CUDA、Python | C++、CUDA、Python | Python |
结论
本文全面概述了深度学习中的卷积神经网络(CNN)是什么,以及其在图像识别与分类任务中的关键作用。
文章首先阐述了 CNN 设计灵感来源于人类视觉系统,随后深入探讨了使其能够学习并做出预测的核心组件。
文中指出,过拟合是影响 CNN 泛化能力的重大挑战。为此,列举了多种有效的策略以缓解过拟合问题,提升 CNN 的整体性能。
最后,介绍了若干主流的深度学习 CNN 框架,并对比了各自的特点,帮助读者根据实际需求做出合适选择。