神经网络与深度学习课程总结2:卷积神经网络与视觉应用总结
神经网络与深度学习课程总结2:卷积神经网络基础与视觉应用
本文整理本周《神经网络与深度学习》课程内容,围绕卷积神经网络(CNN)的基本思想、LeNet-5与经典CNN结构、常用视觉数据集、评价指标,以及目标检测与语义分割等视觉应用进行总结。
一、为什么图像任务需要卷积神经网络?
在图像任务中,如果直接使用全连接网络,输入图像的每个像素都要与下一层神经元相连,参数量会迅速膨胀。例如输入为 1000×10001000\times10001000×1000 的图像,若隐含层有 10610^6106 个节点,则输入层到隐含层之间的连接数达到 101210^{12}1012 数量级。这样会带来三个典型问题:
- 计算量过大:参数过多导致训练和推理速度变慢。
- 难以收敛:高维参数空间使优化更困难。
- 容易过拟合:模型容量过大,而有效样本数量有限时,会记住训练集细节。
卷积神经网络的核心思路是:局部连接、权值共享、分层特征提取。图像具有明显的局部空间相关性,边缘、角点、纹理等低层特征通常只与邻域像素有关;随着网络层数加深,低层特征逐渐组合成部件、目标乃至语义概念。这与人类视觉系统“分层处理信息”的思路类似。
二、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} Input→Conv→Activation→Pooling→⋯→FC→Output
三、卷积操作、Padding与Stride

1. 卷积的数学表达
设第 lll 层的输入特征为 a[l−1]a^{[l-1]}a[l−1],卷积核为 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=0∑pv=0∑qa[l−1](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+2P−K⌋+1
Wout=⌊W+2P−KS⌋+1 W_{out}=\left\lfloor \frac{W+2P-K}{S}\right\rfloor+1 Wout=⌊SW+2P−K⌋+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)=αx∑y∑δ[l],j(x,y)⋅a[l−1],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} Input→C1→S2→C3→S4→C5→F6→Output
课程中重点总结了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=1∑NP(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=1∑CAPc
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[l−1],卷积核为 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=1∑Cinu=0∑Kh−1v=0∑Kw−1ac[l−1](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)∂L⋅f′(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=i∑j∑∂zk[l](i,j)∂L∂Wk,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[l−1](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=i∑j∑δk[l](i,j)ac[l−1](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=i∑j∑δ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[l−1] 会影响所有使用该位置的输出,因此需要把后一层误差通过卷积核反传回来。其形式为:
∂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[l−1]∂L=k=1∑Coutδ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=0∑p−1v=0∑p−1x(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)=max0≤u,v<px(pi+u,pj+v) y(i,j)=\max_{0\le u,v<p}x(pi+u,pj+v) y(i,j)=0≤u,v<pmaxx(pi+u,pj+v)
最大池化没有可学习参数,反向传播时只把误差传给前向传播时取得最大值的位置。设:
(u∗,v∗)=argmax0≤u,v<px(pi+u,pj+v) (u^*,v^*)=\arg\max_{0\le u,v<p}x(pi+u,pj+v) (u∗,v∗)=arg0≤u,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 Input→C1→S2→C3→S4→C5→F6→Output
下面按照原始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×64→112×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×128→56×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×256→28×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×512→14×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×512→7×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 小卷积核,而不是直接使用大卷积核,主要原因如下:
- 感受野等效但非线性更多。 两个连续 3×33\times33×3 卷积的感受野等效于 5×55\times55×5,三个连续 3×33\times33×3 卷积的感受野等效于 7×77\times77×7,但每个卷积后都可以接ReLU,因此引入了更多非线性表达能力。
- 参数量更少。 假设输入输出通道数都为 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,优势更明显。
- 结构规整,便于堆叠。 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=1∑NP(k)Δr(k)
多类别检测任务中,每一类都可以计算一个AP,对所有类别AP取平均即可得到mAP:
mAP=1C∑c=1CAPc mAP=\frac{1}{C}\sum_{c=1}^{C}AP_c mAP=C1c=1∑CAPc
mAP适合评价多类别目标检测,是因为它同时考虑了不同置信度阈值下的Precision-Recall表现,也能对多个类别的检测性能进行整体平均,比单一Accuracy更适合衡量检测模型的综合能力。
更多推荐




所有评论(0)