深度学习④【经典卷积神经网络演进:从LeNet到ResNet(重要意义)的架构革命】

发布于:2025-08-29 ⋅ 阅读:(10) ⋅ 点赞:(0)

文章目录


前言

在深度学习的浪潮中,卷积神经网络(CNN)的发展犹如一部精彩的技术进化史。从1998年Yann LeCun提出的LeNet-5,到2015年何恺明团队的ResNet,每一代经典网络架构都代表着计算机视觉领域的重要突破。这些模型不仅是技术创新的结晶,更是深度学习设计思想的完美体现。

本文将带您系统回顾CNN发展的辉煌历程:
✅ 基础CNN架构:卷积层、池化层、全连接层的设计原理
✅ LeNet-5:卷积神经网络的开山鼻祖
✅ AlexNet:开启深度学习新时代的里程碑
✅ VGGNet:深度规整化的经典典范
✅ GoogLeNet:多路径并行的创新设计
✅ ResNet:残差连接解决网络退化问题

无论您是深度学习初学者,还是希望深入理解CNN架构设计的开发者,这篇文章都将为您揭示经典网络背后的设计智慧和演进逻辑!


1.卷积神经网络基础架构

1.1 核心组件解析:

卷积神经网络的模型结构图(案例):
在这里插入图片描述

  1. 输入形状: 32x32
  2. 第一个卷积层输入 3 个 Channel, 输出 6 个 Channel, Kernel Size 为: 3x3
  3. 第一个池化层输入 30x30, 输出 15x15, Kernel Size 为: 2x2, Stride 为: 2
  4. 第二个卷积层输入 6 个 Channel, 输出 16 个 Channel, Kernel Size 为 3x3
  5. 第二个池化层输入 13x13, 输出 6x6, Kernel Size 为: 2x2, Stride 为: 2
  6. 第一个全连接层输入 576 维, 输出 120 维
  7. 第二个全连接层输入 120 维, 输出 84 维
  8. 最后的输出层输入 84 维, 输出 10 维

我们在每个卷积计算之后应用 relu 激活函数来给网络增加非线性因素。

卷积层:局部连接、权重共享的特征提取

使用代码实现上述结构卷积层的示例:

self.layer1 = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, 
            nn.ReLU(),
        )
self.layer2 = nn.Sequential(
            nn.Conv2d(in_channels=32, out_channels=128, kernel_size=3, stride=1),
            nn.ReLU(),

池化层:降维保持特征不变性

在每个卷积层激活函数后添加池化层(代码实现):

self.layer1 = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, stride=1),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
self.layer2 = nn.Sequential(
            nn.Conv2d(in_channels=32, out_channels=128, kernel_size=3, stride=1),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
        )

全连接层:高级特征分类决策

在卷积层非线性计算后添加线性权重全连接层:

self.linear = nn.Sequential(
#第一个全连接层
         nn.Linear(128 * 6 * 6, 2048), nn.ReLU(), nn.Dropout(0.5)
#第二个全连接层      
         nn.Linear(2048, 1024), nn.ReLU(), nn.Dropout(0.5)
#最后输出层         
         nn.Linear(1024, 10)

1.2 设计原则:感受野计算、参数数量控制、计算复杂度优化

在图像特征提取中直接进行全连接运算会丢失图像的颜色和空间等特性,是数据失去可信度,通过卷积层可以在提取特征的同时保留图像的空间性,线性层根据卷积提供的线性向量(特征参数)对特征数据构造全连接网络机构实现线性转换映射分类向量,通过损失函数梯度下降实现对图像的分类,完整的网络结构模型:

import torch
import torch.nn as nn


class ImageClassification(nn.Module):
    def __init__(self):
        super(ImageClassification, self).__init__()
        # 这是一层卷积层
        self.layer1 = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, stride=1),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Dropout(0.25),
        )

        self.layer2 = nn.Sequential(
            nn.Conv2d(in_channels=32, out_channels=128, kernel_size=3, stride=1),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Dropout(0.25),
        )

        self.linear1 = nn.Sequential(
            nn.Linear(128 * 6 * 6, 2048), nn.ReLU(), nn.Dropout(0.5)
        )

        self.linear2 = nn.Sequential(nn.Linear(2048, 1024), nn.ReLU(), nn.Dropout(0.5))

        self.out = nn.Linear(1024, 10)

    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = x.reshape(x.size(0), -1)
        x = self.linear1(x)
        x = self.linear2(x)
        return self.out(x)

2. LeNet-5(1998):CNN的黎明曙光

2.1 历史背景:Yann LeCun用于手写数字识别的开创性工作

1998年Yann LeCun等提出LeNets5 ,是第一个成功应用于手写数字识别问题并产生实际商业(邮政行业)价值的卷积神经网络
作者论文原文中的一段介绍:

  • 当前机器学习和计算机技术的进步已经使这样的方法成为可能。用字符识别算法作为一个案例研究,我们看到,人工设计的特征抽取方法,完全可以被仔细设计的直接基于像素图象的学习机很好地代替。用文档理解算法作为一个案例,我们看到,传统的构建方法是用人工集成多个设计好的模块,这种方法完全被一种统一的并且有原则的设计范式所取代,这种设计范式允许训练所有的模块以便优化全局的性能指标的,我们称之为图变换网络。

2.2 架构特点:卷积+池化+全连接的经典模式

LeNet5的网络结构示意图:
在这里插入图片描述
如图,该网络模型结构一共七层,3个卷积层,2个池化层,2个全连接层

2.3 技术贡献:首次证明CNN在图像识别中的有效性

在LeNet之前,图像识别主要依赖于手工特征提取和传统的机器学习算法。然而,手工特征提取不仅耗时耗力,而且很难适应不同的图像变化。LeNet的出现,使得图像识别可以自动从原始像素中学习特征,大大提高了识别的准确性和效率。

LeNet证明了CNN在图像识别任务中的有效性,为后续的研究者提供了重要的参考。此外,LeNet还引入了卷积层、池化层等关键组件,这些组件至今仍然是CNN的核心组成部分。

2.4 代码实现:使用PyTorch复现LeNet-5

LeNet5复现代码如下:

import torch
import torch.nn as nn
class LeNet5(nn.Module):
    def __init__(self):
        super(LeNet5, self).__init__()
        # 网络层
        self.C1 = nn.Sequential(
            nn.Conv2d(
                in_channels=1, out_channels=6, kernel_size=5, stride=1, padding=0
            ),
            nn.ReLU(inplace=True),
        )
        # 自适应的做到14 * 14
        self.S2 = nn.AdaptiveMaxPool2d(output_size=14)
        # C3
        self.C3_3_1 = LeNet5_C3_6(inchannels=3)
        self.C3_4_1 = LeNet5_C3_6(inchannels=4)
        self.C3_5_1 = LeNet5_C3_6(inchannels=4, outchannels=3)
        self.C3_6_1 = LeNet5_C3_6(inchannels=6, outchannels=1)
        # S4:自适应池化
        self.S4 = nn.AdaptiveMaxPool2d(output_size=5)
        # C5
        self.C5 = nn.Sequential(
            nn.Linear(in_features=16 * 5 * 5, out_features=120),
            nn.ReLU(inplace=True),
        )
        self.F6 = nn.Sequential(
            nn.Linear(in_features=120, out_features=84),
            nn.ReLU(inplace=True),
        )
        # 输出层
        self.Out = nn.Sequential(
            nn.Linear(in_features=84, out_features=10),
            nn.Softmax(dim=1)
        )

    def forward(self, x):
        x = self.C1(x)
        x = self.S2(x)
        c3_outchannel_3 = self.C3_3_1(x)  # 6
        c3_outchannel_4 = self.C3_4_1(x)  # 6
        c3_outchannel_5 = self.C3_5_1(x)  # 3
        c3_outchannel_6 = self.C3_6_1(x)  # 1
        x = torch.cat(
            (c3_outchannel_3, c3_outchannel_4, c3_outchannel_5, c3_outchannel_6), dim=1
        )
        x = nn.ReLU(inplace=True)(x)
        x = self.S4(x) # N 16 5 5
        x = x.view(x.size(0), -1)
        x = self.C5(x)
        x = self.F6(x)
        x = self.Out(x)
        
        return x

3. AlexNet(2012):深度学习的复兴之作

在图像分类领域不得不提的就是ImageNet大规模视觉挑战赛(ILSVRC),它被称为深度学习在图像分类任务研究方面进展的标杆。

​ AlexNet网络参加了ILSVRC2012年大赛,以高出第二名10%的性能优势取得了冠军,由传统的70%多的准确率提升到80%多。AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计的,也是在那年之后,更多的更深的神经网络被提出,他掀起了一波深度学习的浪潮,一个里程碑意义的网络

3.1 突破性成就:ImageNet 2012冠军,错误率大幅降低

2012年ImageNet大赛的比赛前五表现如下图:
在这里插入图片描述
AlxeNet以0.15的较低错误率拿下比赛的第一名

3.2 ReLU激活函数解决梯度消失

在往期章节激活函数部分有讲解到Relu激活函数,全称为:Rectified Linear Unit,也就目前为止用的最为广泛的激活函数之一,就诞生在此次比赛
在这里插入图片描述
解释:通过在x ≤ 0 x\leq 0x≤0 区域引入一个小的负斜率,这样即使输入值小于等于零,Leaky ReLU仍然会有梯度,允许神经元继续更新权重,避免神经元在训练过程中完全“死亡”的问题。

3.3 Dropout正则化防止过拟合

AlxeNet的网络结构模型图:
在这里插入图片描述
在上述网络结构中,作者在每一个全连接层之间都进行Dropout正则化方式,在一定程度上缓解过拟合的风险,增强了模型的泛化能力。
在这里插入图片描述

3.4 多GPU并行训练架构

在这里插入图片描述
多GPU训练架构:一种创新的训练方式缓解过多参数对于算力的负担以加快模型的训练速度的同时,交叉特征提取进一步增强了模型对于特征提取的完整性提升模型的性能。

4. VGGNet(2014):深度规整化的美学

VGG的亮点在于它通过堆叠多个卷积层,以小的卷积核和池化层的方式来增加网络深度,从而实现高精度的图像识别。这种方法可以有效地捕获图像中的高级特征,并通过不断拟合训练数据来提高识别准确率。

4.1 设计哲学:使用小卷积核(3×3)堆叠代替大卷积核

VggNet网络结构示意图:
在这里插入图片描述
VggNet的每层卷积都是使用3×3大小的卷积核对图像特征依次进行提取,使用多个小卷积核代替大卷积核使图像的特征在宽度和深度之间转换,因此VggNet网络的主要思想是在深度层面实现特征的高精度识别

4.2 核心贡献:系统证明网络深度的重要性

在这里插入图片描述
VggNet以其对特征深度的关注度构建的高精度模型在于众多模型的对比下成功脱颖而出,证明了网络深度在图像特征提取的重要性,通过多层的网络结构实现了特征的非线性变化

4.3 版本变体:VGG-11/13/16/19的层级结构对比

根据深度不同,有VGG11,VGG13,VGG16,VGG19。在日常使用过程中一般使用16层的那个,不同深度度模型对比如下图
在这里插入图片描述
测试表现:
在这里插入图片描述

4.4 优缺点分析:参数量大但特征提取能力强

优点

  • 与AlexNet同为链式结构,而且更加简单
  • 验证了通过不断加深网络结构可以提升性能

存在的不足

  • 该网络架构非常大,并且需要大量的计算资源来训练。这意味着,如果你想在较小的设备上使用VGG,比如移动设备或个人电脑,会发现它非常慢,并且可能无法获得足够的性能。
  • 由于VGG网络架构非常深,它可能会导致梯度消失或爆炸的问题。这是由于在非常深的神经网络中,梯度在传播过程中可能会变得非常小或非常大,从而导致模型无法正常训练。

VggNet在各方面的表现都比较优秀,但是它的架构缺陷导致的问题依旧存在。

5. GoogLeNet(2014):Inception的智慧

GoogLeNet(InceptionNet)取得了2014年ImageNet分类大赛的冠军,参数量远小于VGG系列网络,而精度和速度则超越了VGG系列。

5.1 Inception模块:多尺度特征并行提取

GoogLeNet的主要特点是采用了一种名为“Inception”模块的结构,该模块可以有效地捕捉图像中的多尺度特征
在Inception模块中,网络结构被分成多个并行的分支,每个分支都用于捕捉不同尺度的特征。这样,GoogLeNet网络就可以更有效地学习图像的特征,并且还可以减少网络的体积。
​ GoogLeNet还采用了一种名为“平均池化”的技术,该技术可以在不改变图像尺寸的情况下对图像进行降采样。这样,GoogLeNet网络就可以更快地处理图像,并且还可以提高网络的鲁棒性。

5.2 1×1卷积降维(网络中的网络)

GoogleNet 的瓶颈结构设计:
在这里插入图片描述
N1和N2代表不用卷积层的通道数,通过每一层通道乘积数的1×1卷积,这里的解释:N1×N2×1×1对于N1特征图而言,采取N2个N1通道的1×1卷积对N1特征图进行卷积操作,得到的道数为N2的特征图,当N1>N2时就实现了通道降维
拓展:
在整体网络中在进过一层卷积层如果下一层的通道书下于当前层的通道书就构成纺锤结构:
在这里插入图片描述

5.3 多分支结构融合不同感受野

GooleNet神经网络的独特点就是在于卷积的分支结构融合:
Inception结构由谷歌的研究人员在2014年提出,它的名字来源于电影《盗梦空间》,因为它设计时使用了多个并行的卷积神经网络模块,这些模块之间形成了一个嵌套的结构,就像人在梦中穿梭于不同场景中一样。

​ Inception结构的思想和之前的卷积思想不同,LeNet-5模型是将不同的卷积层通过串联连接起来的,但是Inception结构是通过串联+并联的方式将卷积层连接起来的。

​ Inception结构是对输入图像并行地执行多个卷积运算或池化操作,并将所有输出结果拼接为一个非常深的特征图,且不同大小卷积核的卷积运算可以得到图像中的不同信息,处理获取到的图像中的不同信息可以得到更好的图像特征,一个Inception结构如下图所示。
在这里插入图片描述
分支结构的思想为后面的经典网络开创了先河。

6. ResNet(2015):深度网络的里程碑

在ResNet出现之前,大家普遍认为网络越深,性能应该越好(因为模型容量更大,能学习更复杂的特征)。但实验发现,当网络深度增加到一定程度(例如超过20层)时,会遇到两个问题:
梯度消失/爆炸(Vanishing/Exploding Gradients):这个问题通过归一化初始化(He Initialization) 和Batch Normalization(批归一化) 等技术已经得到了很大程度的缓解。
退化问题(Degradation Problem):这是ResNet解决的关键。即使梯度消失/爆炸问题被解决,更深层的网络在训练集和测试集上的表现反而变差了。这非常反直觉:一个56层的网络本应至少不差于一个20层的网络(比如,让新增的36层只是恒等映射,性能也应该一样好),但事实却是误差更高
这表明,深度网络难以学习到“恒等映射”(Identity Mapping)。让多余的层什么都不做,对于网络来说竟然是一个难以优化的目标。

6.1核心问题:网络加深导致的性能退化现象

深层网络有个梯度消失问题:模型变深时,其错误率反而会提升,该问题非过拟合引起,主要是因为梯度消失而导致参数难以学习和更新。
在这里插入图片描述

6.2残差学习:恒等映射shortcut connection

残差的思想就是将网络模型的单独并性结构转为分支结构,并分为主分支和捷径分支(shortcut),主分支保留原网络的运算结构,而捷径分支则是跳过网络层直接进行激活函数,之后直接与主分支经过卷积池化和激活函数运算之后的结果直接想加,这类思想我们叫做残差思想
在这里插入图片描述

6.3架构变体:ResNet-18/34/50/101/152的差异

在这里插入图片描述
上图就是Residual残差结构示意图左侧图在ResNet-18和ResNet-34中使用,则右侧图在ResNet-50、ResNet-101和ResNet-152中使用

6.4影响深远:为训练极深层网络提供解决方案

通过使用残差连接,使得更深的网络具有更低的错误率。
在这里插入图片描述
这为后续更深层网络实现了模型的不断深入,从而使得训练极深的神经网络成为可能,并深刻影响了后续的研究。


结语

从LeNet到ResNet的演进历程,展现了研究者们在网络深度、宽度、连接方式等方面的不断探索和创新。理解这些经典网络的设计思想,不仅有助于我们更好地应用现有模型,更能为设计新的网络架构提供灵感。

🔧 动手实践:文章将提供完整的代码实现,帮助读者亲手复现这些经典网络!您最感兴趣的是哪个经典网络架构?欢迎在评论区分享您的想法!

📌 下篇预告:《CNN实战:使用迁移学习解决真实世界图像分类问题》


网站公告

今日签到

点亮在社区的每一天
去签到