卷积神经网络(CNN)是由Facebook人工智能研究组负责人Yann LeCun于1988年首次提出,最早用于字符识别(如读取邮政编码和数字)。目前,CNN广泛应用于人脸识别、自动驾驶中的物体检测以及医疗影像中的疾病诊断等场景。

1 介绍

卷积神经网络(CNN)是一种前馈神经网络,用于通过处理具有网格状拓扑结构的数据来分析视觉图像,也称为ConvNet。CNN的核心任务是图像中的对象检测和分类。它的常见应用如下:

  • 图像分类:将图像分为预定义类别,如猫、狗、车等。
  • 目标检测:识别图像中特定物体并定位其位置。
  • 图像分割:将图像分为不同区域,用于医学图像分析或机器人场景理解。
  • 视频分析:在动态场景中跟踪物体或检测事件,用于监控和交通管理。
  • 行业应用:包括社交媒体(人脸识别和标记)、医疗(癌症检测)、零售(视觉搜索和推荐)、汽车(车道检测和碰撞预警)等。

CNN的工作原理

  1. 输入图像以像素矩阵形式输入神经网络。
  2. 隐藏层(如卷积层、ReLU层和池化层)提取图像特征。
  3. 最终,完全连接层负责识别图像中的对象。

卷积操作

卷积操作是CNN的核心。下面来看一个例子,假设 a = [ 5 , 3 , 7 , 5 , 9 , 7 ] a=[5,3,7,5,9,7] a=[5,3,7,5,9,7] b = [ 1 , 2 , 3 ] b=[1,2,3] b=[1,2,3],步骤如下:

  1. 卷积计算过程

    • 将矩阵 b b b 滑动应用于矩阵 a a a 的子集,每次取连续的三个元素。
    • 子集与矩阵 b b b 逐元素相乘后,再求和得到结果。
  2. 步骤详解

    • 第一次计算:
      • 逐元素相乘 [ 5 ⋅ 1 , 3 ⋅ 2 , 2 ⋅ 3 ] = [ 5 , 6 , 6 ] [5 \cdot 1, 3 \cdot 2, 2 \cdot 3] = [5, 6, 6] [51,32,23]=[5,6,6]
      • 求和 5 + 6 + 6 = 17 5 + 6 + 6 = 17 5+6+6=17
    • 第二次计算:
      • 逐元素相乘 [ 3 ⋅ 1 , 2 ⋅ 2 , 5 ⋅ 3 ] = [ 3 , 4 , 15 ] [3 \cdot 1, 2 \cdot 2, 5 \cdot 3] = [3, 4, 15] [31,22,53]=[3,4,15]
      • 求和 3 + 4 + 15 = 22 3 + 4 + 15 = 22 3+4+15=22
  3. 结果:卷积结果为 [ 17 , 22 ] [17, 22] [17,22],继续滑动直到完成所有计算。

  4. 说明:每次滑动移动的步长决定了卷积输出的维度。

2 CNN中的层

卷积神经网络具有多个隐藏层,可帮助从图像中提取信息。

2.1 卷积层 (Convolution Layer)

这是从图像中提取有价值特征的第一步。卷积层包含多个滤波器,用于执行卷积操作。每个图像被视为一个像素值的矩阵。

以一个像素值为0或1的5x5图像为例,使用一个3x3的滤波器矩阵。将滤波器矩阵滑动于图像上,并计算点积以获得卷积特征矩阵。

img

2.2 激活层 (Activation Layer)

卷积操作本质上是一个线性运算(加权求和),多个线性运算堆叠仍然是线性映射,无法有效处理复杂的非线性问题。激活层对池化层的输出应用非线性激活函数,ReLu是一个常用的非线性激活函数:

ReLU代表修正线性单元(Rectified Linear Unit)。在提取特征图后,下一步是将其传递到ReLU层。ReLU逐元素操作,将所有负像素值设置为0。这为网络引入了非线性,输出为修正特征图 (Rectified Feature Map)。以下是ReLU函数的图形:

img

噪声通常是负值:卷积过程中,当图像区域与卷积核不匹配时,会产生负值,这些负值通常无意义。Relu则将负值置0。

滤波器的作用

  • 边缘检测:提取边缘。
  • 纹理检测:捕捉重复模式。
  • 形状检测:识别特定几何特征。

不同滤波器和负值的关系:不同滤波器会突出图像中某些特征,负值表明某些区域与滤波器目标特征不匹配。ReLU 通过去除负值,使网络专注于关键特征。

2.3 池化层 (Pooling Layer)

池化是一种下采样操作,用于降低特征图的维度。如下图所示,采用最大值池化,取每个区域的最大值,最终矩阵缩小了4倍,从而减少了后续的计算量。

img

2.4 平坦化 (Flattening)

平坦化是将卷积和池化生成的二维特征图转化为一维向量的过程,以便将这些特征作为输入传递给全连接层。这样做是因为全连接层只能处理一维数据,用于最终的分类或回归任务。

  • 卷积和池化提取并压缩了图像的局部特征,而平坦化则整合这些特征,使它们能够用于高层次的决策(如分类输出)。

img

现在我们整个模型是这样的:

img

2.5 全连接层 (Fully Connected Layer)

卷积和池化层提取了图像的局部特征(如边缘、纹理等),生成了二维特征图。全连接层需要将这些特征整合起来进行高层次的分类或预测任务。通过平坦化,将二维特征图转为一维向量,使这些特征能够作为输入送入全连接层。全连接层有如下特点:

  • 全连接层的每个神经元与上一层的所有输出相连,整合所有特征信息以实现分类或回归。

  • 它通过学习权重和偏置来决定每个特征对最终预测的贡献。

  • 影响因素

    • 总层数(长度):全连接层的层数越多,模型越深。
    • 神经元数(宽度):单层神经元数越多,模型越宽。
  • 复杂度与学习能力:增加层数和神经元数可以提升模型的学习能力,但也有以下风险:

    • 过拟合风险:过多的参数可能使模型过于拟合训练数据,导致泛化能力下降。

    • 计算成本:更多的层和神经元会增加训练和推理时间,降低效率。

2.6 输出层 (Output Layer)

输出层是卷积神经网络(CNN)的最后一层,用于将全连接层的输出映射到目标任务的结果空间。它将特征表示处理为模型的最终预测,例如分类任务中的类别概率。

(1)逻辑函数的应用

  • Sigmoid:用于二分类任务,将每个输入值映射到 [ 0 , 1 ] [0, 1] [0,1] 范围,表示属于某一类别的概率。 σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1

  • Softmax:用于多分类任务,将所有输出转化为概率分布,确保所有类别的概率加和为 1。 Softmax ( x i ) = e x i ∑ j = 1 n e x j \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}} Softmax(xi)=j=1nexjexi

  • 概率分布:逻辑函数将原始的“分数”(全连接层输出的激活值)转化为更直观的概率值,便于判断最终结果。

(2)例子

假设我们有一个任务,识别图像中是“狗”、“鸟”还是“猫”,输出层的操作如下:

  1. 假设全连接层的输出为: 狗: x 1 = 2.0 x_1 = 2.0 x1=2.0 ,鸟: x 2 = 1.0 x_2 = 1.0 x2=1.0 ,猫: x 3 = 0.1 x_3 = 0.1 x3=0.1
  2. Softmax 计算每个类别的概率:
    P ( 狗 ) = e 2.0 e 2.0 + e 1.0 + e 0.1 = 0.63 P(\text{狗}) = \frac{e^{2.0}}{e^{2.0} + e^{1.0} + e^{0.1}} = 0.63 P()=e2.0+e1.0+e0.1e2.0=0.63 P ( 鸟 ) = e 1.0 e 2.0 + e 1.0 + e 0.1 = 0.23 P(\text{鸟}) = \frac{e^{1.0}}{e^{2.0} + e^{1.0} + e^{0.1}} = 0.23 P()=e2.0+e1.0+e0.1e1.0=0.23 P ( 猫 ) = e 0.1 e 2.0 + e 1.0 + e 0.1 = 0.14 P(\text{猫}) = \frac{e^{0.1}}{e^{2.0} + e^{1.0} + e^{0.1}} = 0.14 P()=e2.0+e1.0+e0.1e0.1=0.14
  3. 输出分类结果: 模型最终预测为“狗”,因为其概率 P ( 狗 ) = 0.63 P(\text{狗}) = 0.63 P()=0.63 最大。

2.7 其它层

上述是基本的CNN层,实际上还有以下两个层。

2.7.1 归一化层 (Normalization Layer)

归一化层是深度神经网络中用于稳定训练过程并提高模型性能的重要组件。通过对每一层的激活值进行归一化操作,归一化层解决了由于激活值分布不稳定(即“内部协变量偏移”)导致的模型训练困难。常见的归一化方法包括批归一化(Batch Normalization)和层归一化(Layer Normalization):

  • 批归一化 (Batch Normalization)
    执行时,对每个小批量中的激活值进行归一化处理,使其具有零均值和单位方差,同时引入可学习的缩放和偏移参数,保持网络表达能力。批归一化的优点包括:

    1. 加速收敛:使训练更稳定、更快速。
    2. 减轻参数初始化敏感性:降低对权重初始值的依赖。
    3. 防止过拟合:具有轻微的正则化效果。
  • 层归一化 (Layer Normalization)
    针对每层所有神经元的激活值进行归一化,通常用于小批量数据或序列任务中。它与批归一化的区别在于,层归一化对输入的大小和顺序不敏感,更适合RNN和小批量训练场景。

如果不归一化,当激活值很大时,模型的梯度更新会变得不稳定,导致训练过程收敛变慢或完全失效;而当激活值很小时,梯度会逐渐趋近于零,使模型学不到有效特征。这些问题在网络较深或数据分布不均匀时会更加明显,最终导致模型性能下降。

激活值就像每层神经网络“处理数据后的中间结果”。如果这些中间结果的数值过大,就像一个麦克风音量开太大,声音失真,网络难以从中提取有效信息;如果数值过小,就像音量开太低,声音听不清,网络学不到关键特征。
不归一化的时候,有些层的输出可能变得特别大或特别小,这会让后续的训练变得很困难,导致模型最终表现不好。归一化就像调节音量,让每层输出保持在适合的范围内,既不会失真也不会太弱,训练更稳定,效果更好。

2.7.2 Dropout层

Dropout层是一种正则化技术,通过在训练过程中随机舍弃部分神经元来防止过拟合,提高模型的泛化能力。具体实现方式如下:

  • 工作机制
    在每次前向传播时,Dropout层会以一定的概率(如 50%)随机忽略一部分神经元(即将其输出置为 0)。被忽略的神经元在这一轮训练中不参与计算,但它们的权重在下一轮中会被恢复。这种机制模拟了多个子网络的组合效果,从而降低过拟合风险。

  • 优点

    1. 防止神经元依赖:避免某些神经元过度依赖特定特征,提升模型的鲁棒性。
    2. 增强泛化能力:模型更能适应新数据,不容易对训练数据“记忆”过度。
    3. 简便高效:Dropout实现简单,但对防止过拟合效果显著。
  • 常见设置
    Dropout的“舍弃率”(Dropout Rate)通常设置在 0.2 到 0.5 之间,具体值根据模型复杂度和数据集大小调整。在测试阶段,Dropout层会自动关闭,所有神经元均参与计算。

通过归一化层和Dropout层的配合,深度神经网络不仅能够稳定训练,还能有效防止过拟合,实现更好的预测性能。

2.8 鸟类识别例子

以上就是CNN网络的所有层,以识别鸟的种类为例,整个CNN层结构如下:

img

3 CNN实现流程

  1. 训练过程
    卷积神经网络(CNN)的训练通常采用监督学习方法,将带有正确标签的图像输入模型,使其逐步学习如何将图像与正确的标签对应。
  2. 数据准备
    在训练之前,需要对图像进行预处理,确保格式和尺寸一致。这种一致性有助于CNN更有效地学习特征。
  3. 损失函数
    损失函数用于衡量模型预测与真实标签之间的差距,目标是尽可能减小这个差距,从而提高模型性能。
  4. 优化器
    优化器负责调整网络的权重,以最小化损失函数,逐步提高模型的预测精度。
  5. 反向传播
    反向传播通过计算每个权重对误差的贡献来更新权重,配合优化器完成模型的优化。

模型评价指标

  1. 准确率:衡量正确分类的测试图像比例。
  2. 精确率:关注模型预测某一类时的正确率。
  3. 召回率:衡量模型能否识别出所有属于某类的样本。
  4. F1分数:综合精确率和召回率,特别适用于类别不平衡问题。

以下是几个经典的卷积神经网络架构,它们在不同阶段推动了深度学习的发展,并为各种计算机视觉任务奠定了基础:

  • LeNet:早期的CNN架构,主要用于手写数字识别。
  • AlexNet:引入了ReLU激活函数和Dropout,开启了深度学习的新时代。
  • ResNet:通过残差连接解决了深层网络的梯度消失问题。
  • GoogleNet (InceptionNet):使用Inception模块同时处理多尺度特征。
  • MobileNet:针对移动设备优化,减少计算需求同时保持高性能。
  • VGG:采用简单的卷积-池化堆叠结构,适用于多种任务。

4 总结

卷积神经网络(CNN)是一种强大的深度学习模型,专注于从图像中提取特征并进行分类、检测等任务。其核心在于通过卷积层、池化层和全连接层构建层次化的特征表示,广泛应用于计算机视觉领域。下一篇文章,将通过实际的代码示例,深入理解一下里面各个细节。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐