卷积神经网络(CNN)入门指南

更新于 2026-02-03

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 的灵感来源及其与人类视觉系统的类比

卷积神经网络的设计灵感源自人类视觉皮层的分层结构。以下是两者之间的一些关键相似点与差异:

image 图示:初级视觉皮层相关区域与卷积神经网络各层之间的对应关系 来源

  • 分层架构: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)

本节将通过手写数字分类的例子,深入解释每个组件的定义。

image 图示:应用于数字识别的 CNN 架构 来源

卷积层(Convolution Layers)

这是 CNN 的第一个构建模块。顾名思义,其核心数学运算是“卷积”——即对代表图像的像素矩阵应用一个滑动窗口函数。该滑动函数称为核(kernel)滤波器(filter),二者可互换使用。

在卷积层中,会应用多个尺寸相同的滤波器,每个滤波器用于识别图像中的特定模式,例如数字的弯曲、边缘、整体形状等。

简单来说,在卷积层中,我们使用小型网格(称为滤波器或核)在图像上滑动。每个小网格就像一个微型放大镜,用于寻找照片中的特定模式,如直线、曲线或形状。当它在照片上移动时,会生成一个新的网格,突出显示它发现这些模式的位置。

例如,一个滤波器可能擅长识别直线,另一个则擅长识别曲线。通过使用多个不同的滤波器,CNN 能够全面捕捉构成图像的各种模式。

让我们考虑一张 32×32 的手写数字灰度图像。下图所示矩阵中的数值仅为示意。

image 图示:输入图像及其像素表示

同时,考虑用于卷积的核。它是一个 3×3 的矩阵。核中每个元素的权重在网格中表示出来:黑色网格代表权重为 0,白色网格代表权重为 1。

我们需要手动确定这些权重吗?

在实际应用中,核的权重是在神经网络的训练过程中自动学习得到的。

利用这两个矩阵,我们可以执行卷积运算,具体步骤如下:

  1. 将核矩阵从图像左上角开始,向右滑动;
  2. 执行逐元素相乘;
  3. 将所有乘积结果求和;
  4. 得到的值即为卷积后矩阵左上角的第一个值;
  5. 根据滑动窗口的步长(stride)向下移动核;
  6. 重复步骤 1 至 5,直到覆盖整张图像。

卷积后矩阵的维度取决于滑动窗口的大小:窗口越大,输出维度越小。

image 图示:使用步长为 1、3×3 核的卷积操作

在文献中,核也常被称为特征检测器(feature detector),因为其权重可以被微调以检测输入图像中的特定特征。

例如:

  • 对邻近像素取平均的核可用于模糊图像;
  • 减去邻近像素的核可用于边缘检测。

网络中的卷积层数量越多,就越能检测到更抽象的特征。

激活函数(Activation Function)

每次卷积操作后都会应用 ReLU 激活函数。该函数帮助网络学习图像特征之间的非线性关系,从而增强其识别不同模式的能力。此外,ReLU 还有助于缓解梯度消失问题。

池化层(Pooling Layer)

池化层的目标是从卷积后的特征图(即卷积矩阵)中提取最显著的特征。这是通过应用聚合操作实现的,该操作会降低特征图的维度,从而减少训练过程中的内存占用。池化也有助于缓解过拟合。

常见的聚合函数包括:

  • 最大池化(Max pooling):取特征图中局部区域的最大值;
  • 求和池化(Sum pooling):取局部区域所有值的总和;
  • 平均池化(Average pooling):取局部区域所有值的平均值。

下图展示了上述每种池化的示例:

image 图示:使用步长为 2、2×2 滤波器的最大池化操作

此外,随着池化操作的进行,特征图的维度会逐渐变小。

最后一个池化层会将其特征图展平(flatten),以便全连接层进行处理。

全连接层(Fully Connected Layers)

这些层位于卷积神经网络的最后部分,其输入来自最后一个池化层展平后的一维向量。全连接层同样应用 ReLU 激活函数以引入非线性。

最后,使用 Softmax 预测层为每个可能的输出标签生成概率值,预测结果即为概率最高的那个类别。

CNN 中的过拟合与正则化

过拟合是机器学习模型(尤其是 CNN 深度学习项目)中常见的挑战。当模型过度学习训练数据(“死记硬背”),甚至记住了其中的噪声和异常值时,就会发生过拟合。这会导致模型在训练数据上表现优异,但在新数据(验证集或测试集)上表现糟糕。

这种现象通常表现为:训练误差远低于验证/测试误差。下图对此进行了可视化说明:

image 图示:欠拟合 vs. 过拟合

深度学习模型(尤其是卷积神经网络)由于其高度复杂性和从大规模数据中学习细节模式的能力,特别容易出现过拟合。

为缓解 CNN 中的过拟合问题,可采用多种正则化技术,如下所示:

image 图示:7 种缓解 CNN 过拟合的策略

  1. Dropout(随机失活):在训练过程中随机“关闭”一部分神经元,迫使剩余神经元从输入数据中学习新的特征。
  2. 批归一化(Batch Normalization):通过对输入层进行归一化(调整并缩放激活值)在一定程度上减少过拟合。该方法还能加速并稳定训练过程。
  3. 池化层(Pooling Layers):通过降低输入图像的空间维度,为模型提供更抽象的表示形式,从而降低过拟合风险。
  4. 早停(Early Stopping):在训练过程中持续监控模型在验证集上的表现,一旦验证误差不再改善,立即停止训练。
  5. 噪声注入(Noise Injection):在训练期间向输入或隐藏层的输出添加噪声,使模型更具鲁棒性,避免泛化能力弱。
  6. L1 与 L2 正则化:两者均通过在损失函数中加入基于权重大小的惩罚项来防止过拟合。具体而言:
    • L1 正则化鼓励权重稀疏,有助于特征选择;
    • L2 正则化(又称权重衰减)鼓励权重值较小,防止个别权重对预测产生过大影响。
  7. 数据增强(Data Augmentation):通过对输入图像进行随机变换(如旋转、缩放、翻转或裁剪)人为扩充训练数据集的规模与多样性。

CNN 的实际应用

卷积神经网络彻底改变了计算机视觉领域,推动了许多现实应用的重大进步。以下是一些典型应用场景:

image 图示: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 框架,并对比了各自的特点,帮助读者根据实际需求做出合适选择。