zehua

Zehua

卷积神经网络

2024-12-20

简介

卷积神经网络发展历程

  1. 早期探索(1980年代)

在1980年代初,提出了带有卷积层和池化层结构雏形的神经网络,但由于当时计算能力有限,网络较难在大规模数据上取得突破性成果。

  1. LeNet 的出现(1990年代末)

1998年,Yann LeCun 提出了 LeNet 系列(以 LeNet-5 为代表),确定了现代 CNN 的基本框架:输入层、卷积层、池化层、全连接层以及输出层等结构,并在激活函数上开始从传统的 Sigmoid、Tanh、ReLU, 使得网络训练的效率和性能得以提升。但是当时的计算能力依旧有限,限制了CNN的应用。

  1. 深度学习时代与 AlexNet(2012年)

2012年,Hinton 团队在 ImageNet 大规模视觉识别竞赛中使用 AlexNet 取得重大突破,准确率远超传统机器学习方法。AlexNet 的成功标志着 CNN 在图像识别领域的全面崛起,也催生了后续的一系列改进结构(VGG、GoogLeNet、ResNet 等),推动计算机视觉和深度学习技术发展。

CNN 出现前的图像处理难题

数据量庞大

图像中的像素数据往往维度极高,例如一张1000\times1000 的彩色图片包含1000 \times 1000 \times 3 = 3\,000\,000 个像素值,导致计算和存储的成本都非常高。

特征提取困难

图像数字化后需要复杂的人工特征提取,且效果常常不理想。

CNN 的核心思想:降维与特征抽取

降维(参数减少)

卷积操作中,通过共享参数的卷积核在局部范围内学习特征,不需要对每个像素都设置参数。池化层(最大池化或平均池化等)则继续减少数据的尺寸,从而降低计算量,缓解过拟合。

特征提取与表示学习

卷积层能够自动学习局部特征,逐层堆叠卷积后能从低级特征(边缘、纹理)逐渐提取到高级特征(物体整体轮廓等)。最后通过全连接层整合这些特征,输出分类或回归结果。

 

卷积神经网络详述

卷积神经网络(Convolutional Neural Network, CNN)在本质上与传统的全连接神经网络(Fully Connected Network, FCN)有很多相似之处,但又针对图像这样具有空间结构的数据进行了专门设计和改进。在图像分类、检索、目标检测、语义分割等各类视觉任务中,CNN 普遍取得高精度甚至超过 95% 的准确率。由于深度学习模型能适应大规模数据,CNN 被广泛应用于工业界和学术界,并在计算机视觉领域占主流地位。

常规全连接神经网络的问题

在传统的全连接网络中,二维图像会被直接展平(Flatten)成一个一维向量。例如,一张32×32×3的图像有 32×32×3 = 3072个像素值,这3072个值会被直接拉伸成一列,然后输入到网络的全连接层中。

  • 问题1:参数量巨大

    假设第一层要将3072维的输入映射到100个神经元,那么光这一层就有 3072×100 = 307,200个权重参数(不包括偏置)。更深层的网络参数量会进一步指数级增长,导致训练困难、容易过拟合。

  • 问题2:忽略了输入数据的空间结构

    图像本身是有空间结构的(相邻像素之间存在相关性),但全连接层不考虑这种二维的图像结构,它只是把像素当作一个个独立的输入特征进行处理。

CNN对问题的改进

CNN引入卷积层(Convolutional Layer)和池化层(Pooling Layer),他们不仅可以有效的减少训练参数,还可以高效的提取特征。CNN在输入层并不展平图像,而是直接使用宽×高×通道数的三维形式输入。以一张32×32×3的图片为例,我们将其看作深度为3(对应R、G、B通道),大小为32×32的图像立方体输入网络。这有效的保持了图像的二维空间结构。

 

CNN 与常规神经网络的相同点

  • 基本单元都是神经元

    无论是CNN还是传统神经网络,都由大量神经元组成。每个神经元都有可学习的参数(权重和偏置)。在前向传播时,每个神经元都会对输入数据(上一层的输出)进行加权求和,并通过激活函数(如ReLU、Sigmoid或Tanh)来输出非线性结果。

  • 输出为可导的评分函数

    整个网络可以看作一个从输入到输出的可微分函数。以图像分类为例,输入是原始像素数据(如32×32×3的彩色图像),输出是对各个类别的分数(如[ 猫 的分数, 狗 的分数, ...])。我们根据这些分数定义损失函数(例如Softmax交叉熵损失),然后通过反向传播(Backpropagation)来调整网络的权重,使得最终的预测更准确。

  • 训练方式类似

    CNN与传统神经网络的训练流程是相同的:前向传播计算输出和损失→反向传播计算梯度→更新参数。这一过程不断重复,直到网络性能收敛到一个较好的水平。

 

CNN 等效为 BP 网络

从原理上,CNN 的卷积、池化、激活函数等都可以看作前向传播中的 可微分算子 ,在反向传播中通过对应的微分或梯度公式来更新参数或把梯度传回前一层:

  • 池化层:对最大池化,要找到池化窗口中对应的 最大值 位置并将梯度传回;对平均池化,则将梯度均匀分配给池化区域内的各像素。

  • 卷积层:对每个卷积核逐一计算梯度,再进行更新。

  • 全连接层:类似传统 MLP,计算加和并更新权重偏置。

因此,整个 CNN 可以视为一个多层神经网络,只是中间若干层是 卷积 + 池化 的结构。

 

CNN的典型结构简介

卷积层

提取局部空间特征。每层卷积会生成一组特征图,描述输入图像在该层特征空间下的响应。

非线性激活层

ReLU等激活函数一般放在卷积运算之后,这样就可以为卷积滤波器的线性计算加入非线性(如ReLU:f(x)=max(0,x)),从而使网络可以拟合更复杂的函数。

池化层

对特征图进行降采样(如最大池化),减少数据尺寸,从而降低计算量和参数量,并对特征具有一定的空间不变性。

全连接层

在网络的后面,有时会接上若干全连接层,用来综合卷积层学到的高层特征,最终输出分类结果或进行其它预测。

卷积层和全连接层是有参数的(其权重可学习),池化层和激活函数层(如ReLU)没有可学习参数,它们的操作是固定的函数变换。卷积层和池化层通常按序多次重复(卷积→激活→池化→...)以逐步提取更高级的特征。网络通过梯度下降和反向传播对卷积层和全连接层的参数进行迭代更新,以最小化损失函数。

在这种层级堆叠中,前几层的卷积核通常学到一些简单特征(如边缘、线条方向),中间层的卷积核能识别更复杂的局部特征(如局部纹理、形状片段),最后的高层卷积核能对复杂的物体部件进行识别,最终通过全连接层整合信息做出决策。

卷积网络各层详细介绍

卷积层

卷积层是卷积神经网络的核心层,卷积层的参数是由一组可学习的卷积核构成的。每个卷积核有一定的宽度和高度(通常较小,如 3×3、5×5),但其深度(depth)与输入数据的深度保持一致。当卷积核移动时,每次计算都会形成一个特征映射,它记录了输入图像各个位置的相应强度,可以侧面反应其特征值。卷积层的卷积核参数(权重和偏置)是在训练过程中通过反向传播算法自动学习得到的。

在卷积层中,每个神经元并不是和输入的所有像素连接,而只是和输入图像的一个小区域相连,这个小区域称为感受野(receptive field)。这种设计有两个好处:

  1. 更少的参数:不必像全连接那样与所有输入连接,从而减少参数量。

  2. 空间特征的局部学习:通过观察局部区域,卷积核学会从小局部特征开始(例如边缘)进行识别,而多层卷积的叠加会让后面的层逐渐看到更大范围(更大感受野)并学习到更加复杂和抽象的特征。

在同一卷积层中,对于某个特定的卷积核,无论它在输入图像什么位置执行卷积操作,这个卷积核的参数都是相同的。这称为权重共享。这样做的目的是在整个图像中搜索相同类型的特征,并大大减少参数数量。如果没有权重共享,每个位置都需要一套参数,参数量将指数增长。

 

二维卷积

卷积操作是在输入图像上滑动一个的滤波器 比如5×5×3,每移动到一个位置,滤波器就与对应的5×5×3区域进行点积运算和加偏置,得到一个标量值,然后将该标量作为该位置的输出。给定输入图像I(大小可视为H \times W)和卷积核K(大小可视为M \times N),通过二维卷积可以得到输出特征图S。二维卷积在数学定义中包含翻转操作,其公式为:

S(i, j) = \sum_{m} \sum_{n} I(i - m,\, j - n) \cdot K(m, n)
  • I(i, j):表示输入图像在坐标(i, j) 处的像素值

  • K(m, n):表示卷积核在坐标(m, n) 处的参数(又称权值或滤波器系数)

  • S(i, j):表示输出特征图在坐标(i, j) 处的像素值

在具体操作中,卷积核K 会被上下、左右翻转,再与输入图像相应区域逐元素相乘,并把这些乘积加起来得到输出像素值S(i, j)

翻转操作与互相关

在实际深度学习实现中,常使用 互相关(Cross-Correlation) 来代替卷积。互相关的公式与卷积几乎相同,只是省略了对K 的翻转:

S(i, j) = \sum_{m} \sum_{n} I(i + m,\, j + n) \cdot K(m, n)

尽管二者存在翻转差异,但由于卷积核的参数是可学习的,因此结果上是一样的。

 

卷积步长(Stride)

在进行二维卷积时,卷积核会在输入图像上滑动,每次滑动的距离称为步长(stride)

  1. 当 stride = 1 时,卷积核在输入上逐像素滑动,输出的尺寸相对较大。

  2. 当 stride > 1 时,卷积核滑动时会 跳步 ,跳过一些像素,因而输出特征图的尺寸会变小。

若输入的高、宽分别是H, W,卷积核的高、宽是K_h, K_w,且不考虑任何填充(padding = 0),则输出特征图的高、宽可用下式计算:

\text{output\_height} = \left\lfloor \frac{H - K_h}{stride} \right\rfloor + 1
\text{output\_width} = \left\lfloor \frac{W - K_w}{stride} \right\rfloor + 1

 

卷积深度

卷积深度(也称输出通道数)指该层中卷积核(滤波器)的数量。以二维卷积为例,若该卷积层有N 个卷积核,每个卷积核对输入通道全部进行卷积,然后分别输出一张特征图,最终堆叠得到N 通道深度的输出。

  • 若输入有C_{in} 个通道,则每个卷积核在每个输入通道都有一套K_h \times K_w 的参数

  • 最终同一卷积核会将所有通道的卷积结果相加,得到单通道输出

  • 当卷积核个数为N 时,输出通道数即为N,从而形成深度为N 的输出特征图。

卷积核数量越多,模型具有更强的特征表达能力,但计算量和参数量也更大。

  • 浅层卷积:应用于低级视觉特征,如边缘、拐角、纹理等。

  • 深层卷积:融合更高层语义(如 轮廓 、 物体整体 等),特征更抽象。

卷积核尺寸

实践中,主流卷积核大小多为奇数,如1 \times 1,3 \times 3,5 \times 5,7 \times 7

因为如果卷积核为k \times kk 为奇数),则在 Same 模式下只需在输入图像边缘补(k - 1)/2 层像素,即可使输出图像的尺寸与输入图像相同。并且奇数情况下更容易找到卷积核中心(\tfrac{k}{2}, \tfrac{k}{2})

不同卷积核尺寸:

  • 1 \times 1 卷积

    常用于快速调整通道数(升维或降维),或实现特征融合。 计算量小,常见于轻量化结构。

  • 3 \times 3 卷积

    现代 CNN 中最经典的配置,可在较少参数量的同时捕捉局部特征。如 VGG 网络使用3 \times 3 卷积。

  • 5 \times 57 \times 7 卷积

    感受野更大,一次卷积可覆盖更宽的区域。但是参数量更高,计算代价更大,通常只在网络层数较浅的时候使用。

 

转置卷积

在使用转置卷积(Transposed Convolution)时,会在输入特征图的像素之间插入额外的 空值,再进行常规卷积,最终达到放大特征图的效果。

  • 普通卷积:随着卷积的堆叠或卷积核的滑动,通常会让输出更小或相等大小(若加足够的填充)。

  • 转置卷积:通过在像素间插值 + 卷积,可在生成模型或上采样操作中让输出尺寸更大。

 

数据填充(Padding)

在图像周边添加额外的像素层数,最常见方式是零填充(Zero Padding),即在图像四周补零。若原始图像为n \times n,卷积核大小为m \times m,当在四周各补p 层像素后,填充后图像的大小会变为(n + 2p) \times (n + 2p)

  • 零填充(Zero Padding):把边缘补充的像素值设为 0。

  • 复制填充(Replicate Padding):把边缘像素进行复制到填充区域。

  • 反射填充(Reflection Padding):将边缘附近的像素镜像翻转后再填充。

假设输入数据尺寸为W×H,卷积核为F×F,步长为S,零填充为P,输出特征图的 宽高 可以用下面的公式来计算

  • 输出宽度

W_{out} = \frac{W - F + 2P}{S} + 1
  • 输出高度

H_{out} = \frac{H - F + 2P}{S} + 1

 

激活函数

ReLU

f(x) = \begin{cases} 0, & x < 0 \\ x, & x \ge 0 \end{cases}

优点

  • 计算简单,仅分段线性

  • x > 0 时,梯度为常数 1,不易出现梯度消失。

缺点

  • 负轴直接变 0,可能 屏蔽 负特征

  • 若某神经元长期输出演化为负值,其梯度会变成 0,不再更新(即 神经元死亡 现象)。

Parametric ReLU

为缓解 ReLU 在负轴的死区问题,人们引入一个可学习或事先固定的小斜率\alpha

f(x) = \begin{cases} \alpha x, & x < 0 \\ x, & x \ge 0 \end{cases}
  • \alpha = 0.01(或其他固定小值)时,称 Leaky ReLU

  • \alpha 可学习时,称 PReLU;当\alpha 随机取值时,称 RReLU。

  • 变体在负轴也保留了部分梯度,减少了神经元死亡现象,但引入了额外的参数或随机性。

ELU

在负轴上采用指数衰减:

f(x) = \begin{cases} \alpha(e^x - 1), & x < 0 \\ x, & x \ge 0 \end{cases}
  • 能在负值区保留一定梯度并带来平滑性,相比 ReLU,计算复杂度略高,训练速度可能偏慢。

Sigmoid:

\sigma(x) = \frac{1}{1 + e^{-x}}
  • 将输出映射到(0, 1),但大正/负值时梯度近 0,易出现梯度消失。

Tanh:

\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
  • 输出范围(-1, 1);相对 Sigmoid,更 居中 ;仍有梯度消失风险。

Maxout:

f(x) = \max(w_1^T x + b_1,\; w_2^T x + b_2)
  • 通过多条线性函数的最大值做激活,能拟合多种形状,但增加参数量。

  

感受野(Receptive Field)

在卷积神经网络中,感受野指网络某一层(或某个神经元)的输出特征图上一个像素在输入图像上对应的区域大小。随着网络深度加深,每个输出像素对输入图像的 覆盖面积 会越来越大。

在推算感受野大小时,常用到如下递推公式:

RF_i = (RF_{i+1} - 1) \times s_i + K_i

其中:

  • RF_i:第i 层输出像素的感受野大小

  • RF_{i+1}:第i+1 层输出像素的感受野大小

  • s_i:第i 层(或池化层)的步长

  • K_i:第i 层的卷积核或池化核的大小

通过该公式可以逐层向前回溯,假如已经知道某一层的感受野,就能得到上一层的感受野是多少。

池化层

连续的卷积层之间会周期性地插入一个池化层。它的作用是 降低数据维度,因为这样可以减少网络中参数的数量 。常见的池化操作方式有:

  • 最大池化(Max Pooling):在一个小窗口(如 2×2)的区域内取最大值作为输出。

  • 平均池化(Average Pooling):在池化窗口内取平均值。

  • L2 范式池化(L2 Pooling):在池化窗口内计算元素的 L2 范数

通过最大池化,相当于只保留每个小块区域内最突出的特征值,忽略不重要的小变动。这样就能让后面的卷积层关注更高层次的结构,并提高模型的泛化能力。此外,在实际实现中,当经过池化层前向传播时,记录下最大值所在的位置,在反向传播时就只对这个最大值位置传递梯度。不过很多人认为可以用较大的步长卷积或其他结构代替池化层,甚至可以不用池化层。

 

归一化层

在早期的 CNN 架构中,有归一化层(如 Local Response Normalization, LRN)。但随着批归一化(Batch Normalization)等更简单有效的方法出现,归一化层已经不流行不用了。

 

全连接层

在卷积神经网络中,经过一系列卷积层、激活函数和池化层后,得到的输出通常是多通道的二维特征图。为了进行最终的分类或回归,需要将这些特征图展平并输入到全连接层(Fully Connected Layer,FC)。

展平

当卷积/池化后输出的特征图大小为C \times H \times W,可将其逐通道、逐像素地展开成一个长度为C \cdot H \cdot W 的向量。这样做能够把二维或多维特征映射到一维输入,方便和传统多层感知机 (MLP) 相连接。

计算方式

全连接层的每一个输出神经元,都与输入向量的每一个元素相连,并配有相应的权重w 和偏置b。可用以下线性公式表示(不含激活):

y_i = \sum_{m=1}^{M} w_{im} \, x_m + b_i

其中x_m 表示展平后向量的第m 个分量, M = C \cdot H \cdot Wy_i 则是第i 个输出神经元的线性结果。再加上激活函数(如 ReLU、Sigmoid、Tanh 等)后,就形成了完整的 FC 层输出。

输出层

多分类问题

若要进行多分类(假设分类数为n),输出层常使用 Softmax 函数,将线性输出z_i 转化为概率分布y_i

y_i = \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}}
  • 其中z_i 是全连接层的线性输出(称 logits ), y_i 则是模型对第i 类的预测概率。

回归(线性激活)

若要预测连续数值,输出层可采用线性形式:

y_i = \sum_{m=1}^{M} w_{im} \, x_m + b_i

 

CNN 的训练

网络训练的基本步骤

与传统的 BP 神经网络类似,CNN 的训练一般使用随机梯度下降(SGD)或其变体(如 Adam、RMSProp 等)来最小化损失函数。典型的训练流程如下:

  1. 初始化

    • 用随机数初始化所有卷积核及全连接层的权重、偏置等参数。

  2. 前向传播 (Forward Pass)

    • 将训练样本(图像)输入网络,依次经过卷积层、激活函数(如 ReLU)、池化层及全连接层,得到输出(例如分类概率或回归预测值)。

  3. 损失函数计算

    • 对多分类任务,经常使用交叉熵(Cross-Entropy)作为损失函数;对回归任务,常使用均方误差(MSE)或其他形式。

    • L 表示损失值,可能是单个 batch 的平均损失或所有训练样本的总损失。

  4. 反向传播 (Backward Pass) + 参数更新

    • 通过链式法则计算\frac{\partial L}{\partial w_{ij}} 等梯度,并将梯度反向传回每一层,包括卷积核参数、全连接层的权重偏置等。

    • 使用 SGD(或 Adam 等优化器)更新参数,使损失L 不断下降。

在训练过程中,卷积核的个数、大小、步长等超参数一般是先行设定的,不在训练中进行更新;更新的仅是卷积核核内部的权重参数。

 

典型CNN网络架构

LeNet-5

1998 年,Yann LeCun 等人提出 LeNet-5,用于手写数字识别(MNIST 数据集)。作为最早的 CNN 原型之一,它包含了卷积、池化、全连接等核心组件,是后续深入研究 CNN 架构的里程碑。

网络结构

假设输入图像大小为32 \times 32

输入层

  • 32 \times 32 = 1024 像素。

C1 卷积层

  • 6 个卷积核,每个核大小5 \times 5

  • 输出特征图尺寸为28 \times 28(因为32 - 5 + 1 = 28

  • 6 \times 28 \times 28 = 4704 个神经元。

S2 池化层(下采样)

  • 对每张28 \times 28 特征图做平均池化(核大小2 \times 2,步长 2)

  • 输出为614 \times 14 特征图。

C3 卷积层

  • 165 \times 5 卷积核,从614 \times 14 输入特征图提取信息

  • 输出1610 \times 10 特征图。

S4 池化层(下采样)

  • 10 \times 10 特征图做2 \times 2 池化

  • 输出165 \times 5 特征图(共16 \times 5 \times 5 = 400 神经元)。

C5 卷积层

  • 核大小5 \times 5,实际上在5 \times 5 的特征图上相当于全连接,输出120 个特征(神经元)。

F6 全连接层

  • 84 个神经元。

Output 层

  • 10 个输出节点,对应数字0 \sim 9

  • 原论文中使用了 RBF 连接形式,也可用更通用的全连接 + Softmax 来做分类。

AlexNet

2012 年,Alex Krizhevsky 等人在 ImageNet 大规模视觉识别竞赛上取得重大突破,将错误率从约 26% 大幅降至 15%。其成功被视为深度学习在计算机视觉领域的起飞标志 ,是重要的里程碑。后续网络(如 VGG、GoogLeNet、ResNet 等)都在此基础上不断改进与拓展。

核心思想与创新点

加深网络层数,使用更大卷积核

  • 相比之前较浅的网络,AlexNet 在深度和宽度上都有提升

  • 首层卷积核为11 \times 11,在当时较为 激进 ,可一次性捕捉更大范围特征。

使用 ReLU 激活函数

  • 相比传统的 Sigmoid 或 Tanh,ReLU 不易出现梯度饱和,能缓解梯度消失问题;

  • 在正区间保持梯度为常数,有助于更深、更大网络的高效训练。

重叠池化

  • 采用3 \times 3 的池化核,但步长仅为 2,导致池化窗口彼此重叠

  • 在降采样过程中尽可能保留更多空间细节,减少特征丢失。

Dropout 正则化

  • 在全连接层对部分神经元随机失活(如以 0.5 的概率 丢弃 ),降低对特定节点的过度依赖

  • 有效防止网络过拟合,提升泛化能力。

多 GPU 训练

  • 将模型卷积层并行分配到两块 GPU 来进行训练。

  • 深度学习历史上的第一次,事实上AlexNet 6000万参数量的规模远超当时的计算能力,计算量大约是之前网络的几十倍,因此使用 GPU 加速成为 AlexNet 的核心创新之一,也因此,后续的深度学习促进了 NVIDIA 显卡的发展。

网络结构概览

以下以输入大小约224 \times 224 \times 3(或227 \times 227 \times 3 的变体)为例,AlexNet 包含 5 层卷积 + 3 层全连接。网络总参数约 6000 万。

  1. 输入层

    输入一张彩色图像,通常为224 \times 224 \times 3

  2. 卷积层

    Conv1:

    • 卷积核大小11 \times 11, 步长 4, 通道数 96

    • 输出特征图约55 \times 55 \times 96

    • 后接 ReLU 激活和3 \times 3, stride= 2 的最大池化,降至约27 \times 27 \times 96

    Conv2:

    • 卷积核大小5 \times 5, 步长 1, 通道数 256(常配合合适的 padding)

    • 输出约27 \times 27 \times 256

    • 后接 ReLU 和最大池化(3 \times 3, stride=2 ),降至13 \times 13 \times 256

    Conv3, Conv4, Conv5:

    • 全部使用3 \times 3 小卷积核,步长 1

    • 卷积核数量分别约 384、384、256

    • 每次卷积后接 ReLU

    • 最后一层卷积 Conv5 后接最大池化,输出变为6 \times 6 \times 256

  3. 池化层

    在上面每个阶段的卷积之后,都接一个3 \times 3 的最大池化核,步长 2 (池化窗口的滑动距离(步长)小于窗口大小),这种重叠池化可以在特征降采样时保留更多空间信息。通过重叠池化,模型的top-1和top-5错误率分别减少约0.4%和0.3%。

  4. 全连接层

    • 将卷积与池化后的特征图展平 成一维向量(例如6 \times 6 \times 256 = 9216 维)

    • 依次连接两个隐藏全连接层(FC6, FC7),各含 4096 个神经元,后接 ReLU

    • 第三层全连接 (FC8) 输出 1000 维(对 ImageNet 的 1000 个类别进行分类),再通过 Softmax 将其变为概率分布。

    • 在 FC6 和 FC7 使用 Dropout,以 0.5 的比例随机关闭神经元,缓解过拟合。

VGG

VGG 模型是由牛津大学视觉几何组(Visual Geometry Group, VGG)提出的深度学习网络,主要用于图像分类任务。它可以在输入图像中自动提取有用的特征,从而识别、分类或进行其他视觉相关任务。早期的经典版本包括 VGG-16 与 VGG-19。

核心思想与创新点

用小卷积核替代大卷积核

  • 大卷积核(如5 \times 5

    一次能够捕捉更大范围的图像特征,但是参数量和计算量都比较大。

  • 小卷积核(如3 \times 3

    • 两个3 \times 3 叠加,相当于覆盖5 \times 5 的感受野。

    • 三个3 \times 3 叠加,相当于覆盖7 \times 7 的感受野。

因此,VGG 的关键点之一就是使用多个小卷积核堆叠来代替一个大卷积核,相对较小的卷积核可以明显减少参数量,同时叠加多个卷积层后能获得较大的感受野。

加深网络深度

在所有卷积层都采用3 \times 3 小卷积核的前提下,为了拥有更强的特征提取能力,VGG 通过加深网络层数的方式来提升模型性能:

  • 更深的网络意味着更多层次的特征(从边缘、线条到更复杂的局部结构、整体轮廓)。

  • 小卷积核堆叠后,网络虽然层数增多,但单层所需参数较少,因此整体参数规模虽大却仍可在一定硬件条件下进行训练。

VGG-16 有 16 个带有可学习参数的层(卷积层 + 全连接层),VGG-19 则达到了 19 层。 实验证明,更深的网络能在大数据集(如 ImageNet)上取得更高的准确率。

优点

尽管单个3 \times 3 卷积核的参数量相比大卷积核要少,但由于层数多,整体参数仍可达到上亿(VGG-16 约 1.38 亿)。但在同等深度的大卷积核网络中,参数会更多,因此 VGG 通过小卷积核的方式,在深度和参数规模上取得了相对的折中。

它还使用 ReLU 减少了梯度消失问题,提高训练速度。在全连接层中使用 Dropout,有效抑制过拟合、提升模型泛化能力。

由于 VGG 的网络结构简单、性能优秀,常被作为通用特征提取器。在许多视觉任务中,可以将 VGG 预训练模型的卷积层权重(提取到的特征)迁移到下游任务,再进行微调或进一步训练,从而得到不错的效果。

 

五个 卷积 + 池化 结构块

Block 1

  • 两个3 \times 3 卷积层,每层有 64 个卷积核。

    • 输入: 224 \times 224 \times 3

    • 卷积后: 224 \times 224 \times 64(padding = 1, stride = 1)

  • 一个2 \times 2 最大池化层(stride = 2)

    • 输出: 112 \times 112 \times 64

Block 2

  • 两个3 \times 3 卷积层,每层有 128 个卷积核。

    • 输入: 112 \times 112 \times 64

    • 卷积后: 112 \times 112 \times 128

  • 一个2 \times 2 最大池化层(stride = 2)

    • 输出: 56 \times 56 \times 128

Block 3

  • 三个3 \times 3 卷积层,每层有 256 个卷积核。

    • 输入: 56 \times 56 \times 128

    • 卷积后: 56 \times 56 \times 256

  • 一个2 \times 2 最大池化层(stride = 2)

    • 输出: 28 \times 28 \times 256

Block 4

  • 三个3 \times 3 卷积层,每层有 512 个卷积核。

    • 输入: 28 \times 28 \times 25628×28×256

    • 卷积后: 28 \times 28 \times 512

  • 一个2 \times 2 最大池化层(stride = 2)

    • 输出: 14 \times 14 \times 512

Block 5

  • 三个3 \times 3 卷积层,每层有 512 个卷积核。

    • 输入: 14 \times 14 \times 512

    • 卷积后: 14 \times 14 \times 512

  • 一个2 \times 2 最大池化层(stride = 2)

    • 输出: 7 \times 7 \times 512

全连接层

  • 将第五个块的输出7 \times 7 \times 512 展平 成长度为7 \times 7 \times 512 = 25088 的向量。

  • 后面接两个全连接层(各 4096 个神经元),再接一个根据任务配置的全连接层输出(如 ImageNet 1000 类则是 1000 维)。

  • 最后使用 Softmax 函数把输出归一化为概率分布:

    y_i = \frac{e^{z_i}}{\sum_{j=1}^{N} e^{z_j}}

    其中z_i 是最后一层全连接输出的第i 个分量, N 是分类类别数。

 

Inception Net (GoogLeNet)

2014~2015 年,Google 团队提出 Inception 系列模型 (GoogLeNet, Inception v2/v3/v4 等),多次在 ImageNet 获奖。 其核心思想是在同一个模块中并行使用不同大小的卷积核 ,并配合 1 \times 1 卷积做维度变换。

 

模块

一个典型的 Inception 模块包含 4 条并行分支:

  • 分支 1: 1 \times 1 卷积

  • 分支 2: 1 \times 1 卷积 +3 \times 3 卷积

  • 分支 3: 1 \times 1 卷积 +5 \times 5 卷积

  • 分支 4:最大池化 +1 \times 1 卷积

然后将这 4 个分支在通道维度上拼接(Concat)得到最终输出。通过这样的并行结构,让网络能同时捕捉不同尺度的特征。

要点

  • 深度约 22 层,并在不同深度加 辅助分类器 辅助训练。

  • 大量使用1 \times 1 卷积进行通道的升降维,从而降低计算量。

  • 可以将 Inception 模块级联形成更深的网络,而不会导致参数极度膨胀。

ResNet

2015 年,何凯明等人提出 ResNet(残差网络)并在 ImageNet 再次夺冠。 其核心思想是,随着网络层数增加,梯度消失或爆炸会导致训练困难甚至准确率降低。通过残差连接(跳跃连接),能让梯度 绕过 若干层直接回传,极大地缓解训练问题。

残差块

在一个典型的两层残差块中:

  1. 前向路径:第(l+1) 层 -> 第(l+2)

  2. 跳跃连接:把第l 层的输出直接加到第(l+2) 层的输入上

  3. 公式示意:

    a_{l+2} = \sigma\Bigl(W_{l+2} \cdot a_{l+1} + b_{l+2} \; + \; a_l\Bigr).

这样做后,梯度能在反向传播时直接回传到a_l,使深层网络的训练更稳定。

要点

  • 允许网络更深(甚至数百层或上千层)仍能被成功训练

  • 后续衍生出 ResNeXt、Pre-activation ResNet、Inception-ResNet 等结构。

DenseNet

2017 年,Gao Huang 等人提出 Densely Connected Convolutional Networks(DenseNet)。 其核心思想是,网络每一层都直接接收来自前面所有层的特征图,不再只与上一层相连。这带来更强的特征重用和梯度流动效果。

网络结构

(l+1) 层的输入是所有之前层特征拼接:

x_{l+1} = H\Bigl(\bigl[x_0,\; x_1,\; \dots,\; x_l\bigr]\Bigr)

要点

  • 可缓解梯度消失问题。

  • 后续层无需重复提取相同特征。

  • 与相同深度的传统 CNN 相比,DenseNet 更紧凑,精度也较高。