计算机视觉卷积神经网络(CNN)基础:从LeNet到ResNet
计算机视觉卷积神经网络(CNN)基础:从LeNet到ResNet
- 一、前言
- 二、卷积神经网络基础概念
- 2.1 卷积层
- 2.1.1 卷积运算原理
- 2.1.2 卷积核的作用与参数
- 2.2 池化层
- 2.2.1 最大池化与平均池化
- 2.2.2 池化层的优势与应用
- 2.3 全连接层
- 2.3.1 全连接层的连接方式
- 2.3.2 全连接层在 CNN 中的角色
- 三、LeNet 网络
- 3.1 LeNet 的网络结构
- 3.1.1 整体架构概述
- 3.1.2 各层详细介绍
- 3.2 LeNet 的工作原理
- 3.2.1 特征提取过程
- 3.2.2 分类决策机制
- 3.3 LeNet 代码示例(Python + Keras)
- 3.4 LeNet 的应用与局限性
- 3.4.1 数字识别等早期应用
- 3.4.2 局限性分析
- 四、ResNet 网络
- 4.1 ResNet 的提出背景与创新点
- 4.1.1 深度神经网络的梯度消失问题
- 4.1.2 残差学习的引入
- 4.2 ResNet 的网络结构
- 4.2.1 残差块的设计
- 4.2.2 不同深度的 ResNet 模型
- 4.3 ResNet 的工作原理
- 4.3.1 残差学习的优势
- 4.3.2 网络训练与优化
- 4.4 ResNet 代码示例(Python + Keras)
- 4.5 ResNet 的性能表现与应用
- 4.5.1 在图像分类任务中的优势
- 4.5.2 在其他计算机视觉任务中的应用拓展
- 4.6 ResNet 与 LeNet 的对比分析
- 4.6.1 网络结构差异
- 4.6.2 性能表现对比
- 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)是卷积核内的坐标,M和N分别是卷积核的高度和宽度。通过这种方式,卷积核可以提取输入图像中的局部特征,不同的卷积核权重设置可以捕捉到不同类型的特征,如边缘、纹理等。
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)
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
设置激活函数为 ReLU
,input_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 - 18
、ResNet - 34
、ResNet - 50
、ResNet - 101
和 ResNet - 152
等。这些模型的主要区别在于残差块的数量和类型。例如,ResNet - 18
和 ResNet - 34
使用基本残差块,而 ResNet - 50
、ResNet - 101
和 ResNet - 152
则使用瓶颈残差块。以 ResNet - 18
为例,它包含 8 个残差块,由一个卷积层和一个最大池化层作为起始,然后是 4 个阶段,每个阶段包含 2 个残差块,最后接一个全局平均池化层和一个全连接层用于分类。随着网络深度的增加,模型能够学习到更复杂、更高级的特征表示,在大规模图像分类任务中的准确率也逐渐提高。例如,在 ImageNet 图像分类数据集上,ResNet - 152
比 ResNet - 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)
from keras.models import Model
from keras.layers import Input, Conv2D, BatchNormalization, Activation, Add, GlobalAveragePooling2D, Densedef 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 xdef 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(防止抄袭,原文地址不可删除)
相关文章:
计算机视觉卷积神经网络(CNN)基础:从LeNet到ResNet
计算机视觉卷积神经网络(CNN)基础:从LeNet到ResNet 一、前言二、卷积神经网络基础概念2.1 卷积层2.1.1 卷积运算原理2.1.2 卷积核的作用与参数 2.2 池化层2.2.1 最大池化与平均池化2.2.2 池化层的优势与应用 2.3 全连接层2.3…...
在封装DLL时,避免第三方命名空间的依赖方法[PIMPL模式技术指南]
1. 概述 PIMPL(Pointer to IMPLementation)模式是C++中实现信息隐藏和二进制兼容性的重要设计范式,通过创建实现细节的私有封装层,有效隔离接口与实现。本文档详细阐述其核心原理、现代实现方式和典型应用场景。 2. 核心架构 2.1 经典结构 // 头文件(widget.h) class Wid…...
镜舟科技亮相 2025 中国移动云智算大会,展示数据湖仓一体创新方案
4月10-11日,2025 中国移动云智算大会在苏州金鸡湖国际会议中心成功举办。大会以“由云向智,共绘算网新生态”为主题,汇聚了众多行业领袖与技术专家,共同探讨了算力网络与人工智能的深度融合与未来发展趋势。 作为中国领先的企业级…...
通过Python实现定时重启H3C AP设备
一、背景 因为H3C的AP设备老化,网络出现高延迟、高丢包率,需要隔一段时间去重启AP后恢复。但是由于白天在使用无法进行重启,并且容易遗忘等用户反馈又太晚了,但是AC版本太老没有定时重启功能,于是通过Python做了自动重…...
火山RTC 4 音视频引擎 IRTCVideo,及 音视频引擎事件回调接口 IRTCVideoEventHandler
一、IRTCVideo、IRTCVideoEventHandler 音视频引擎 IRTCVideo,及 音视频引擎事件回调接口 IRTCVideoEventHandler 负责音视频管理、创建房间/获得房间实例 1、创建引擎、及事件回调示例 如: void VideoConfigWidget::initRTCVideo() {m_handler.res…...
Matlab 考虑电机激励力的整车垂向七自由度模型参数研究
1、内容简介 Matlab 201-考虑电机激励力的整车垂向七自由度模型参数研究 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
Matlab 三容水箱系统故障诊断算法研究
1、内容简介 Matlab 190-三容水箱系统故障诊断算法研究 可以交流、咨询、答疑 2、内容说明 略 其次,对 DTS200 三容水箱系统进行机理建模,可分为对象建模和故障 建模,搭建了水箱系统的 SIMULINK 模型并建立了基于 Taylor 展开及 T-…...
Mac学习使用全借鉴模式
Reference https://zhuanlan.zhihu.com/p/923417581.快捷键 macOS 的快捷键组合很多,相应的修饰键就多达 6 个(Windows 系统级就 4 个): Command ⌘ Shift ⇧ Option ⌥ Control ⌃ Caps Lock ⇪ Fn 全屏/退出全屏 command con…...
Arrays.asList() 隐藏的陷阱
在Java中,我们经常需要将数组转换为List来方便地进行操作。Arrays.asList()方法是一种常见的方式,但是它存在一个不太常见但需要注意的坑。 本文将深入探讨Arrays.asList()的使用,揭示其中的陷阱,并提供解决方案。 1、Arrays.as…...
Cables 现已正式启动积分计划 Alpha 阶段,开放早期白名单申请
Cables 现已正式启动积分计划,并开放白名单抢先体验通道,这标志着 Cables 平台进入第一阶段的部署,旨在为外汇及现实世界资产(RWAs)构建首个集成的流动性质押与永续期货 DEX。 Cables 平台的设计目标是通过单一系统实…...
Spring Cloud 远程调用
4.OpenFeign的实现原理是什么? 在使用OpenFeign的时候,主要关心两个注解,EnableFeignClients和FeignClient。整体的流程分为以下几个部分: 启用Feign代理,通过在启动类上添加EnableFeignClients注解,开启F…...
STM32单片机中EXTI的工作原理
目录 1. EXTI概述 2. EXTI的组成部分 3. 工作原理 3.1 引脚配置 3.2 中断触发条件 3.3 中断使能 3.4 中断处理 4. 使用示例 5. 注意事项 结论 在STM32单片机中,EXTI(外部中断)是一种用于处理外部事件的机制,能够提高对硬…...
排序算法详细介绍对比及备考建议
文章目录 排序算法对比算法逐一介绍1. 冒泡排序(Bubble Sort)2. 选择排序(Selection Sort)3. 插入排序(Insertion Sort)4. 希尔排序(Shell Sort)5. 归并排序(Merge Sort&…...
网页布局思路
一、布局思路 1,确定页面的版心(可视区) 2、分析页面中的行模块,以及每个行模块中的列模块。(页面布局第一准则) 3、一行中的列模块经常用浮动布局,先确定每个列的大小,之后确定列的位置(页面…...
CloudFlare Page 如何和 GitHub 创建连接
CloudFlare Page 能够对前端项目进行构建。 他们能支持从 GitHub 上直接拉取代码。 如果 GitHub 上的代码仓库不存在的话,首先需要创建一个连接才可以。 随后会要求登录 GitHub,然后可以在希望访问的组织中进行选择。 随后同意访问赋予权限即可。 Clou…...
Python爬虫第13节-解析库pyquery 的使用
目录 前言 一、pyquery 初始化 1.1 字符串初始化 1.2 URL 初始化 1.3 文件初始化 二、基本 CSS 选择器 三、pyquery 查找节点 3.1 子节点 3.2 父节点 3.3 兄弟节点 四、遍历 五、获取信息 5.1 获取属性 5.2 获取文本 六、节点操作 6.1 addClass 和 removeClass…...
【学习笔记】头文件中定义函数出现重复定义报错
目录 错误复现原因解决方案inlinestatic 扩展参考 错误复现 现在有一个头文件 duplicate_define.h 和两个源文件 duplicate_define_1.cpp 和 duplicate_define_2.cpp。 两个源文件都引入了头文件 duplicate_define.h,且在各自的函数中调用了定义在头文件中的全局函…...
Java 中的零拷贝技术:提升性能的利器
Java 中的零拷贝技术:提升性能的利器 在现代高性能应用中,数据传输的效率至关重要。传统的 I/O 操作通常涉及多次数据拷贝,这会导致性能瓶颈。而零拷贝(Zero-Copy)技术通过减少数据拷贝次数,显著提升了 I/…...
JavaScript:基本语法
今天我要介绍的新知识点内容为:JavaScript的基本语法以及使用说明。 首先我们先了解一下JS(JavaScript简称)是什么以及怎么使用JS: 介绍:JavaScript(JS)是一门弱类型的语言,用于给HTML页面上添加动态效果…...
Matlab 三维时频图
1、内容简介 Matlab 202-三维时频图 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
MySQL中动态生成SQL语句去掉所有字段的空格
在MySQL中动态生成SQL语句去掉所有字段的空格 在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况。其中,去掉字段中的空格是一项常见的操作。当表中的字段数量较少时,我们可以手动编写 UPDATE 语句来处理。但如果表中包…...
NO.91十六届蓝桥杯备战|图论基础-图的存储和遍历|邻接矩阵|vector|链式前向星(C++)
图的基本概念 图的定义 图G是由顶点集V和边集E组成,记为G (V, E),其中V(G)表⽰图G中顶点的有限⾮空集;E(G)表⽰图G中顶点之间的关系(边)集合。若 V { v 1 , v 2 , … , v n } V \left\{ v_{1},v_{2},\dots,v_{n} …...
树、二叉树、二叉查找树、AVL 树及红黑树的深入解析
树、二叉树、二叉查找树、AVL 树及红黑树的深入解析 1 .树的基本知识1.1 树的定义1.2 基本术语和概念1.3 常见树的结构1.4 树的遍历(取决于什么时候访问根节点) 2 二叉树2.1 二叉树的定义2.2二叉树与度为2的树的区别2.3二叉树的性质2.4 二叉树分类 3 红黑…...
BUUCTF-web刷题篇(21)
30.hark world 判断注入类型: 输入1报错提示bool(false)可知是字符型的布尔注入(盲注) 尝试万能密码 1 or 11 已检测SQL注入,猜测某些关键词或者字符被过滤。 使用FUZZ字典爆破...
Linux 网络基础知识总结
Linux 网络基础知识总结 1. 计算机网络体系结构 • OSI七层模型 由国际化标准组织(ISO)制定,将网络通信分为七层: • 物理层:比特流传输(如网线、光纤)。 • 数据链路层:帧传输&am…...
Day 8 上篇:深入理解 Linux 驱动模型中的平台驱动与总线驱动
在 Linux 内核驱动模型中,设备与驱动的组织方式不是随意堆砌,而是基于清晰的分类逻辑进行架构设计的。最核心的架构基础是“设备模型”(Device Model),而在此模型之上,各类驱动通过“平台驱动模型”与“总线…...
如何启动spark
解决:spark的bin目录下,无法启动spark问题 [roothadoop7 sbin]# ./start-all.sh ./start-all.sh:行29: /root/install/spark-2.4.0-bin-hadoop2.7/sbin/spark-config.sh: 没有那个文件或目录 ./start-all.sh:行32: /root/install/spark-2.4.0-bin-hadoo…...
Java网络编程干货
1.网络编程是什么 了解 在Java语言中,我们可以使用java.net包下的技术轻松开发出常见的网络应用程序,从而把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统&#x…...
Java实现安卓手机模拟操作
文章目录 第一部分:安卓模拟操作基础1.1 安卓输入系统概述1.1.1 输入事件传递机制1.1.2 输入事件类型 1.2 模拟操作的核心类1.2.1 Instrumentation类1.2.2 KeyEvent类1.2.3 MotionEvent类 1.3 权限要求1.3.1 普通权限1.3.2 特殊权限 第二部分:基础模拟操…...
一文讲清楚PLC、运动控制卡、运动控制器
随着工业技术的发展,工业机器人应用越来越广泛,PLC也不再是简单的可编程逻辑控制器,各个品牌厂家都推出了自己的运动控制型PLC,来实现一些运动控制功能,与此同时,运动控制卡及运动控制器也在如火如荼地发展…...
蓝桥杯备战
#include<bits/stdc.h> using namespace std; int main(){ios::sync_with_stdio(false);cin.tie(0);return 0; } 输入输出加速 ios::sync_with_stdio(false) 作用: 禁用 C 和 C 标准流的同步,使 cin/cout 速度接近 scanf/printf。 适用性ÿ…...
python保留关键字详解
一、什么是保留关键字? 保留关键字是Python语言中具有特殊含义和功能的词汇,这些词汇构成了Python的语法基础。它们不可被重新定义或用作变量名、函数名等标识符,在代码中承担着控制程序逻辑、定义数据结构等重要职责。 二、查看保留关键字…...
NLP中的“触发器”形式
在自然语言处理(NLP)中,触发器的设计更加依赖于文本特征,而非视觉特征。以下是NLP中常见的触发器类型及其实现方式: 1. 特定词汇或短语 定义:在文本中插入特定的单词、短语或符号。示例: 罕见…...
uView修改样式(持续更新)
场景 通过样式穿透修改uView2.0组件样式,用于app 注意版本不一样方法可能不同 实现 通用 .uni-body{line-height: 0; }u-input ::v-deep .u-input{height: 20.51rpx !important;padding: 0 6.59rpx !important; } ::v-deep .uni-input-input{height:50%;font-s…...
使用 Datadog 和 Slack Alerts 监控 AWS EC2
监控是大多数 IT 专业人员的关键职责之一。如果您最近正在寻找新工作,您可能已经注意到“监控”一词几乎出现在许多组织发布的每份职位描述中。 您可以找到各种监控工具,它们提供一些卓越的功能来简化您的工程工作。然而,Datadog 是大多数组…...
grafana/loki 部署搜集 k8s 集群日志
grafana/loki 和 grafana/loki-stack 的区别 Grafana 提供了多个 Helm Chart 用于在 Kubernetes 集群中部署 Loki 及相关组件,其中主要包括 grafana/loki 和 grafana/loki-stack。它们的主要区别如下: 1.grafana/loki Helm Chart: 专注于 Loki 部署: 该 Chart 专门…...
【ESP32S3】GATT Server service table传送数据到调试助手
前言 在初步学习esp32蓝牙的过程中,借鉴了官方的GATT Server Service Table Example,可以在readme中看到,此demo是采用低功耗蓝牙的通用属性服务器来创建订阅服务和特性。如果你接触过MQTT,你会发现GATT Server这一特性和MQTT的订…...
《Vue Router实战教程》5.嵌套路由
欢迎观看《Vue Router 实战(第4版)》视频课程 嵌套路由 一些应用程序的 UI 由多层嵌套的组件组成。在这种情况下,URL 的片段通常对应于特定的嵌套组件结构,例如: 通过 Vue Router,你可以使用嵌套路由配置…...
小白学习java第12天:IO流之转换流
我们可能会遇到这样情况就是:你在读取那个文件编码类型是GBK,而是进行读取的的时候使用的UTF-8,这就会导致乱码,因为你没办法保证别人是用什么类型进行编写的,因此我们就需要转换流进行处理这种情况! 下面…...
BERT - 直接调用transformers.BertModel, BertTokenizerAPI不进行任何微调
本节代码将使用 transformers 库加载预训练的BERT模型和分词器(Tokenizer),并处理文本输入。 1. 加载预训练模型和分词器 from transformers import BertTokenizer, BertModelmodel_path "/Users/azen/Desktop/llm/models/bert-base-…...
如何在 Spring Boot 项目中使用 MyBatis 进行批量操作以提升性能?
MyBatis 提供了 ExecutorType.BATCH 类型,允许将多个 SQL 语句进行组合,最后统一执行,从而减少数据库的访问频率,提升性能。 以下是如何在 Spring Boot 项目中使用 MyBatis 进行批量操作的关键点: 1. 配置 MyBatis 使…...
传统门店VS智慧门店:电能物联网平台在连锁行业的节能应用
前言 随着连锁零售行业门店的规模化发展,能源消耗成为企业成本管控与可持续发展的重要课题。在当今快节奏的商业环境中,连锁门店的管理和运营变得越来越具有挑战性。能源数据是连锁门店的管理中重要组成部分,为了提高门店的能源利用效率和管…...
[ctfshow web入门] RCE 或(or)、异或(xor)、非(not)绕过
代码 这是一个python语言的,使用或(or)、异或(xor)、非(not)防火墙 这将根据命令提供加密后的指令,用法 rce_xor(list_cmd)、rce_or(list_cmd)、rce_not(list_cmd) 用来生成加密后的指令,这个指令是类如下面这样的,这些指令可以用…...
C++ 虚函数:深入理解多态的核心机制
C 虚函数:深入理解多态的核心机制 在 C 里,虚函数是实现 多态(Polymorphism) 的关键机制之一。透彻理解虚函数的概念、实现方式以及使用场景,对编写高效且可扩展的 C 代码起着至关重要的作用。本文会详细介绍 C 虚函数…...
速盾:高防CDN节点对收录有影响吗?
引言 搜索引擎收录是网站运营中至关重要的环节,它直接影响着网站的曝光度和流量。近年来,随着网络安全威胁的增加,许多企业开始采用高防CDN(内容分发网络)来保护其网站免受DDoS攻击和其他形式的网络攻击。然而&#x…...
按规则批量修改文件扩展名、删除扩展名或添加扩展名
文件的扩展名是多种多样的,有些不同文件的扩展名之间相互是可以直接转换的。我们工作当中最常见的就是 doc 与 docx、xls 与 xlsx、jpg 与 jpeg、html 与 htm 等等,这些格式在大部分场景下都是可以相互转换 能直接兼容的。我们今天要介绍的就是如何按照一…...
在Java项目中,引入【全局异常处理器】
目录 一.为什么引入全局异常处理器(目前项目碰到了什么问题)? 1.问题描述 2.与预期的差别 3.解决方案 二.解决上述问题 1.定义【业务异常类】 2.在serviceImpl层,手动抛出【违反唯一性约束】这个异常 3.定义【全局异常处理…...
计算机网络-TCP协议详解
TCP协议详解 2. TCP协议详解2.1 TCP协议概述2.1.1 TCP的历史背景2.1.2 TCP的设计目标2.1.3 TCP的基本特性2.1.4 TCP与其他传输协议的比较2.1.5 TCP的应用场景 2.2 TCP头部结构2.2.1 TCP头部格式2.2.2 TCP头部字段详解源端口号和目的端口号(各16位)序列号…...
[蓝桥杯 2023 省 A] 平方差
P9231 [蓝桥杯 2023 省 A] 平方差 题目描述 给定 L , R L,R L,R,问 L ≤ x ≤ R L \leq x \leq R L≤x≤R 中有多少个数 x x x 满足存在整数 y , z y,z y,z 使得 x y 2 − z 2 xy^2-z^2 xy2−z2。 输入格式 输入一行包含两个整数 L , R L,R L,Rÿ…...
隐私通信新时代:磐石云AXB平台如何重塑企业安全防线?
在数据泄露频发的当下,企业如何守护用户隐私?磐石云AXB隐私号平台以四大技术革新,构建通信安全堡垒。 技术突破: 动态号码隔离,隐私0泄露 AXB模式下,A与B的真实号码全程隐藏,仅通过虚拟号X中转…...