3、深度学习基础回顾:神经网络、卷积层、池化层、全连接层
好,咱们进入正题。这一节我打算带大家快速过一遍深度学习的几个核心组件。你可能会问:「做目标检测,有必要回头啃这些基础吗?」
我的回答是:非常有必要。我在调优YOLO模型时,好几次都是因为对卷积层的理解不够深,导致模型死活不收敛。说白了,地基不牢,楼盖得再高也悬。
3.1 神经网络:从感知机到多层结构
神经网络这个概念,其实没那么玄乎。你可以把它想象成一个函数逼近器。我们给它一堆输入,它试着输出我们想要的结果。
最早的结构叫感知机,就一层。输入加权求和,过个激活函数,完事。但单层感知机有个致命缺陷——它连异或问题都解不了。我记得上学时老师讲这个例子,我还不信,自己写代码试了试,确实不行。
后来就有了多层神经网络。说白了,就是堆叠多个这样的计算层。每一层提取不同层次的特征。拿图像识别来说:第一层可能看到边缘,第二层看到纹理,第三层看到物体的局部,再往后就能认出整个物体了。
核心公式回顾:
z = W · x + b
a = σ(z)
其中 W 是权重,b 是偏置,σ 是激活函数。就这么简单。
我个人习惯把神经网络看作一个「特征提取器 + 分类器」的组合。前面的层负责提取有用的特征,后面的层负责做决策。这个思路在目标检测里同样适用。
3.2 卷积层:让网络学会看局部
全连接层处理图像有个大问题:参数太多。一张 224x224 的彩色图,光输入层就有 15 万个神经元,全连接起来,参数量直接爆炸。
卷积层就是来解决这个问题的。它用一个小窗口(卷积核)在图像上滑动,每次只关注局部区域。这样做有两个好处:
- 参数共享:同一个卷积核在整个图像上复用,参数量骤降
- 局部连接:每个神经元只连接输入的一小块区域,符合视觉的局部性原理
我在项目中遇到过一个问题:卷积核大小怎么选?3x3 还是 5x5?
我的建议是:优先用 3x3。两个 3x3 堆叠,感受野相当于一个 5x5,但参数量更少,非线性更强。这是 VGG 网络给我的启发。
实战小技巧:
卷积层的输出尺寸计算公式:
输出尺寸 = (输入尺寸 - 卷积核大小 + 2 * 填充) / 步长 + 1
记不住没关系,写代码时用 PyTorch 的 nn.Conv2d 会自动算。但理解原理很重要,不然调参时你会懵。
3.3 池化层:降维但不失关键信息
池化层,说白了就是「下采样」。它把图像变小,但保留最重要的信息。
最常见的两种:
- 最大池化:取窗口内的最大值。我一般用这个,因为它能保留最显著的特征
- 平均池化:取窗口内的平均值。适合在网络的最后几层用
你想想看,为什么需要池化?
第一,减少计算量。特征图变小了,后续卷积的计算负担就轻了。第二,防止过拟合。参数少了,模型就不容易死记硬背训练数据。第三,带来一定的平移不变性。图像稍微偏移一点,池化后的结果变化不大。
注意:
我曾经在目标检测项目里过度使用池化层,结果小目标全丢了。池化虽然好,但会损失空间信息。检测小物体时,要谨慎使用,或者改用步长为2的卷积来代替池化。
3.4 全连接层:最后的决策者
全连接层,就是最传统的神经网络层。每个输入节点都连接到每个输出节点。
在卷积神经网络里,全连接层通常放在最后。卷积层和池化层负责提取特征,全连接层负责把这些特征映射到具体的类别上。
举个例子:
# 假设经过卷积和池化后,我们得到一个特征向量
# 这个向量的长度是 512
# 全连接层把它映射到 10 个类别上
nn.Linear(512, 10)
嗯,这里要注意:全连接层的参数量非常大。一个 512 到 10 的连接,就有 5120 个参数。如果前面特征图的尺寸没控制好,全连接层很容易成为参数量的大头。
我个人的习惯是:尽量用全局平均池化来代替全连接层。比如在 ResNet 里,最后就是一个全局平均池化,直接输出类别数。这样参数量少,还不容易过拟合。
3.5 三者如何协同工作?
咱们用一个目标检测的例子串起来:
- 输入一张图片,比如 416x416
- 卷积层提取特征,生成特征图。比如经过几层卷积后,得到 13x13 的特征图
- 池化层穿插其中,逐步缩小尺寸,增加感受野
- 最后,全连接层(或 1x1 卷积)输出检测结果:边界框坐标、类别概率、置信度
你看,整个流程就是:卷积提取 → 池化压缩 → 全连接决策。这个思路贯穿了几乎所有主流的目标检测算法,从 YOLO 到 Faster R-CNN 都是如此。
一句话总结:
卷积层看局部,池化层做压缩,全连接层做决策。三者配合,才能让网络既看得清,又看得全。
好了,这一节就到这里。下一节咱们会深入聊聊目标检测里最核心的概念——锚框和 IoU。到时候你会发现,今天讲的这些基础,全都会用上。