计算机视觉卷积神经网络(CNN)基础:从LeNet到ResNet


计算机视觉卷积神经网络(CNN)基础:从LeNet到ResNet

  • 一、前言
  • 二、卷积神经网络基础概念​
    • [2.1 卷积层​](#2.1 卷积层)
      • [2.1.1 卷积运算原理​](#2.1.1 卷积运算原理)
      • [2.1.2 卷积核的作用与参数​](#2.1.2 卷积核的作用与参数)
    • [2.2 池化层​](#2.2 池化层)
      • [2.2.1 最大池化与平均池化​](#2.2.1 最大池化与平均池化)
      • [2.2.2 池化层的优势与应用​](#2.2.2 池化层的优势与应用)
    • [2.3 全连接层​](#2.3 全连接层)
      • [2.3.1 全连接层的连接方式​](#2.3.1 全连接层的连接方式)
      • [2.3.2 全连接层在 CNN 中的角色​](#2.3.2 全连接层在 CNN 中的角色)
  • [三、LeNet 网络​](#三、LeNet 网络)
    • [3.1 LeNet 的网络结构​](#3.1 LeNet 的网络结构)
      • [3.1.1 整体架构概述​](#3.1.1 整体架构概述)
      • [3.1.2 各层详细介绍​](#3.1.2 各层详细介绍)
    • [3.2 LeNet 的工作原理​](#3.2 LeNet 的工作原理)
      • [3.2.1 特征提取过程​](#3.2.1 特征提取过程)
      • [3.2.2 分类决策机制​](#3.2.2 分类决策机制)
      • [3.3 LeNet 代码示例(Python + Keras)​](#3.3 LeNet 代码示例(Python + Keras))
    • [3.4 LeNet 的应用与局限性​](#3.4 LeNet 的应用与局限性)
      • [3.4.1 数字识别等早期应用​](#3.4.1 数字识别等早期应用)
      • [3.4.2 局限性分析​](#3.4.2 局限性分析)
  • [四、ResNet 网络​](#四、ResNet 网络)
    • [4.1 ResNet 的提出背景与创新点​](#4.1 ResNet 的提出背景与创新点)
      • [4.1.1 深度神经网络的梯度消失问题​](#4.1.1 深度神经网络的梯度消失问题)
      • [4.1.2 残差学习的引入​](#4.1.2 残差学习的引入)
    • [4.2 ResNet 的网络结构​](#4.2 ResNet 的网络结构)
      • [4.2.1 残差块的设计​](#4.2.1 残差块的设计)
      • [4.2.2 不同深度的 ResNet 模型](#4.2.2 不同深度的 ResNet 模型)
    • [4.3 ResNet 的工作原理](#4.3 ResNet 的工作原理)
      • [4.3.1 残差学习的优势](#4.3.1 残差学习的优势)
      • [4.3.2 网络训练与优化](#4.3.2 网络训练与优化)
    • [4.4 ResNet 代码示例(Python + Keras)](#4.4 ResNet 代码示例(Python + Keras))
    • [4.5 ResNet 的性能表现与应用](#4.5 ResNet 的性能表现与应用)
      • [4.5.1 在图像分类任务中的优势](#4.5.1 在图像分类任务中的优势)
      • [4.5.2 在其他计算机视觉任务中的应用拓展](#4.5.2 在其他计算机视觉任务中的应用拓展)
    • [4.6 ResNet 与 LeNet 的对比分析](#4.6 ResNet 与 LeNet 的对比分析)
      • [4.6.1 网络结构差异](#4.6.1 网络结构差异)
      • [4.6.2 性能表现对比](#4.6.2 性能表现对比)
      • [4.6.3 应用场景适应性](#4.6.3 应用场景适应性)
  • 五、总结与展望
  • 致读者一封信

计算机视觉卷积神经网络(CNN)基础:从LeNet到ResNet,在计算机视觉领域,卷积神经网络(Convolutional Neural Network,CNN)已然成为推动众多任务发展的核心力量。从早期简单的图像识别,到如今复杂的目标检测、语义分割、图像生成等任务,CNN 都展现出了卓越的性能。CNN 的发展历程见证了一系列经典模型的诞生,其中 LeNet 作为开山之作,为 CNN 的发展奠定了基础,而 ResNet 则通过创新性的设计,突破了传统神经网络的限制,使得网络能够构建得更深、性能更优。本文将深入探讨从 LeNet 到 ResNet 的发展脉络,详细解析其网络结构、工作原理,并通过丰富的代码示例,帮助读者全面理解和掌握这两种重要的卷积神经网络模型,为进一步深入研究计算机视觉领域的相关技术筑牢根基。

一、前言

计算机视觉是一门研究如何使机器"看"的科学,更进一步的说,就是是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。作为一个科学学科,计算机视觉研究相关的理论和技术,试图建立能够从图像或者多维数据中获取'信息'的人工智能系统。这里所指的信息指Shannon定义的,可以用来帮助做一个"决定"的信息。因为感知可以看作是从感官信号中提取信息,所以计算机视觉也可以看作是研究如何使人工系统从图像或多维数据中"感知"的科学。


👉👉👉 🥇 点击进入计算机视觉专栏,计算机视觉(CV)是人工智能的重要分支,致力于让机器通过数字图像或视频获取、处理和分析视觉信息,并模拟人类视觉的认知能力。本专栏涵盖基础概念、技术应用、前沿研究和实战案例等方向。

👉👉👉 🥇 点击进入计算机网络技术专栏,本专栏旨在深入探讨计算机网络的核心概念、关键技术、协议标准以及最新发展趋势,帮助读者全面理解网络通信的原理与实践。

👉👉👉 🥇 点击进入网络安全知识专栏,本专栏详细介绍了网络安全入门:理解基本概念和术语,网络安全的五大核心领域:防护、检测、响应、恢复与治理,常见的网络攻击类型及防范技巧,网络安全防护层次:从物理到应用的多重保障,企业网络安全的十大挑战及解决方案等。

二、卷积神经网络基础概念​

2.1 卷积层​

2.1.1 卷积运算原理​

卷积层是 CNN 的核心组件。卷积运算本质上是一种数学操作,通过一个可学习的卷积核(也称为滤波器)在输入数据(通常是图像)上滑动,逐元素相乘并求和,从而生成输出特征图。以二维图像为例,假设输入图像为I ,卷积核为K ,输出特征图为O 。卷积核K 在图像I 上从左上角开始,按照指定的步长(stride)逐步滑动,在每个位置上,将卷积核覆盖的图像区域与卷积核对应元素相乘,然后将所有乘积相加,得到输出特征图O 上对应位置的像素值。其数学表达式为:​

其中,(i,j)是输出特征图上的坐标, (m,n)是卷积核内的坐标,MN分别是卷积核的高度和宽度。通过这种方式,卷积核可以提取输入图像中的局部特征,不同的卷积核权重设置可以捕捉到不同类型的特征,如边缘、纹理等。​

2.1.2 卷积核的作用与参数​

卷积核的大小、数量和步长等参数对卷积层的性能有重要影响。卷积核大小通常为奇数,如3×3 × 5×5等,这有助于确保卷积核在图像中心有一个明确的锚点。较小的卷积核可以捕捉到更细致的局部特征,而较大的卷积核则能在更大范围内整合信息。卷积核的数量决定了输出特征图的通道数,每个卷积核生成一个独立的特征图,多个卷积核可以并行提取多种不同的特征。步长决定了卷积核在输入图像上滑动的间隔,较大的步长可以减少计算量,但可能会丢失一些细节信息;较小的步长则能更细致地扫描图像,但计算量会增加。例如,使用3×3 的卷积核,步长为 1,意味着卷积核每次移动一个像素位置,能够更精确地提取图像特征;若步长为 2,则卷积核每次移动两个像素位置,计算速度加快,但特征图分辨率会降低。​

2.2 池化层​

2.2.1 最大池化与平均池化​

池化层的主要作用是对特征图进行下采样,减少数据量,同时保留重要的特征信息,降低模型的计算复杂度和过拟合风险。常见的池化方式有最大池化(Max Pooling)和平均池化(Average Pooling)。最大池化是在一个指定大小的池化窗口内,取窗口内像素值的最大值作为输出;平均池化则是计算池化窗口内像素值的平均值作为输出。以最大池化为例,假设池化窗口大小为2×2 ,在输入特征图上滑动,每次取2×2 区域内的最大值作为输出特征图对应位置的值。例如,对于一个2×2 的输入区域​


,经过最大池化后输出为5。平均池化则是计算该区域的平均值,即(3+5+1+2)/4=2.75。​

2.2.2 池化层的优势与应用​

池化层具有诸多优势。首先,它能有效减少特征图的尺寸,降低后续层的计算量。例如,若输入特征图大小为28×28 ,经过一个2×2 、步长为 2 的最大池化层后,特征图大小变为14×14,数据量减少为原来的四分之一。其次,池化操作在一定程度上能够增强模型对图像平移、缩放等变换的鲁棒性。因为池化层关注的是局部区域内的整体特征,而不是具体像素位置,所以即使图像发生一些小的平移,池化后的结果也可能保持不变。在实际应用中,池化层通常紧跟在卷积层之后,对卷积提取到的特征进行筛选和压缩,为后续的全连接层或更深层次的网络结构提供更简洁、有效的特征表示。​

2.3 全连接层​

2.3.1 全连接层的连接方式​

其中,是输入向量的元素。通过这种全连接的方式,全连接层能够充分利用前面层提取到的所有特征信息,进行复杂的特征组合和分类决策。​

2.3.2 全连接层在 CNN 中的角色​

在 CNN 中,全连接层通常位于网络的末端。前面的卷积层和池化层负责从图像中提取各种局部和全局特征,生成一系列特征图。全连接层则将这些特征图展平成一维向量,然后通过多层全连接网络对这些特征进行非线性变换和组合,最终输出分类结果或其他预测值。例如,在一个图像分类任务中,经过卷积和池化操作后得到的特征图,被展平后输入到全连接层,全连接层通过学习到的权重对这些特征进行加权组合,输出每个类别对应的概率值,概率最大的类别即为图像的预测类别。全连接层的参数数量通常较多,需要大量的数据进行训练,以学习到有效的特征组合模式,从而实现准确的分类或预测。​

三、LeNet 网络​

3.1 LeNet 的网络结构​

3.1.1 整体架构概述​

LeNet 是最早成功应用于数字识别任务的卷积神经网络,由 Yann LeCun 等人在 1998 年提出。其经典的网络结构包含卷积层、池化层和全连接层。LeNet 的输入通常是大小为32×32的图像,经过一系列的卷积、池化和全连接操作后,输出 10 个类别(对应 0 - 9 的数字)的预测结果。整体架构呈现出一种层次化的特征提取和分类过程,通过逐步抽象和整合图像特征,实现对数字的准确识别。​

3.1.2 各层详细介绍​

卷积层 1 :该层使用 6 个 5×5 的卷积核,步长为 1,填充为 0。这意味着每个卷积核在输入图像上滑动时,每次移动一个像素,且不进行边缘填充。经过这一层卷积操作后,输入的 32×32 图像被转换为 6 个大小为 28×28 的特征图。这一步主要是提取图像中的一些基础局部特征,如数字的边缘、拐角等。​

池化层 1 :紧接卷积层 1 之后的是平均池化层,池化窗口大小为 2×2 ,步长为 2。通过平均池化,将前面得到的 6 个 28×28 的特征图下采样为 6 个 14×14 的特征图。池化操作不仅减少了数据量,还增强了特征的鲁棒性,使网络对数字的位置和大小变化有一定的容忍度。​

卷积层 2 :此层使用 16 个 5×5 的卷积核,步长为 1,填充为 0。对池化层 1 输出的 6 个特征图进行卷积操作,得到 16 个大小为 10×10 的特征图。随着网络层次的加深,卷积核的数量增加,这使得网络能够提取更复杂、更具代表性的特征,进一步抽象数字的特征信息。

池化层 2 :同样采用平均池化,池化窗口和步长与池化层 1 相同。将 16 个10×10 的特征图下采样为 16 个 5×5 的特征图,继续减少数据量并增强特征的稳定性。​

全连接层 1 :将池化层 2 输出的 16 个 5×5 的特征图展平为一个长度为 16×5×5=400 的一维向量,然后输入到全连接层。该全连接层有 120 个神经元,通过全连接的方式对前面提取的特征进行初步整合和非线性变换。​

全连接层 2 :这一层有 84 个神经元,接收全连接层 1 的输出,并进一步对特征进行组合和变换,为最终的分类做准备。​

输出层:最后一层是输出层,有 10 个神经元,对应 10 个数字类别。通过 softmax 激活函数,将前面全连接层输出的特征转换为每个类别对应的概率值,概率最大的类别即为预测的数字。​

3.2 LeNet 的工作原理​

3.2.1 特征提取过程​

LeNet 的特征提取过程从输入图像开始,通过卷积层的卷积核在图像上滑动,提取不同的局部特征。例如,一些卷积核可能对水平边缘敏感,一些对垂直边缘敏感,还有一些对拐角等特征敏感。随着卷积层的堆叠,低级的局部特征逐渐被组合成更高级、更抽象的特征。池化层在特征提取过程中起到筛选和压缩特征的作用,通过保留局部区域内最重要的特征(如最大池化)或平均特征(如平均池化),减少特征图的尺寸,降低计算量,同时增强特征对图像变换的鲁棒性。这种层次化的特征提取方式,使得网络能够逐步从原始图像数据中挖掘出对数字识别最有价值的特征信息。​

3.2.2 分类决策机制​

在经过卷积和池化层的特征提取后,全连接层开始发挥作用。全连接层通过一系列的权重矩阵和偏置,对前面提取的特征进行加权组合和非线性变换。在训练过程中,网络通过反向传播算法不断调整全连接层的权重和偏置,使得网络输出的结果与真实标签之间的差异(通常用交叉熵损失函数衡量)最小化。最终,输出层通过 softmax 激活函数将全连接层的输出转换为概率分布,每个类别对应一个概率值。网络预测的类别即为概率最大的那个类别,从而实现对输入数字图像的分类决策。​

3.3 LeNet 代码示例(Python + Keras)​

python 复制代码
from keras.models import Sequential​
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense​
​
# 创建LeNet模型​
model = Sequential()​
​
# 卷积层1​
model.add(Conv2D(6, kernel_size=(5, 5), activation='relu', input_shape=(32, 32, 1)))​
# 池化层1​
model.add(MaxPooling2D(pool_size=(2, 2)))​
# 卷积层2​
model.add(Conv2D(16, kernel_size=(5, 5), activation='relu'))​
# 池化层2​
model.add(MaxPooling2D(pool_size=(2, 2)))​
# 全连接层1​
model.add(Flatten())​
model.add(Dense(120, activation='relu'))​
# 全连接层2​
model.add(Dense(84, activation='relu'))​
# 输出层​
model.add(Dense(10, activation='softmax'))​
​
# 编译模型​
model.compile(loss='categorical_crossentropy',​
              optimizer='adam',​
              metrics=['accuracy'])​

​ 在这段代码中,使用 Keras 库构建 LeNet 模型。首先创建一个Sequential模型,它是一个线性堆叠的模型。然后依次添加各个层,Conv2D表示二维卷积层,第一个参数是卷积核的数量,kernel_size指定卷积核大小,activation设置激活函数为 ReLUinput_shape指定输入图像的形状为
32×32 且为单通道(因为数字图像通常为灰度图)。MaxPooling2D是最大池化层,pool_size指定池化窗口大小。Flatten层用于将多维特征图展平为一维向量,以便输入到全连接层。Dense层表示全连接层,参数为神经元数量。最后,使用compile方法编译模型,指定损失函数为交叉熵损失(适用于多分类问题),优化器为 Adam,评估指标为准确率。​

3.4 LeNet 的应用与局限性​

3.4.1 数字识别等早期应用​

​ LeNet 在数字识别领域取得了巨大成功,被广泛应用于手写数字识别、邮政编码识别等场景。例如,在银行支票处理系统中,LeNet 可以准确识别支票上的手写数字金额,大大提高了处理效率和准确性。在早期的 OCR(光学字符识别)系统中,LeNet 也作为核心模型,对印刷体和手写体数字的识别发挥了重要作用,为后续更复杂的字符识别技术发展奠定了基础。​

3.4.2 局限性分析​

​ 尽管 LeNet 在当时具有开创性意义,但随着计算机视觉任务的日益复杂和数据量的不断增加,其局限性也逐渐显现。首先,LeNet 的网络结构相对简单,层数较少,提取复杂特征的能力有限。在处理自然图像等具有丰富纹理和复杂场景的图像时,难以准确提取到足够的有效特征,导致识别准确率不高。其次,LeNet 的参数数量相对较少,对于大规模数据集的拟合能力不足,容易出现欠拟合现象。而且,早期的计算资源有限,LeNet 在训练和推理时的速度也受到一定限制,难以满足实时性要求较高的应用场景。随着深度学习技术的发展,研究人员开始探索更强大、更复杂的网络结构来克服这些局限性。​

四、ResNet 网络​

4.1 ResNet 的提出背景与创新点​

4.1.1 深度神经网络的梯度消失问题​

​ 随着神经网络层数的增加,网络的表达能力理论上会增强,但在实际训练中却面临梯度消失(Gradient Vanishing)问题。在反向传播过程中,梯度在多层传递过程中逐渐变小,导致前面的层难以更新权重,网络训练效果不佳。传统的解决方法如调整学习率、选择合适的激活函数等,并不能完全解决随着网络深度增加而出现的梯度消失问题。这限制了神经网络向更深层次发展,无法充分利用深度网络强大的特征提取能力。​

4.1.2 残差学习的引入​

​ ResNet(Residual Network)由何凯明等人在 2015 年提出,其核心创新点是引入了残差学习(Residual Learning)机制。ResNet 通过构建残差块(Residual Block),在网络中添加了捷径连接(shortcut connection),也称为跳跃连接(skip connection)。这种连接允许梯度直接从后面的层传递到前面的层,有效地解决了梯度消失问题。残差块的设计使得网络可以学习残差映射,即学习输入与期望输出之间的差异,而不是直接学习输入到输出的映射。假设输入为x,期望输出为H(x),传统网络试图直接学习

H(x),而 ResNet 则通过学习残差 F(x)=H(x)−x ,然后输出为 F(x)+x 。这样,即使在深层网络中,梯度也能够顺利传播,使得网络能够训练得更深,从而提取更复杂、更高级的特征。​

4.2 ResNet 的网络结构​

4.2.1 残差块的设计​

​ ResNet 的基本构建单元是残差块。残差块有多种形式,常见的有两种:一种是针对浅层网络的基本残差块,另一种是针对深层网络的瓶颈残差块(Bottleneck Block)。基本残差块由两个3×3的卷积层组成,中间使用 ReLU 激活函数。输入x首先经过第一个3×3卷积层,然后经过 ReLU 激活,再通过第二个3×3卷积层,得到残差F(x)。最后,将残差F(x)与输入

x相加,再经过一次 ReLU 激活,得到输出。其结构可以用以下公式表示:

其中,(y)是残差块的输出,(x)是输入,(F(x,W))是通过两个卷积层学习到的残差函数,(W)表示卷积层的权重。这种设计使得网络在学习过程中更容易优化,因为当残差为零时,网络可以直接学习到恒等映射,避免了因权重调整不当导致的性能退化。

4.2.2 不同深度的 ResNet 模型

基于残差块的设计,研究人员构建了不同深度的 ResNet 模型,如 ResNet - 18ResNet - 34ResNet - 50ResNet - 101ResNet - 152 等。这些模型的主要区别在于残差块的数量和类型。例如,ResNet - 18ResNet - 34 使用基本残差块,而 ResNet - 50ResNet - 101 ResNet - 152 则使用瓶颈残差块。以 ResNet - 18 为例,它包含 8 个残差块,由一个卷积层和一个最大池化层作为起始,然后是 4 个阶段,每个阶段包含 2 个残差块,最后接一个全局平均池化层和一个全连接层用于分类。随着网络深度的增加,模型能够学习到更复杂、更高级的特征表示,在大规模图像分类任务中的准确率也逐渐提高。例如,在 ImageNet 图像分类数据集上,ResNet - 152ResNet - 18 能够取得更高的分类准确率,这充分展示了深度网络在特征提取和分类能力上的优势。然而,网络深度的增加也会带来计算量和内存占用的增加,需要在实际应用中根据硬件资源和任务需求进行权衡选择。

4.3 ResNet 的工作原理

4.3.1 残差学习的优势

残差学习机制赋予了 ResNet 强大的学习能力。在传统的神经网络中,随着层数的增加,梯度在反向传播过程中逐渐消失,使得前面的层难以更新权重,导致网络性能下降。而 ResNet 的残差块通过捷径连接,使得梯度可以直接从后面的层传递到前面的层,有效地解决了梯度消失问题。这意味着即使网络非常深,前面的层也能够接收到足够的梯度信息进行权重更新,从而保证网络能够正常训练。同时,残差学习使得网络更容易学习到恒等映射。当网络学习到的残差为零时,输出就等于输入,这在网络训练初期非常重要,因为它可以避免网络在初始阶段因为权重随机初始化而导致的性能退化。随着训练的进行,网络逐渐学习到有效的残差映射,从而不断提升性能。例如,在训练过程中,网络可能首先学习到一些简单的残差,如边缘特征的增强或减弱,然后随着训练的深入,逐渐学习到更复杂的残差,如物体的形状、纹理等特征的提取和组合。

4.3.2 网络训练与优化

在训练 ResNet 时,通常采用随机梯度下降(SGD)及其变种(如 Adagrad、Adadelta、Adam 等)作为优化器。在训练过程中,网络通过前向传播计算预测结果,然后根据预测结果与真实标签之间的差异(通常用交叉熵损失函数衡量),通过反向传播算法计算梯度,并更新网络的权重。由于 ResNet 的残差结构使得梯度能够更好地传播,因此在训练过程中可以使用相对较大的学习率,加快训练收敛速度。同时,为了防止过拟合,通常会在网络中加入一些正则化技术,如 L1 和 L2 正则化、Dropout 等。在实际训练中,还需要对数据进行预处理,如归一化、数据增强(包括旋转、翻转、裁剪等操作),以提高模型的泛化能力。例如,在 ImageNet 数据集上训练 ResNet 时,通常会将图像的像素值归一化到 [0, 1] 区间,并且在训练过程中对图像进行随机裁剪、水平翻转等数据增强操作,以扩充数据集的多样性,提高模型对不同场景下图像的适应能力。

4.4 ResNet 代码示例(Python + Keras)

python 复制代码
from keras.models import Model
from keras.layers import Input, Conv2D, BatchNormalization, Activation, Add, GlobalAveragePooling2D, Dense

def basic_residual_block(x, filters):
    # 保存输入
    identity = x
    # 第一个卷积层
    x = Conv2D(filters, kernel_size=(3, 3), strides=(1, 1), padding='same')(x)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    # 第二个卷积层
    x = Conv2D(filters, kernel_size=(3, 3), strides=(1, 1), padding='same')(x)
    x = BatchNormalization()(x)
    # 将残差与输入相加
    x = Add()([x, identity])
    x = Activation('relu')(x)
    return x

def resnet18(input_shape=(224, 224, 3)):
    inputs = Input(shape=input_shape)
    # 初始卷积层
    x = Conv2D(64, kernel_size=(7, 7), strides=(2, 2), padding='same')(inputs)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    x = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(x)
    # 第一个残差模块
    x = basic_residual_block(x, 64)
    x = basic_residual_block(x, 64)
    # 第二个残差模块
    x = Conv2D(128, kernel_size=(3, 3), strides=(2, 2), padding='same')(x)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    x = basic_residual_block(x, 128)
    x = basic_residual_block(x, 128)
    # 第三个残差模块
    x = Conv2D(256, kernel_size=(3, 3), strides=(2, 2), padding='same')(x)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    x = basic_residual_block(x, 256)
    x = basic_residual_block(x, 256)
    # 第四个残差模块
    x = Conv2D(512, kernel_size=(3, 3), strides=(2, 2), padding='same')(x)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    x = basic_residual_block(x, 512)
    x = basic_residual_block(x, 512)
    # 全局平均池化层
    x = GlobalAveragePooling2D()(x)
    # 全连接层
    outputs = Dense(1000, activation='softmax')(x)
    model = Model(inputs=inputs, outputs=outputs)
    return model

# 创建ResNet18模型
model = resnet18()
# 编译模型
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

在这段代码中,首先定义了basic_residual_block函数来构建基本残差块。在残差块中,依次进行卷积、批归一化(BatchNormalization)和 ReLU 激活操作,最后将残差与输入相加并再次进行 ReLU 激活。然后定义了resnet18函数来构建完整的 ResNet - 18 模型。模型从输入层开始,经过初始的卷积、批归一化、激活和最大池化操作,然后依次堆叠 4 个残差模块,每个模块包含不同数量的基本残差块。最后通过全局平均池化层将特征图转换为一维向量,再经过全连接层和 softmax 激活函数输出分类结果。这里假设分类类别数为 1000,实际应用中可根据具体任务进行调整。最后创建并编译模型,使用交叉熵损失函数和 Adam 优化器,并将准确率作为评估指标。

4.5 ResNet 的性能表现与应用

4.5.1 在图像分类任务中的优势

在图像分类任务中,ResNet 凭借其深层的网络结构和残差学习机制,展现出了卓越的性能。与传统的浅层神经网络和一些早期的 CNN 模型(如 LeNet)相比,ResNet 能够学习到更丰富、更抽象的图像特征,从而在大规模图像分类数据集(如 ImageNet)上取得了显著的分类准确率提升。例如,在 ImageNet 2012 分类挑战赛中,ResNet - 152 的前 5 错误率(Top - 5 Error Rate)达到了惊人的 3.57%,相比之前的模型有了大幅下降。这得益于 ResNet 能够有效提取图像中物体的形状、纹理、颜色等多方面的特征,并通过深层网络对这些特征进行高度抽象和组合,从而准确地判断图像所属的类别。而且,由于残差学习解决了梯度消失问题,ResNet 可以构建得更深,进一步提升了模型的表达能力,使其能够适应更复杂的图像分类任务。

4.5.2 在其他计算机视觉任务中的应用拓展

除了图像分类,ResNet 在目标检测、语义分割、图像生成等其他计算机视觉任务中也得到了广泛应用。在目标检测任务中,ResNet 常被用作骨干网络(Backbone Network),为后续的目标定位和分类提供强大的特征提取能力。例如,在 Faster R - CNN 目标检测框架中,使用 ResNet 作为骨干网络可以显著提高检测精度,准确地识别和定位图像中的多个目标物体。在语义分割任务中,ResNet 的深层特征能够帮助网络更好地理解图像中不同物体和场景的语义信息,从而实现对图像中每个像素的类别标注。通过将 ResNet 与一些上采样模块(如反卷积层)相结合,可以构建出有效的语义分割模型,在医疗图像分割、自动驾驶场景分割等领域取得了良好的效果。在图像生成任务中,如生成对抗网络(GANs)中,ResNet 可以作为生成器或判别器的一部分,利用其强大的特征提取和生成能力,生成更加逼真、高质量的图像。例如,在人脸图像生成中,基于 ResNet 的生成器能够生成具有丰富细节和真实感的人脸图像。

4.6 ResNet 与 LeNet 的对比分析

4.6.1 网络结构差异

LeNet 的网络结构相对简单,层数较少,主要由卷积层、池化层和全连接层组成,其输入图像大小通常为(32\times32)。而 ResNet 具有更深的网络结构,通过引入残差块解决了梯度消失问题,使得网络可以构建到非常深的层次,如 ResNet - 152 包含多达 152 层。ResNet 的输入图像大小一般为(224\times224)及以上,能够处理更复杂、分辨率更高的图像。LeNet 的卷积核大小相对固定,如卷积层 1 使用(5\times5)的卷积核,而 ResNet 的卷积核大小在不同层有所变化,并且采用了不同类型的残差块(基本残差块和瓶颈残差块)来适应不同的网络深度和计算需求。

4.6.2 性能表现对比

在性能方面,LeNet 在数字识别等简单任务中表现良好,但在处理自然图像等复杂场景时,由于其网络结构简单,提取复杂特征的能力有限,分类准确率较低。而 ResNet 在大规模图像分类任务中展现出了强大的性能,能够准确地提取复杂图像中的各种特征,在 ImageNet 等数据集上取得了非常高的分类准确率。例如,在处理包含多种物体、复杂背景和光照变化的自然图像时,ResNet 能够通过深层网络学习到更具代表性的特征,从而实现更准确的分类,而 LeNet 往往难以应对这种复杂情况。此外,由于 LeNet 参数数量较少,对于大规模数据集的拟合能力不足,容易出现欠拟合现象;而 ResNet 通过深层网络和残差学习机制,能够更好地拟合大规模数据集,提高模型的泛化能力。

4.6.3 应用场景适应性

LeNet 主要适用于一些简单的图像识别任务,如手写数字识别、简单字符识别等,这些任务图像特征相对单一,数据量相对较小。而 ResNet 由于其强大的特征提取能力和对复杂场景的适应能力,适用于各种复杂的计算机视觉任务,包括自然图像分类、目标检测、语义分割、图像生成等。在实际应用中,如自动驾驶中的场景感知、医学图像分析中的疾病诊断、安防监控中的目标识别等领域,ResNet 都发挥着重要作用,能够处理大量复杂的数据,为决策提供准确的信息。

五、总结与展望

从 LeNet 到 ResNet,卷积神经网络经历了从简单到复杂、从浅层到深层的发展历程。LeNet 作为 CNN 的开山之作,为后续的研究奠定了基础,其在数字识别等简单任务中的成功应用展示了 CNN 在图像特征提取和分类方面的潜力。然而,随着计算机视觉任务的日益复杂和数据量的不断增加,LeNet 的局限性逐渐显现。ResNet 通过引入残差学习机制,创新性地解决了深度神经网络中的梯度消失问题,使得网络能够构建得更深,从而极大地提升了模型的表达能力和性能。ResNet 在图像分类、目标检测、语义分割等众多计算机视觉任务中取得了卓越的成果,成为了现代计算机视觉领域的重要基石。

展望未来,卷积神经网络将继续在计算机视觉领域发挥核心作用。一方面,研究人员将不断探索新的网络结构和算法,进一步提升 CNN 的性能和效率。例如,探索更高效的残差结构、优化网络的计算复杂度,以在有限的硬件资源下实现更好的性能。另一方面,随着人工智能技术的不断发展,CNN 将与其他领域的技术(如强化学习、迁移学习、生成对抗网络等)深度融合,拓展其在更多复杂任务中的应用。例如,在自动驾驶中,结合 CNN 和强化学习实现智能驾驶决策;在医学图像分析中,利用迁移学习和 CNN 快速准确地诊断疾病。同时,随着硬件技术的进步(如 GPU、TPU 等的发展),将为 CNN 的训练和推理提供更强大的计算支持,推动计算机视觉技术在更多领域的广泛应用和创新发展。通过不断的研究和创新,卷积神经网络有望在未来解决更多现实世界中的复杂问题,为人类社会的发展带来更多的便利和价值。

致读者一封信

亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


----------- 业精于勤,荒于嬉 -----------


----------- 行成于思,毁于随 -----------



💞 关注博主 带你实现畅游前后端

🏰 大屏可视化 带你体验酷炫大屏

💯 神秘个人简介 带你体验不一样得介绍

🎀 酷炫邀请函 带你体验高大上得邀请


① 🉑提供云服务部署;

② 🉑提供前端、后端、应用程序、H5、小程序、公众号等相关业务;

③ 🉑提供产品测评,产品推广业务;

如🈶合作请联系我,期待您的联系。

:本文撰写于CSDN平台 ,作者:xcLeigh所有权归作者所有)https://xcleigh.blog.csdn.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌


原文地址:https://xcleigh.blog.csdn.net/article/details/147003261(防止抄袭,原文地址不可删除)

相关推荐
AIGC方案1 小时前
deepseek热度已过?
人工智能·大模型
88号技师1 小时前
模糊斜率熵Fuzzy Slope entropy+状态分类识别!2024年11月新作登上IEEE Trans顶刊
人工智能·机器学习·分类·数据挖掘·信号处理·故障诊断·信息熵
死磕代码程序媛2 小时前
谷歌25年春季新课:15小时速成机器学习
人工智能·机器学习
有Li2 小时前
弥合多层次差距:用于超声心动图中基于文本引导的标签高效分割的双向循环框架|文献速递-深度学习医疗AI最新文献
人工智能
橙色小博2 小时前
Transformer模型解析与实例:搭建一个自己的预测语言模型
人工智能·深度学习·神经网络·机器学习·transformer
意.远3 小时前
PyTorch实现二维卷积与边缘检测:从原理到实战
人工智能·pytorch·python·深度学习·神经网络·计算机视觉
电报号dapp1193 小时前
2025年智能合约玩法创新白皮书:九大核心模块与收益模型重构Web3经济范式
人工智能·重构·web3·去中心化·区块链·智能合约
三道杠卷胡3 小时前
【AI News | 20250411】每日AI进展
人工智能·python·计算机视觉·语言模型·aigc
汪子熙3 小时前
利用 Trae 开发平面直角坐标系的教学动画
人工智能·trae
区块链蓝海3 小时前
Cables 现已正式启动积分计划 Alpha 阶段,开放早期白名单申请
人工智能·区块链