【深度学习基础篇05】从AlexNet到ResNet:经典卷积神经网络的演进

文章目录

  • 一、AlexNet:点燃深度学习复兴的"导火索"
    • [1. 激活函数:从Sigmoid到ReLU的革命](#1. 激活函数:从Sigmoid到ReLU的革命)
    • [2. 防止过拟合:Dropout的智慧](#2. 防止过拟合:Dropout的智慧)
    • [3. 池化层:重叠池化(Overlapping Pooling)](#3. 池化层:重叠池化(Overlapping Pooling))
    • [4. 归一化](#4. 归一化)
      • [4.1 Feature Normalization(特征归一化)](#4.1 Feature Normalization(特征归一化))
      • [4.2 Batch Normalization(批量归一化)](#4.2 Batch Normalization(批量归一化))
  • 二、VGGNet:极简主义的胜利
    • [1. 设计哲学:一切皆为3x3卷积](#1. 设计哲学:一切皆为3x3卷积)
    • [2. 感受野的几何级数增长](#2. 感受野的几何级数增长)
    • [3. VGG的网络结构](#3. VGG的网络结构)
  • 三、ResNet:解决"网络越深,性能越差"的残差革命
    • [1. 网络退化:为什么更深的网络反而更差?](#1. 网络退化:为什么更深的网络反而更差?)
    • [2. 核心创新:残差连接(Residual Connection)](#2. 核心创新:残差连接(Residual Connection))
      • [2.1 残差块的结构](#2.1 残差块的结构)
      • [2.2 为什么残差连接能解决退化问题?](#2.2 为什么残差连接能解决退化问题?)
    • [3. 关键技术:1×1卷积与瓶颈结构(Bottleneck)](#3. 关键技术:1×1卷积与瓶颈结构(Bottleneck))
      • [3.1 1×1卷积的作用:降维与升维](#3.1 1×1卷积的作用:降维与升维)
      • [3.2 瓶颈结构(Bottleneck)](#3.2 瓶颈结构(Bottleneck))
    • [4. 维度匹配:当输入与输出维度不一致时](#4. 维度匹配:当输入与输出维度不一致时)
      • [4.1 方案一:对短路连接 x x x 进行卷积变换](#4.1 方案一:对短路连接 x x x 进行卷积变换)
      • [4.2 方案二:对 x x x 进行池化和零填充(较少使用)](#4.2 方案二:对 x x x 进行池化和零填充(较少使用))
    • [5. ResNet的网络结构](#5. ResNet的网络结构)
  • 四、总结:从AlexNet到ResNet的演进
  • 五、彩蛋01:残差连接多角度理解
    • [1. 先看直观比喻:"抄近路"的智慧](#1. 先看直观比喻:“抄近路”的智慧)
    • [2. 数学视角:从"学习映射"到"学习差值"](#2. 数学视角:从“学习映射”到“学习差值”)
    • [3. 梯度视角:解决梯度消失的"高速公路"](#3. 梯度视角:解决梯度消失的“高速公路”)
    • [4. 结构示例:两种残差块](#4. 结构示例:两种残差块)
      • [① 基本残差块(Basic Block)------用于 ResNet-18/34](#① 基本残差块(Basic Block)——用于 ResNet-18/34)
      • [② 瓶颈残差块(Bottleneck Block)------用于 ResNet-50/101/152](#② 瓶颈残差块(Bottleneck Block)——用于 ResNet-50/101/152)
    • [5. 维度不匹配怎么办?](#5. 维度不匹配怎么办?)
    • 总结
  • 六、彩蛋02:参数量计算练习
    • 题目
    • 解析(可跳过直接看答案)
        • [1. 维度计算(逐阶段验证)](#1. 维度计算(逐阶段验证))
        • [2. 参数量计算(卷积层)(了解即可)](#2. 参数量计算(卷积层)(了解即可))
        • [3. 全连接层参数量(了解即可)](#3. 全连接层参数量(了解即可))
    • 答案速查

在掌握了卷积、池化、全连接等核心组件后,我们来学习两个里程碑式的经典网络:AlexNetVGGNet。它们不仅在图像分类任务上取得了突破性成绩,更奠定了现代卷积神经网络的设计范式。本文将从 AlexNet 的四大创新点入手,再过渡到 VGGNet 的极简设计哲学。


一、AlexNet:点燃深度学习复兴的"导火索"

2012年,AlexNet在ImageNet图像分类竞赛中以远超第二名的成绩夺冠,一举证明了深度卷积神经网络的强大能力,开启了深度学习的黄金时代。它的成功,离不开以下四大关键创新。

1. 激活函数:从Sigmoid到ReLU的革命

在AlexNet之前,Sigmoid是主流的激活函数,但它存在严重的梯度消失 问题,导致深层网络难以训练。AlexNet首次大规模使用了ReLU激活函数,带来了革命性的改变:

  • 缓解梯度消失:在正区间,ReLU的梯度恒为1,避免了Sigmoid在输入过大或过小时梯度趋近于0的问题。
  • 计算高效 :ReLU的计算仅需一个阈值判断 max(0, x),比Sigmoid的指数运算快得多。
  • 加速收敛:使用ReLU的网络收敛速度比使用Sigmoid快数倍。

2. 防止过拟合:Dropout的智慧

深度神经网络强大的拟合能力也使其容易"死记硬背"训练数据,导致在测试集上表现糟糕,即过拟合 。AlexNet引入了Dropout技术来解决这个问题:

  • 工作原理:在训练过程中,随机"丢弃"(将输出置为0)一部分隐藏层的神经元,迫使网络不能依赖于某些特定的神经元,从而学习到更鲁棒的特征。
  • 效果 :显著降低了模型的过拟合风险,提升了泛化能力。在AlexNet中,Dropout被应用在全连接层。

3. 池化层:重叠池化(Overlapping Pooling)

传统的池化操作(如2x2,步长2)不会产生重叠,而AlexNet使用了重叠池化 (如3x3,步长2):

  • 定义:池化核的尺寸大于步长,使得池化窗口之间产生重叠。
  • 优势
    • 减少了特征图的尺寸,同时保留了更多的细节信息。
    • 增强了模型的鲁棒性,对输入的微小变化不那么敏感。
    • 有助于减少过拟合。

4. 归一化

神经网络对输入数据的尺度非常敏感。如果不同特征的取值范围差异巨大,会导致训练困难、收敛缓慢。AlexNet引入了局部响应归一化(LRN, Local Response Normalization),虽然现在更多被Batch Norm取代,但其背后的归一化思想至关重要。

4.1 Feature Normalization(特征归一化)

这是对输入数据或特征进行的预处理,核心思想是让数据分布更"规矩"。

  • 公式 :对每个特征维度 i i i,计算其在整个数据集上的均值 m i m_i mi 和标准差 σ i \sigma_i σi,然后进行标准化:
    x ~ i r = x i r − m i σ i \widetilde{x}_i^r = \frac{x_i^r - m_i}{\sigma_i} x ir=σixir−mi
  • 效果:处理后,所有特征的均值为0,方差为1。这消除了不同特征尺度不一的影响,让梯度下降更平稳,模型收敛更快。

4.2 Batch Normalization(批量归一化)

在AlexNet之后,人们发现,即使对输入做了归一化,经过多层线性变换和激活后,数据分布又会变得混乱,这被称为"内部协变量偏移"(Internal Covariate Shift)。Batch Norm 应运而生:

  • 工作原理 :在每一层的激活函数之前,对该层的输出在一个Batch内进行归一化,然后再通过两个可学习的参数 γ \gamma γ 和 β \beta β 进行缩放和偏移,以保留网络的表达能力。
  • 核心优势
    • 极大地加速了网络的收敛速度。
    • 降低了模型对初始化和学习率的敏感度。
    • 起到了一定的正则化作用,减少了对Dropout的依赖。

二、VGGNet:极简主义的胜利

在AlexNet之后,涌现了大量改进的网络结构,而VGGNet (由牛津大学视觉几何组提出)以其极致简洁的设计脱颖而出,成为了卷积神经网络设计的"教科书"。

1. 设计哲学:一切皆为3x3卷积

VGGNet的核心创新在于它的极简主义

  • 统一卷积核 :所有的卷积层都使用 3x3 的卷积核,步长为1,填充为1。这使得卷积操作不会改变特征图的空间尺寸。
  • 统一池化 :所有的池化层都使用 2x2 的最大池化,步长为2。这使得特征图的尺寸每次池化都精确地减半。
  • 深度堆叠 :通过不断堆叠 3x3 卷积层来加深网络,而不是使用更大的卷积核。

2. 感受野的几何级数增长

VGGNet的设计巧妙地利用了感受野 的概念。

  • 感受野:指特征图上的一个像素,在原始输入图像上对应的区域大小。
  • 堆叠的威力 :两个连续的 3x3 卷积层,其等效的感受野是 5x5;三个连续的 3x3 卷积层,其等效的感受野是 7x7
  • 优势
    • 使用多个小卷积核堆叠,既达到了大卷积核的感受野,又减少了参数量。例如,3个3x3卷积的参数量( 3 × 3 2 = 27 3 \times 3^2 = 27 3×32=27)远少于1个7x7卷积的参数量( 7 2 = 49 7^2 = 49 72=49)。
    • 增加了网络的深度和非线性,提升了特征提取能力。

3. VGG的网络结构

VGGNet有多个版本(如VGG11, VGG16, VGG19),其中VGG16最为流行。其结构可以清晰地分为5个阶段:

  1. 阶段1 :2个 3x3 卷积(64通道)+ 1个 2x2 池化
  2. 阶段2 :2个 3x3 卷积(128通道)+ 1个 2x2 池化
  3. 阶段3 :3个 3x3 卷积(256通道)+ 1个 2x2 池化
  4. 阶段4 :3个 3x3 卷积(512通道)+ 1个 2x2 池化
  5. 阶段5 :3个 3x3 卷积(512通道)+ 1个 2x2 池化
  6. 全连接层:3个全连接层(4096, 4096, 1000)

这种高度规整的结构,使得VGGNet非常易于理解和复现,也为后续的网络设计提供了重要的参考。


三、ResNet:解决"网络越深,性能越差"的残差革命

在AlexNet和VGGNet证明了"网络越深,特征提取能力越强"之后,研究者们却遇到了一个反直觉的问题:当网络层数增加到一定程度后,训练误差和测试误差反而会上升 ,这就是"网络退化"(Degradation)问题。何凯明团队提出的ResNet(残差网络),通过引入残差连接(Residual Connection) ,一举解决了这一难题,让训练上百层甚至上千层的深度网络成为可能。

1. 网络退化:为什么更深的网络反而更差?

在ResNet之前,人们普遍认为"更深的网络应该有更强的表达能力",但实验结果却恰恰相反。如下图所示,在CIFAR-10数据集上,56层的"Plain Network"(无残差连接)的训练误差和测试误差,都明显高于20层的网络。

这说明,网络层数的增加,并不一定带来性能的提升,反而可能因为梯度消失/爆炸等问题,导致网络难以优化。

2. 核心创新:残差连接(Residual Connection)

ResNet的核心思想非常简洁:与其让堆叠的层直接学习一个复杂的映射 H ( x ) H(x) H(x),不如让它们学习残差映射 F ( x ) = H ( x ) − x F(x) = H(x) - x F(x)=H(x)−x,然后通过一个"短路"连接(Shortcut)将原始输入 x x x 直接加到输出上。

2.1 残差块的结构

一个基本的残差块可以表示为:
Out = F ( x ) + x \text{Out} = F(x) + x Out=F(x)+x

  • F ( x ) F(x) F(x):由两个(或更多)卷积层和激活函数组成的残差映射。
  • x x x:原始输入,通过短路连接直接加到残差映射的输出上。
  • 最后再经过一个ReLU激活函数。

2.2 为什么残差连接能解决退化问题?

如果我们假设在理想情况下,某几层网络是"多余"的,即最优映射 H ( x ) = x H(x) = x H(x)=x。在传统网络中,这需要这些层的权重全部学习为0,这在深层网络中非常困难;而在残差网络中,只需让残差映射 F ( x ) = 0 F(x) = 0 F(x)=0,就能轻松实现恒等映射 H ( x ) = x H(x) = x H(x)=x。这大大降低了网络优化的难度,让深层网络至少不会比浅层网络更差。

从梯度传播的角度看,残差连接提供了一条梯度可以直接无损传播的"高速公路",有效缓解了深层网络中的梯度消失问题,这与ReLU激活函数的作用异曲同工。

3. 关键技术:1×1卷积与瓶颈结构(Bottleneck)

为了在加深网络的同时控制参数量和计算量,ResNet引入了1×1卷积瓶颈结构

3.1 1×1卷积的作用:降维与升维

1×1卷积是一种特殊的卷积,它不改变特征图的空间尺寸,只改变通道数,主要作用是:

  • 降维:减少通道数,降低后续3×3卷积的计算量。
  • 升维:在瓶颈结构的末尾恢复通道数,保证特征表达能力。

3.2 瓶颈结构(Bottleneck)

对于ResNet-50及更深的版本,残差块采用了瓶颈结构,用三个连续的卷积层(1×1 → 3×3 → 1×1)替代了原来的两个3×3卷积:

以输入通道为256的特征图为例:

  1. 先用1×1卷积将通道数从256降到64。
  2. 再用3×3卷积在64个通道上提取特征。
  3. 最后用1×1卷积将通道数从64恢复到256。

参数对比

  • 直接使用两个3×3卷积:参数量为 256 × 256 × 3 × 3 × 2 = 1 , 179 , 648 256 \times 256 \times 3 \times 3 \times 2 = 1,179,648 256×256×3×3×2=1,179,648。
  • 使用瓶颈结构:参数量为 ( 256 × 64 × 1 × 1 ) + ( 64 × 64 × 3 × 3 ) + ( 64 × 256 × 1 × 1 ) = 69 , 632 (256 \times 64 \times 1 \times 1) + (64 \times 64 \times 3 \times 3) + (64 \times 256 \times 1 \times 1) = 69,632 (256×64×1×1)+(64×64×3×3)+(64×256×1×1)=69,632。

可以看到,瓶颈结构在保持感受野和表达能力的同时,参数量减少了约17倍,极大地提升了训练效率。

4. 维度匹配:当输入与输出维度不一致时

残差连接要求 F ( x ) F(x) F(x) 和 x x x 的维度(通道数和空间尺寸)必须完全一致才能相加。当需要通过步长为2的卷积来下采样时,维度就会不匹配,此时有两种解决方案:

4.1 方案一:对短路连接 x x x 进行卷积变换

在短路连接上使用一个1×1卷积,步长为2,来调整 x x x 的通道数和空间尺寸,使其与 F ( x ) F(x) F(x) 匹配。

例如,当输入为 64 × 56 × 56 64 \times 56 \times 56 64×56×56,需要输出为 128 × 28 × 28 128 \times 28 \times 28 128×28×28 时:

  • 残差路径 F ( x ) F(x) F(x):通过步长为2的卷积层,输出 128 × 28 × 28 128 \times 28 \times 28 128×28×28。
  • 短路路径 x x x:通过一个步长为2的1×1卷积,输出 128 × 28 × 28 128 \times 28 \times 28 128×28×28。
  • 两者维度一致,即可相加。

4.2 方案二:对 x x x 进行池化和零填充(较少使用)

也可以通过池化来下采样空间尺寸,并用零填充来增加通道数,但这种方式会丢失信息,因此在ResNet中主要采用方案一。

5. ResNet的网络结构

ResNet有多个版本(ResNet-18, 34, 50, 101, 152),它们的核心结构相似,只是残差块的堆叠次数不同。

以ResNet-50为例,其结构可以分为以下几个阶段:

  1. conv1 :一个7×7卷积(步长2)+ 3×3最大池化(步长2),将输入从 3 × 224 × 224 3 \times 224 \times 224 3×224×224 转换为 64 × 56 × 56 64 \times 56 \times 56 64×56×56。
  2. conv2_x :3个瓶颈残差块,输出 256 × 56 × 56 256 \times 56 \times 56 256×56×56。
  3. conv3_x :4个瓶颈残差块,输出 512 × 28 × 28 512 \times 28 \times 28 512×28×28。
  4. conv4_x :6个瓶颈残差块,输出 1024 × 14 × 14 1024 \times 14 \times 14 1024×14×14。
  5. conv5_x :3个瓶颈残差块,输出 2048 × 7 × 7 2048 \times 7 \times 7 2048×7×7。
  6. 分类头:全局平均池化 + 1000维全连接层 + Softmax。

四、总结:从AlexNet到ResNet的演进

  • AlexNet 证明了深度卷积神经网络的可行性,其ReLU、Dropout、归一化等创新至今仍是深度学习的基石。
  • VGGNet 则将这种可行性推向了极致,用极简的设计证明了"深度"和"规整性"的力量,其对感受野的深刻理解,影响了后续几乎所有的CNN架构。
  • ResNet 则解决了"网络越深,性能越差"的退化问题,通过残差连接让训练超深网络成为可能,重塑了深度学习的架构设计范式。

五、彩蛋01:残差连接多角度理解

残差连接(Residual Connection)是 ResNet 的核心创新,我们可以用通俗比喻 + 数学推导 + 梯度视角三层来理解,


1. 先看直观比喻:"抄近路"的智慧

想象你要从 A 地走到 B 地,中间要经过很多复杂的街道(对应多层卷积)。

  • 传统网络:必须走完所有街道,才能到达 B 地。如果街道太多(网络太深),你很容易迷路(梯度消失),甚至越走越远(网络退化)。
  • 残差网络 :在 A 和 B 之间修了一条"高速公路"(短路连接)。你可以选择:
    1. 走复杂街道(学习复杂映射 F ( x ) F(x) F(x));
    2. 或者直接走高速公路(直接传递输入 x x x);
    3. 也可以两者结合:先在街道上走一段,再上高速,最终到达 B 地( F ( x ) + x F(x) + x F(x)+x)。

这条"高速公路"就是残差连接,它让网络在加深的同时,至少不会比原来更差。


2. 数学视角:从"学习映射"到"学习差值"

在传统的卷积层中,我们希望堆叠的层学习一个复杂的映射:
H ( x ) = 一些卷积和激活 H(x) = \text{一些卷积和激活} H(x)=一些卷积和激活

这个映射 H ( x ) H(x) H(x) 可能非常复杂,很难学习。

ResNet 的思路是:与其直接学习 H ( x ) H(x) H(x),不如学习 H ( x ) H(x) H(x) 和 x x x 之间的差值(残差)

我们定义残差映射:
F ( x ) = H ( x ) − x F(x) = H(x) - x F(x)=H(x)−x

那么,最终的输出就变成了:
H ( x ) = F ( x ) + x H(x) = F(x) + x H(x)=F(x)+x

这就是残差连接的数学表达:输出 = 残差 + 原始输入

为什么这样更好?

假设在理想情况下,某几层网络是"多余"的,即最优的映射就是 H ( x ) = x H(x) = x H(x)=x(输入什么就输出什么)。

  • 传统网络 :要学习 H ( x ) = x H(x) = x H(x)=x,需要让所有卷积层的权重都精确地学习为 0,这在深层网络中几乎不可能。
  • 残差网络 :要学习 H ( x ) = x H(x) = x H(x)=x,只需要让残差映射 F ( x ) = 0 F(x) = 0 F(x)=0 即可。这意味着卷积层的权重可以全部初始化为 0,网络就能轻松实现恒等映射。

这大大降低了网络优化的难度,让深层网络至少不会比浅层网络更差。


3. 梯度视角:解决梯度消失的"高速公路"

深层网络训练困难的核心原因是梯度消失。在反向传播时,梯度需要从输出层逐层乘以前向传播的权重和激活函数的导数。如果这些值都小于 1,经过几十层的连乘后,梯度会变得无限小,导致前面的层几乎无法更新。

残差连接的出现,彻底改变了这一点。

我们来看残差块的输出:
y = F ( x ) + x y = F(x) + x y=F(x)+x

在反向传播时,损失 L L L 对输入 x x x 的梯度为:
∂ L ∂ x = ∂ L ∂ y ⋅ ∂ y ∂ x = ∂ L ∂ y ⋅ ( ∂ F ( x ) ∂ x + 1 ) \frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x} = \frac{\partial L}{\partial y} \cdot \left( \frac{\partial F(x)}{\partial x} + 1 \right) ∂x∂L=∂y∂L⋅∂x∂y=∂y∂L⋅(∂x∂F(x)+1)

这里的关键是那个 +1。它意味着:

  • 即使 ∂ F ( x ) ∂ x \frac{\partial F(x)}{\partial x} ∂x∂F(x) 这部分的梯度很小(趋近于 0),整个梯度 ∂ L ∂ x \frac{\partial L}{\partial x} ∂x∂L 也至少等于 ∂ L ∂ y \frac{\partial L}{\partial y} ∂y∂L,不会消失。
  • 梯度可以通过这条"+1"的高速公路,直接无损地传播到前面的层,让深层网络的训练变得和浅层网络一样容易。

这和 ReLU 激活函数的作用异曲同工,都是为了缓解梯度消失问题。


4. 结构示例:两种残差块

在 ResNet 中,主要有两种残差块结构:

① 基本残差块(Basic Block)------用于 ResNet-18/34

由两个 3×3 卷积层组成,短路连接是直接的恒等映射。
y = Conv(3×3) -> ReLU -> Conv(3×3) ⏟ F ( x ) + x y = \underbrace{\text{Conv(3×3) -> ReLU -> Conv(3×3)}}_{F(x)} + x y=F(x) Conv(3×3) -> ReLU -> Conv(3×3)+x

② 瓶颈残差块(Bottleneck Block)------用于 ResNet-50/101/152

为了减少参数量和计算量,使用了 1×1 卷积来降维和升维,形成"瓶颈"结构。
y = Conv(1×1) -> ReLU -> Conv(3×3) -> ReLU -> Conv(1×1) ⏟ F ( x ) + x y = \underbrace{\text{Conv(1×1) -> ReLU -> Conv(3×3) -> ReLU -> Conv(1×1)}}_{F(x)} + x y=F(x) Conv(1×1) -> ReLU -> Conv(3×3) -> ReLU -> Conv(1×1)+x


5. 维度不匹配怎么办?

残差连接要求 F ( x ) F(x) F(x) 和 x x x 的维度(通道数和空间尺寸)必须完全一致才能相加。当需要通过步长为 2 的卷积来下采样时,维度就会不匹配,此时我们需要在短路连接上也加一个卷积层来调整维度:

y = F ( x ) + W s x y = F(x) + W_s x y=F(x)+Wsx

  • W s W_s Ws 是一个 1×1 的卷积层,步长为 2,用来将 x x x 的维度调整到和 F ( x ) F(x) F(x) 一致。

总结

残差连接就是在网络层之间加了一条"短路",让输出等于"卷积学到的东西"加上"原始输入"。它的核心作用是:

  1. 让深层网络更容易优化,解决了网络退化问题;
  2. 提供了一条梯度传播的"高速公路",有效缓解了梯度消失。

六、彩蛋02:参数量计算练习

题目

请计算出图中各个步骤的维度变化

解析(可跳过直接看答案)

1. 维度计算(逐阶段验证)

输入: 3 × 224 × 224 3 \times 224 \times 224 3×224×224

阶段1(Conv2d 3→64, 64→64, Pool 2×2)

  • 卷积: K = 3 , S = 1 , P = 1 K=3, S=1, P=1 K=3,S=1,P=1,输出尺寸 O = 224 − 3 + 2 × 1 1 + 1 = 224 O = \frac{224-3+2 \times 1}{1}+1 = 224 O=1224−3+2×1+1=224
    → 输出: 64 × 224 × 224 64 \times 224 \times 224 64×224×224
  • 池化: K = 2 , S = 2 K=2, S=2 K=2,S=2,输出尺寸 O = 224 2 = 112 O = \frac{224}{2} = 112 O=2224=112
    → 输出: 64 × 112 × 112 64 \times 112 \times 112 64×112×112

阶段2(Conv2d 64→128, 128→128, Pool 2×2)

  • 卷积: O = 112 − 3 + 2 × 1 1 + 1 = 112 O = \frac{112-3+2 \times 1}{1}+1 = 112 O=1112−3+2×1+1=112
    → 输出: 128 × 112 × 112 128 \times 112 \times 112 128×112×112
  • 池化: O = 112 2 = 56 O = \frac{112}{2} = 56 O=2112=56
    → 输出: 128 × 56 × 56 128 \times 56 \times 56 128×56×56

阶段3(Conv2d 128→256, 256→256, Pool 2×2)

  • 卷积: O = 56 − 3 + 2 × 1 1 + 1 = 56 O = \frac{56-3+2 \times 1}{1}+1 = 56 O=156−3+2×1+1=56
    → 输出: 256 × 56 × 56 256 \times 56 \times 56 256×56×56
  • 池化: O = 56 2 = 28 O = \frac{56}{2} = 28 O=256=28
    → 输出: 256 × 28 × 28 256 \times 28 \times 28 256×28×28

阶段4(Conv2d 256→512, 512→512, Pool 2×2)

  • 卷积: O = 28 − 3 + 2 × 1 1 + 1 = 28 O = \frac{28-3+2 \times 1}{1}+1 = 28 O=128−3+2×1+1=28
    → 输出: 512 × 28 × 28 512 \times 28 \times 28 512×28×28
  • 池化: O = 28 2 = 14 O = \frac{28}{2} = 14 O=228=14
    → 输出: 512 × 14 × 14 512 \times 14 \times 14 512×14×14

阶段5(Conv2d 512→512, 512→512, Pool 2×2)

  • 卷积: O = 14 − 3 + 2 × 1 1 + 1 = 14 O = \frac{14-3+2 \times 1}{1}+1 = 14 O=114−3+2×1+1=14
    → 输出: 512 × 14 × 14 512 \times 14 \times 14 512×14×14
  • 池化: O = 14 2 = 7 O = \frac{14}{2} = 7 O=214=7
    → 输出: 512 × 7 × 7 512 \times 7 \times 7 512×7×7

AdaPool(7)

  • 自适应池化输出尺寸固定为 7 × 7 7 \times 7 7×7
    → 输出: 512 × 7 × 7 512 \times 7 \times 7 512×7×7
  • 展平: 512 × 7 × 7 = 25088 512 \times 7 \times 7 = 25088 512×7×7=25088,与图中 Linear(25088, 4096) 一致

2. 参数量计算(卷积层)(了解即可)

卷积层参数量公式:
Params = ( 输入通道数 × K × K + 1 ) × 输出通道数 \text{Params} = (\text{输入通道数} \times K \times K + 1) \times \text{输出通道数} Params=(输入通道数×K×K+1)×输出通道数

( + 1 +1 +1 为偏置项,若 bias=False 则不加)

输入C 输出C K×K 参数量计算 参数量
Conv1 3 64 3×3 ( 3 × 3 × 3 + 1 ) × 64 (3 \times 3 \times 3 + 1) \times 64 (3×3×3+1)×64 1792
Conv2 64 64 3×3 ( 64 × 3 × 3 + 1 ) × 64 (64 \times 3 \times 3 + 1) \times 64 (64×3×3+1)×64 36928
Conv3 64 128 3×3 ( 64 × 3 × 3 + 1 ) × 128 (64 \times 3 \times 3 + 1) \times 128 (64×3×3+1)×128 73856
Conv4 128 128 3×3 ( 128 × 3 × 3 + 1 ) × 128 (128 \times 3 \times 3 + 1) \times 128 (128×3×3+1)×128 147584
Conv5 128 256 3×3 ( 128 × 3 × 3 + 1 ) × 256 (128 \times 3 \times 3 + 1) \times 256 (128×3×3+1)×256 295168
Conv6 256 256 3×3 ( 256 × 3 × 3 + 1 ) × 256 (256 \times 3 \times 3 + 1) \times 256 (256×3×3+1)×256 590080
Conv7 256 512 3×3 ( 256 × 3 × 3 + 1 ) × 512 (256 \times 3 \times 3 + 1) \times 512 (256×3×3+1)×512 1180160
Conv8 512 512 3×3 ( 512 × 3 × 3 + 1 ) × 512 (512 \times 3 \times 3 + 1) \times 512 (512×3×3+1)×512 2359808
Conv9 512 512 3×3 ( 512 × 3 × 3 + 1 ) × 512 (512 \times 3 \times 3 + 1) \times 512 (512×3×3+1)×512 2359808
Conv10 512 512 3×3 ( 512 × 3 × 3 + 1 ) × 512 (512 \times 3 \times 3 + 1) \times 512 (512×3×3+1)×512 2359808

卷积层总参数量
1792 + 36928 + 73856 + 147584 + 295168 + 590080 + 1180160 + 2359808 + 2359808 + 2359808 = 9404992 1792 + 36928 + 73856 + 147584 + 295168 + 590080 + 1180160 + 2359808 + 2359808 + 2359808 = 9404992 1792+36928+73856+147584+295168+590080+1180160+2359808+2359808+2359808=9404992


3. 全连接层参数量(了解即可)

全连接层参数量公式:
Params = ( 输入维度 + 1 ) × 输出维度 \text{Params} = (\text{输入维度} + 1) \times \text{输出维度} Params=(输入维度+1)×输出维度

输入维度 输出维度 参数量计算 参数量
FC1 25088 4096 ( 25088 + 1 ) × 4096 (25088 + 1) \times 4096 (25088+1)×4096 102764544
FC2 4096 4096 ( 4096 + 1 ) × 4096 (4096 + 1) \times 4096 (4096+1)×4096 16781312
FC3 4096 1000 ( 4096 + 1 ) × 1000 (4096 + 1) \times 1000 (4096+1)×1000 4097000

全连接层总参数量
102764544 + 16781312 + 4097000 = 123642856 102764544 + 16781312 + 4097000 = 123642856 102764544+16781312+4097000=123642856

答案速查

会做到这一步就可以了!

相关推荐
一只理智恩1 小时前
基于 CesiumJS + React + Go 实现三维无人机编队实时巡航可视化系统
前端·人工智能·算法·golang·无人机
DeepModel2 小时前
【回归算法】梯度提升回归(GBDT)超详细讲解
人工智能·数据挖掘·回归
storyseek2 小时前
使用迁移学习来训练VGG模型
深度学习·机器学习·迁移学习
星爷AG I2 小时前
12-10 社会分类(AGI基础理论)
人工智能·agi
LaughingZhu2 小时前
Product Hunt 每日热榜 | 2026-02-23
人工智能·经验分享·深度学习·神经网络·产品运营
Monday学长2 小时前
2026 学术写作 AI 工具测评:6 款主流工具深度对比
人工智能
qq_404418952 小时前
nlp基础概念
人工智能·自然语言处理
love530love2 小时前
Windows 多 Git 环境冲突:一个环境变量优先级引发的血案
人工智能·windows·git·环境变量·scoop
菜鸟小芯2 小时前
【GLM-5 陪练式创意 UI 实战】第一篇:创意魔法盒 —— 用 AI 生成 “开心” 主题 Flutter UI,搞定深浅色与响应式
人工智能·flutter·ui