神经网络与深度学习课程总结2:卷积神经网络基础与视觉应用

本文整理本周《神经网络与深度学习》课程内容,围绕卷积神经网络(CNN)的基本思想、LeNet-5与经典CNN结构、常用视觉数据集、评价指标,以及目标检测与语义分割等视觉应用进行总结。

一、为什么图像任务需要卷积神经网络?

在图像任务中,如果直接使用全连接网络,输入图像的每个像素都要与下一层神经元相连,参数量会迅速膨胀。例如输入为 1000×10001000\times10001000×1000 的图像,若隐含层有 10610^6106 个节点,则输入层到隐含层之间的连接数达到 101210^{12}1012 数量级。这样会带来三个典型问题:

  1. 计算量过大:参数过多导致训练和推理速度变慢。
  2. 难以收敛:高维参数空间使优化更困难。
  3. 容易过拟合:模型容量过大,而有效样本数量有限时,会记住训练集细节。

卷积神经网络的核心思路是:局部连接、权值共享、分层特征提取。图像具有明显的局部空间相关性,边缘、角点、纹理等低层特征通常只与邻域像素有关;随着网络层数加深,低层特征逐渐组合成部件、目标乃至语义概念。这与人类视觉系统“分层处理信息”的思路类似。

二、CNN的基本组成

典型CNN通常由以下部分构成:

  • 卷积层(Convolution Layer):使用若干卷积核提取局部特征,每个卷积核对应一个输出通道。
  • 激活函数(Activation):引入非线性,如 ReLU、Sigmoid、tanh 等。
  • 池化层(Pooling Layer):通过最大值或均值统计降低特征图尺寸,减少冗余。
  • 全连接层(Fully Connected Layer):在网络末端将高层特征映射到类别空间。
  • Softmax / 分类器:输出各类别概率。

经典结构可以概括为:

Input→Conv→Activation→Pooling→⋯→FC→Output \text{Input} \rightarrow \text{Conv} \rightarrow \text{Activation} \rightarrow \text{Pooling} \rightarrow \cdots \rightarrow \text{FC} \rightarrow \text{Output} InputConvActivationPoolingFCOutput

三、卷积操作、Padding与Stride

在这里插入图片描述

1. 卷积的数学表达

设第 lll 层的输入特征为 a[l−1]a^{[l-1]}a[l1],卷积核为 w[l],kw^{[l],k}w[l],k,输出第 kkk 个通道在位置 (x,y)(x,y)(x,y) 的线性响应为:

z[l],k(x,y)=∑u=0p∑v=0qa[l−1](x+u,y+v)w[l],k(u,v)+b[l],k z^{[l],k}(x,y)=\sum_{u=0}^{p}\sum_{v=0}^{q}a^{[l-1]}(x+u,y+v)w^{[l],k}(u,v)+b^{[l],k} z[l],k(x,y)=u=0pv=0qa[l1](x+u,y+v)w[l],k(u,v)+b[l],k

再经过激活函数得到:

a[l],k(x,y)=f(z[l],k(x,y)) a^{[l],k}(x,y)=f\left(z^{[l],k}(x,y)\right) a[l],k(x,y)=f(z[l],k(x,y))

其中,p,qp,qp,q 与卷积核大小有关,kkk 表示输出通道编号。实际深度学习框架中常实现的是互相关形式,即不显式翻转卷积核,但由于卷积核参数本身是可学习的,通常不影响最终学习结果。

2. 输出尺寸计算

对于输入尺寸 H×WH\times WH×W,卷积核大小为 KKK,Padding为 PPP,Stride为 SSS,输出特征图的高和宽为:

Hout=⌊H+2P−KS⌋+1 H_{out}=\left\lfloor \frac{H+2P-K}{S}\right\rfloor+1 Hout=SH+2PK+1

Wout=⌊W+2P−KS⌋+1 W_{out}=\left\lfloor \frac{W+2P-K}{S}\right\rfloor+1 Wout=SW+2PK+1

Padding 的作用是在边界补零或复制边界像素,避免边缘信息过快丢失;Stride 控制卷积核移动步幅,步幅越大,输出尺寸越小。

3. 多通道卷积

RGB图像有3个输入通道,卷积核也需要具有同样的通道深度。例如一个 3×33\times33×3 卷积核作用于RGB图像时,其参数形状应为 3×3×33\times3\times33×3×3。若输出通道数为 CoutC_{out}Cout,输入通道数为 CinC_{in}Cin,卷积核大小为 Kh×KwK_h\times K_wKh×Kw,则卷积层参数量为:

Params=Kh×Kw×Cin×Cout+Cout \text{Params}=K_h\times K_w\times C_{in}\times C_{out}+C_{out} Params=Kh×Kw×Cin×Cout+Cout

其中最后一项为偏置参数。

四、池化层:减少特征数量并增强鲁棒性

池化层通常没有可学习参数,主要用于对局部区域进行统计。常见池化包括:

  • 最大池化(Max Pooling):取局部窗口最大值,突出最强响应。
  • 平均池化(Average Pooling):取局部窗口均值,更平滑地保留区域信息。

池化能够降低特征图空间尺寸,减少计算量,也能提高对局部平移、扰动的鲁棒性。例如 2×22\times22×2 最大池化、步长为2时,特征图高宽通常减半。

五、卷积神经网络的学习与反向传播

CNN训练依然基于误差反向传播(Back Propagation)。对于输出层,先根据损失函数计算误差;随后从后向前逐层传播误差并更新权重。

对于卷积层,权重更新可概括为:

Δw[l],kj(u,v)=α∑x∑yδ[l],j(x,y)⋅a[l−1],k(x+u,y+v) \Delta w^{[l],kj}(u,v)=\alpha\sum_x\sum_y\delta^{[l],j}(x,y)\cdot a^{[l-1],k}(x+u,y+v) Δw[l],kj(u,v)=αxyδ[l],j(x,y)a[l1],k(x+u,y+v)

其中,α\alphaα 为学习率,δ\deltaδ 为局部误差信号。对于池化层,由于没有可学习权重,反向传播主要是将误差按池化规则回传:平均池化将误差均分到窗口内,最大池化只把误差传给前向传播时取得最大值的位置。

六、LeNet-5:早期经典CNN结构

在这里插入图片描述

LeNet-5 是卷积神经网络发展史上的经典模型,常用于手写数字识别。其基本结构可以写成:

Input→C1→S2→C3→S4→C5→F6→Output \text{Input} \rightarrow C1 \rightarrow S2 \rightarrow C3 \rightarrow S4 \rightarrow C5 \rightarrow F6 \rightarrow \text{Output} InputC1S2C3S4C5F6Output

课程中重点总结了LeNet-5的几个特点:

  • C1层由6个Feature Map构成,每个神经元对输入进行 5×55\times55×5 卷积。
  • S2、S4为池化层,原始LeNet中使用平均池化。
  • C5层有120个神经元,与S4层全连接式卷积。
  • F6层有84个神经元。
  • 输出层每类一个单元,用于最终分类。

与现代CNN相比,LeNet-5具有明显的早期特征:卷积时通常不进行Padding,池化层多采用平均池化,激活函数多使用 Sigmoid 或 tanh,网络层数较浅,参数数量较小。

七、从AlexNet到VGG、ResNet:经典CNN的发展

在这里插入图片描述

1. AlexNet

AlexNet标志着深度卷积神经网络在大规模图像识别中的成功。它包含5层卷积层和3层全连接层,主要改进包括:

  • 使用 ReLU 替代 Sigmoid/tanh,加快收敛速度;
  • 使用 Max Pooling
  • 使用 Dropout 缓解全连接层过拟合;
  • 使用数据增强,如随机裁剪、水平翻转、颜色扰动;
  • 网络规模显著扩大,参数量接近6000万。

2. VGG-16

VGG-16的特点是结构规整,反复堆叠 3×33\times33×3 卷积和 2×22\times22×2 最大池化。其核心思想是用多个小卷积核堆叠替代大卷积核,在增加非线性表达能力的同时保持结构清晰。VGG-16参数量很大,约1.38亿,但其“模块化堆叠”的思想对后续网络设计影响很深。

3. ResNet

随着网络不断加深,普通深层网络会遇到梯度消失、训练困难等问题。ResNet提出残差连接:

y=F(x)+x y=F(x)+x y=F(x)+x

其中 xxx 是浅层输入,F(x)F(x)F(x) 是卷积层学习到的残差映射。残差连接允许浅层信息直接传到深层,从而缓解梯度消失问题,使训练极深神经网络成为可能。

八、常用视觉数据集

课程中总结了多个视觉任务常用数据集:

数据集 主要特点 常见任务
MNIST 0~9手写数字,60000训练样本、10000测试样本,28×28灰度图 图像分类入门
Fashion-MNIST 10类服饰图像,共7万张,格式与MNIST一致 分类算法测试
CIFAR-10 10类,60000张32×32彩色图像 小尺寸图像分类
PASCAL VOC 20类,常用于分类、检测、分割 目标检测、语义分割
MS COCO 80类,超过33万张图片、超过150万个目标实例 检测、分割、语义标注
ImageNet 超大规模层次化图像数据库 大规模分类与预训练

这些数据集从简单到复杂,分别适合不同阶段的模型验证。MNIST和CIFAR-10常用于算法入门,VOC和COCO更接近真实场景,ImageNet则常用于大规模预训练。

九、视觉任务评价指标:Precision、Recall、AP与mAP

在这里插入图片描述

1. 混淆矩阵基础

二分类任务中常用以下四个量:

  • TP:真实为正,预测也为正;
  • FP:真实为负,预测为正;
  • FN:真实为正,预测为负;
  • TN:真实为负,预测也为负。

由此可定义:

Precision=TPTP+FP Precision=\frac{TP}{TP+FP} Precision=TP+FPTP

Recall=TPTP+FN Recall=\frac{TP}{TP+FN} Recall=TP+FNTP

Accuracy=TP+TNTP+FP+FN+TN Accuracy=\frac{TP+TN}{TP+FP+FN+TN} Accuracy=TP+FP+FN+TNTP+TN

Precision强调“预测为正的样本中有多少是真的”,Recall强调“真实正样本中有多少被找出来”。二者通常存在权衡:阈值提高时,Precision可能上升,但Recall可能下降。

2. AP与mAP

通过改变分类或检测阈值,可以得到一条 Precision-Recall 曲线。平均精度 AP 可表示为:

AP=∑k=1NP(k)Δr(k) AP=\sum_{k=1}^{N}P(k)\Delta r(k) AP=k=1NP(k)Δr(k)

其中 P(k)P(k)P(k) 表示识别出 kkk 个样本时的Precision,Δr(k)\Delta r(k)Δr(k) 表示Recall的变化量。多类别检测中,对每个类别分别计算AP,再取平均得到mAP:

mAP=1C∑c=1CAPc mAP=\frac{1}{C}\sum_{c=1}^{C}AP_c mAP=C1c=1CAPc

mAP是目标检测任务中非常重要的综合评价指标。

十、深度学习视觉应用:目标检测与语义分割

1. 图像分类、定位与目标检测

图像分类只需要判断图像中“是什么”;目标定位需要进一步给出目标位置;目标检测则要在图像中同时找出多个目标的位置和类别。目标检测的难点包括:

  • 目标大小变化大;
  • 姿态、角度、遮挡情况复杂;
  • 同一张图像中可能出现多个类别、多个目标;
  • 需要同时解决分类和回归问题。

课程中提到目标检测方法的发展过程:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN,最终引出YOLO。

2. YOLO:You Only Look Once

YOLO的核心思想是将目标检测看作一个统一的回归问题:模型只需要“看一次”整张图像,就同时预测目标类别和位置框。相比两阶段检测方法,YOLO具有端到端、速度快的特点,适合实时检测场景。

3. 语义分割、FCN与DeepLab

语义分割要求对图像中的每个像素进行分类,因此输出不再是一个类别标签或若干边界框,而是一张与原图空间对应的像素级类别图。课程中提到:

  • FCN(Fully Convolutional Network) 是语义分割的经典方法;
  • DeepLab v3 是目前广泛使用的语义分割方法之一。

FCN的重要思想是将传统CNN末端的全连接层转化为卷积层,从而保留空间结构,并通过上采样恢复到像素级输出。

十一、PyTorch基本使用回顾

课程中还介绍了PyTorch的基本概念。PyTorch使用Tensor表示数据,使用Dataset和DataLoader读取样本和标签,使用计算图组织前向计算与梯度传播。一个简单的数据读取流程如下:

import torch
from torch.utils import data
from torchvision import datasets, transforms

transform = transforms.Compose([
    transforms.ToTensor()
])

train_set = datasets.FashionMNIST(
    root="../data",
    train=True,
    transform=transform,
    download=True
)

train_loader = data.DataLoader(
    train_set,
    batch_size=64,
    shuffle=True
)

这个流程体现了深度学习训练的基本管线:准备数据、构建模型、定义损失函数、反向传播并更新参数。

十二、课件思考题及完整作答

思考题1:既然浅层神经网络已经很好,为什么还要用深度学习?

浅层神经网络确实可以完成一些简单任务,例如低维数据分类、线性或弱非线性模式识别等。但是在图像、语音、自然语言等复杂任务中,浅层网络往往存在表达能力不足、参数利用效率低、泛化能力不稳定等问题。因此,深度学习的必要性主要体现在以下几个方面。

第一,深层网络能够进行分层特征表达。 以图像识别为例,底层网络可以学习边缘、角点、纹理等低级特征;中间层可以组合出局部结构,如眼睛、轮廓、车轮等部件;高层网络则可以进一步组合出完整目标和语义概念。也就是说,深度学习并不是简单地“增加层数”,而是通过多层非线性变换逐级提取更抽象的表示。

第二,深层结构可以用更少的计算单元表示复杂函数。 某些复杂函数如果用浅层网络表示,可能需要指数级数量的神经元;而使用深层网络时,可以通过多层组合结构更加高效地表达。深度网络相当于把复杂映射拆分成多个相对简单的子映射,从而降低整体建模难度。

第三,深层网络更适合图像这类具有局部相关性和层次结构的数据。 如果直接用全连接网络处理大图像,参数量会非常庞大。例如 1000×10001000\times10001000×1000 图像连接到 10610^6106 个隐含层节点,连接数可达到 101210^{12}1012 量级,训练慢、难收敛且容易过拟合。卷积神经网络利用局部连接和权值共享显著减少参数,同时又能通过加深网络扩大感受野,逐步获得全局语义。

第四,深度网络在实际视觉任务中表现更强。 图像分类、目标检测、语义分割等任务不仅需要判断“是什么”,还要理解“在哪里”“边界在哪里”“多个目标如何区分”等复杂信息。浅层网络通常只能提取较低级特征,而深度网络可以在多层结构中综合局部纹理、空间结构和全局上下文,因此更适合复杂视觉应用。

因此,使用深度学习的根本原因是:深度网络能够以分层、组合、参数共享的方式高效学习复杂数据分布,从而获得比浅层网络更强的特征表达能力和任务泛化能力。


思考题2:尝试推导卷积神经网络中卷积层和池化层的梯度反向传播公式

下面以二维卷积为例推导CNN中卷积层和池化层的反向传播。为书写清晰,设第 lll 层输入为 a[l−1]a^{[l-1]}a[l1],卷积核为 W[l]W^{[l]}W[l],偏置为 b[l]b^{[l]}b[l],线性输出为 z[l]z^{[l]}z[l],激活输出为 a[l]a^{[l]}a[l]

2.1 卷积层前向传播

对于第 kkk 个输出通道,有:

zk[l](i,j)=∑c=1Cin∑u=0Kh−1∑v=0Kw−1ac[l−1](i+u,j+v)Wk,c[l](u,v)+bk[l] z_k^{[l]}(i,j)=\sum_{c=1}^{C_{in}}\sum_{u=0}^{K_h-1}\sum_{v=0}^{K_w-1} a_c^{[l-1]}(i+u,j+v)W_{k,c}^{[l]}(u,v)+b_k^{[l]} zk[l](i,j)=c=1Cinu=0Kh1v=0Kw1ac[l1](i+u,j+v)Wk,c[l](u,v)+bk[l]

ak[l](i,j)=f(zk[l](i,j)) a_k^{[l]}(i,j)=f\left(z_k^{[l]}(i,j)\right) ak[l](i,j)=f(zk[l](i,j))

其中,CinC_{in}Cin 为输入通道数,Kh×KwK_h\times K_wKh×Kw 为卷积核大小,f(⋅)f(\cdot)f() 为激活函数。

令损失函数为 LLL,定义卷积层的局部误差:

δk[l](i,j)=∂L∂zk[l](i,j) \delta_k^{[l]}(i,j)=\frac{\partial L}{\partial z_k^{[l]}(i,j)} δk[l](i,j)=zk[l](i,j)L

如果已经从后一层得到了 ∂L∂ak[l](i,j)\frac{\partial L}{\partial a_k^{[l]}(i,j)}ak[l](i,j)L,则有:

δk[l](i,j)=∂L∂ak[l](i,j)⋅f′(zk[l](i,j)) \delta_k^{[l]}(i,j)=\frac{\partial L}{\partial a_k^{[l]}(i,j)}\cdot f'\left(z_k^{[l]}(i,j)\right) δk[l](i,j)=ak[l](i,j)Lf(zk[l](i,j))

2.2 卷积层对卷积核权重的梯度

由链式法则:

∂L∂Wk,c[l](u,v)=∑i∑j∂L∂zk[l](i,j)∂zk[l](i,j)∂Wk,c[l](u,v) \frac{\partial L}{\partial W_{k,c}^{[l]}(u,v)} =\sum_i\sum_j \frac{\partial L}{\partial z_k^{[l]}(i,j)} \frac{\partial z_k^{[l]}(i,j)}{\partial W_{k,c}^{[l]}(u,v)} Wk,c[l](u,v)L=ijzk[l](i,j)LWk,c[l](u,v)zk[l](i,j)

由于:

∂zk[l](i,j)∂Wk,c[l](u,v)=ac[l−1](i+u,j+v) \frac{\partial z_k^{[l]}(i,j)}{\partial W_{k,c}^{[l]}(u,v)}=a_c^{[l-1]}(i+u,j+v) Wk,c[l](u,v)zk[l](i,j)=ac[l1](i+u,j+v)

所以:

∂L∂Wk,c[l](u,v)=∑i∑jδk[l](i,j)ac[l−1](i+u,j+v) \boxed{ \frac{\partial L}{\partial W_{k,c}^{[l]}(u,v)} =\sum_i\sum_j\delta_k^{[l]}(i,j)a_c^{[l-1]}(i+u,j+v) } Wk,c[l](u,v)L=ijδk[l](i,j)ac[l1](i+u,j+v)

这说明:卷积核梯度等于输入特征图局部窗口与输出误差图的相关运算结果。

偏置项的梯度为所有空间位置误差之和:

∂L∂bk[l]=∑i∑jδk[l](i,j) \boxed{ \frac{\partial L}{\partial b_k^{[l]}}=\sum_i\sum_j\delta_k^{[l]}(i,j) } bk[l]L=ijδk[l](i,j)

权重更新可写为:

Wk,c[l]←Wk,c[l]−η∂L∂Wk,c[l] W_{k,c}^{[l]}\leftarrow W_{k,c}^{[l]}-\eta\frac{\partial L}{\partial W_{k,c}^{[l]}} Wk,c[l]Wk,c[l]ηWk,c[l]L

其中 η\etaη 为学习率。

2.3 卷积层对输入特征图的梯度

输入特征图 ac[l−1]a_c^{[l-1]}ac[l1] 会影响所有使用该位置的输出,因此需要把后一层误差通过卷积核反传回来。其形式为:

∂L∂ac[l−1]=∑k=1Coutδk[l]∗rot180(Wk,c[l]) \boxed{ \frac{\partial L}{\partial a_c^{[l-1]}} =\sum_{k=1}^{C_{out}}\delta_k^{[l]} * \text{rot180}\left(W_{k,c}^{[l]}\right) } ac[l1]L=k=1Coutδk[l]rot180(Wk,c[l])

其中,∗* 表示卷积运算,rot180(⋅)\text{rot180}(\cdot)rot180() 表示将卷积核旋转 180∘180^\circ180。如果深度学习框架采用互相关实现卷积,则公式在实现时可能表现为相关运算或转置卷积,但本质都是把输出误差按卷积核连接关系分配回输入位置。

如果还需要继续传到更前一层,则再乘以前一层激活函数导数:

KaTeX parse error: Unexpected character: '' at position 19: …elta_c^{[l-1]}=̲rac{\partial L}…

2.4 平均池化层的反向传播

设平均池化窗口大小为 p×pp\times pp×p,前向传播为:

y(i,j)=1p2∑u=0p−1∑v=0p−1x(pi+u,pj+v) y(i,j)=\frac{1}{p^2}\sum_{u=0}^{p-1}\sum_{v=0}^{p-1}x(pi+u,pj+v) y(i,j)=p21u=0p1v=0p1x(pi+u,pj+v)

若后一层传回误差 δy(i,j)\delta_y(i,j)δy(i,j),则窗口内每个输入位置分到相同的梯度:

∂L∂x(pi+u,pj+v)=1p2δy(i,j) \boxed{ \frac{\partial L}{\partial x(pi+u,pj+v)}=\frac{1}{p^2}\delta_y(i,j) } x(pi+u,pj+v)L=p21δy(i,j)

例如 2×22\times22×2 平均池化时,每个输入位置得到 14\frac{1}{4}41 的误差。

2.5 最大池化层的反向传播

最大池化前向传播为:

y(i,j)=max⁡0≤u,v<px(pi+u,pj+v) y(i,j)=\max_{0\le u,v<p}x(pi+u,pj+v) y(i,j)=0u,v<pmaxx(pi+u,pj+v)

最大池化没有可学习参数,反向传播时只把误差传给前向传播时取得最大值的位置。设:

(u∗,v∗)=arg⁡max⁡0≤u,v<px(pi+u,pj+v) (u^*,v^*)=\arg\max_{0\le u,v<p}x(pi+u,pj+v) (u,v)=arg0u,v<pmaxx(pi+u,pj+v)

则:

∂L∂x(pi+u,pj+v)={δy(i,j),(u,v)=(u∗,v∗)0,其他位置 \boxed{ \frac{\partial L}{\partial x(pi+u,pj+v)}= \begin{cases} \delta_y(i,j), & (u,v)=(u^*,v^*) \\ 0, & \text{其他位置} \end{cases} } x(pi+u,pj+v)L={δy(i,j),0,(u,v)=(u,v)其他位置

如果池化窗口发生重叠,则某个输入位置可能从多个输出窗口接收梯度,此时需要将这些梯度累加。

卷积层与池化层反向传播的核心区别是:卷积层有可学习参数,需要同时求权重梯度、偏置梯度和输入梯度;池化层通常没有可学习参数,只需要根据平均池化或最大池化的前向规则把误差分配回输入位置。


思考题3:画出LeNet-5结构,并计算每层参数数量和连接权值数量

LeNet-5的典型结构如下:

Input 32×32
   ↓
C1: 6@28×28, 5×5卷积
   ↓
S2: 6@14×14, 2×2平均池化
   ↓
C3: 16@10×10, 5×5卷积,部分连接
   ↓
S4: 16@5×5, 2×2平均池化
   ↓
C5: 120@1×1, 5×5卷积,相当于全连接
   ↓
F6: 84维全连接层
   ↓
Output: 10类输出

也可以概括为:

Input→C1→S2→C3→S4→C5→F6→Output \text{Input}\rightarrow C1\rightarrow S2\rightarrow C3\rightarrow S4\rightarrow C5\rightarrow F6\rightarrow Output InputC1S2C3S4C5F6Output

下面按照原始LeNet-5常见设定计算参数量和连接数。这里输入为 32×3232\times3232×32 灰度图像,卷积核大小为 5×55\times55×5,池化采用 2×22\times22×2 平均池化。需要注意的是,原始LeNet-5的S2、S4平均池化层带有每个特征图一个可学习系数和一个偏置;C3层采用部分连接,而不是每个输出特征图都连接所有输入特征图。

输出尺寸 结构说明 参数数量 连接数量
Input 1@32×321@32\times321@32×32 输入灰度图像 0 0
C1 6@28×286@28\times286@28×28 6个 5×55\times55×5 卷积核,每个卷积核含1个偏置 (5×5+1)×6=156(5\times5+1)\times6=156(5×5+1)×6=156 156×28×28=122,304156\times28\times28=122,304156×28×28=122,304
S2 6@14×146@14\times146@14×14 2×22\times22×2 平均池化,每个通道1个系数和1个偏置 2×6=122\times6=122×6=12 (2×2+1)×6×14×14=5,880(2\times2+1)\times6\times14\times14=5,880(2×2+1)×6×14×14=5,880
C3 16@10×1016@10\times1016@10×10 5×55\times55×5 卷积,S2到C3为部分连接,共60组连接 5×5×60+16=1,5165\times5\times60+16=1,5165×5×60+16=1,516 1,516×10×10=151,6001,516\times10\times10=151,6001,516×10×10=151,600
S4 16@5×516@5\times516@5×5 2×22\times22×2 平均池化,每个通道1个系数和1个偏置 2×16=322\times16=322×16=32 (2×2+1)×16×5×5=2,000(2\times2+1)\times16\times5\times5=2,000(2×2+1)×16×5×5=2,000
C5 120@1×1120@1\times1120@1×1 对S4的16个 5×55\times55×5 特征图做卷积,等价于全连接 (5×5×16+1)×120=48,120(5\times5\times16+1)\times120=48,120(5×5×16+1)×120=48,120 48,12048,12048,120
F6 848484 全连接层 (120+1)×84=10,164(120+1)\times84=10,164(120+1)×84=10,164 10,16410,16410,164
Output 101010 原始论文为RBF输出,每类一个单元 84×10=84084\times10=84084×10=840 840840840
合计 - - 60,840 340,908

如果把输出层改成现代常见的Softmax全连接分类器,则输出层参数量通常写作:

(84+1)×10=850 (84+1)\times10=850 (84+1)×10=850

此时总参数数量会变为 60,85060,85060,850。课程中也提到LeNet-5整体参数数量约为6万,这与上述计算一致。


思考题4:解释VGG-16的各层结构

VGG-16是经典卷积神经网络之一,其主要特点是结构非常规整:大量使用 3×33\times33×3 小卷积核,并按照“若干卷积层 + 一个最大池化层”的形式堆叠。VGG-16中的“16”指的是 13个卷积层 + 3个全连接层,共16个带参数的可学习层。

VGG-16的典型输入为 224×224×3224\times224\times3224×224×3 RGB图像。其结构如下:

模块 层结构 输出尺寸变化 说明
输入 Image 224×224×3224\times224\times3224×224×3 RGB图像输入
Block 1 Conv3-64, Conv3-64, MaxPool 224×224×64→112×112×64224\times224\times64 \rightarrow 112\times112\times64224×224×64112×112×64 两个 3×33\times33×3 卷积,通道数64
Block 2 Conv3-128, Conv3-128, MaxPool 112×112×128→56×56×128112\times112\times128 \rightarrow 56\times56\times128112×112×12856×56×128 两个 3×33\times33×3 卷积,通道数128
Block 3 Conv3-256, Conv3-256, Conv3-256, MaxPool 56×56×256→28×28×25656\times56\times256 \rightarrow 28\times28\times25656×56×25628×28×256 三个 3×33\times33×3 卷积,通道数256
Block 4 Conv3-512, Conv3-512, Conv3-512, MaxPool 28×28×512→14×14×51228\times28\times512 \rightarrow 14\times14\times51228×28×51214×14×512 三个 3×33\times33×3 卷积,通道数512
Block 5 Conv3-512, Conv3-512, Conv3-512, MaxPool 14×14×512→7×7×51214\times14\times512 \rightarrow 7\times7\times51214×14×5127×7×512 三个 3×33\times33×3 卷积,通道数512
分类器 FC-4096, FC-4096, FC-1000, Softmax 100010001000 对ImageNet 1000类进行分类

其中,Conv3-64 表示卷积核大小为 3×33\times33×3、输出通道数为64的卷积层。VGG-16中卷积层通常使用步长1、Padding为1,因此卷积操作本身基本不改变特征图宽高;而每次 2×22\times22×2 最大池化、步长为2,会使特征图宽高减半。

VGG-16的层级展开可以写成:

Input 224×224×3
→ [Conv3×3, 64] ×2 → MaxPool
→ [Conv3×3, 128] ×2 → MaxPool
→ [Conv3×3, 256] ×3 → MaxPool
→ [Conv3×3, 512] ×3 → MaxPool
→ [Conv3×3, 512] ×3 → MaxPool
→ FC 4096 → FC 4096 → FC 1000 → Softmax

VGG-16之所以倾向于使用多个 3×33\times33×3 小卷积核,而不是直接使用大卷积核,主要原因如下:

  1. 感受野等效但非线性更多。 两个连续 3×33\times33×3 卷积的感受野等效于 5×55\times55×5,三个连续 3×33\times33×3 卷积的感受野等效于 7×77\times77×7,但每个卷积后都可以接ReLU,因此引入了更多非线性表达能力。
  2. 参数量更少。 假设输入输出通道数都为 CCC,一个 5×55\times55×5 卷积参数量为 25C225C^225C2,两个 3×33\times33×3 卷积参数量为 18C218C^218C2,参数更少;一个 7×77\times77×7 卷积参数量为 49C249C^249C2,三个 3×33\times33×3 卷积参数量为 27C227C^227C2,优势更明显。
  3. 结构规整,便于堆叠。 VGG把网络设计简化为统一的小卷积核和最大池化模块,使网络结构清晰,也便于后续网络借鉴。

VGG-16的不足也很明显:全连接层参数量巨大,整体参数规模约为1.38亿,计算和存储开销较高。因此,后续网络如GoogLeNet、ResNet等进一步在结构效率、梯度传播和参数利用方面进行了改进。


补充思考:Precision和Recall为什么存在权衡?mAP为什么适合评价多类别检测任务?

在目标检测中,模型通常会给每个候选框一个置信度分数。提高置信度阈值时,模型只保留更有把握的预测框,误检减少,Precision通常升高,但漏检也会增加,Recall通常降低;降低阈值时,模型保留更多预测框,Recall可能提高,但误检增加,Precision可能下降。因此二者往往存在权衡关系。

Precision和Recall定义为:

Precision=TPTP+FP Precision=\frac{TP}{TP+FP} Precision=TP+FPTP

Recall=TPTP+FN Recall=\frac{TP}{TP+FN} Recall=TP+FNTP

AP(Average Precision)可以理解为某一类别P-R曲线下的面积,用于综合衡量该类别在不同阈值下的检测效果:

AP=∑k=1NP(k)Δr(k) AP=\sum_{k=1}^{N}P(k)\Delta r(k) AP=k=1NP(k)Δr(k)

多类别检测任务中,每一类都可以计算一个AP,对所有类别AP取平均即可得到mAP:

mAP=1C∑c=1CAPc mAP=\frac{1}{C}\sum_{c=1}^{C}AP_c mAP=C1c=1CAPc

mAP适合评价多类别目标检测,是因为它同时考虑了不同置信度阈值下的Precision-Recall表现,也能对多个类别的检测性能进行整体平均,比单一Accuracy更适合衡量检测模型的综合能力。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐