第4章 AI模型基础(上):什么是神经网络?卷积层、池化层、全连接层的作用
各位同学,咱们今天聊聊神经网络的基础。说实话,我刚接触AI时也被一堆术语搞得头晕。什么卷积、池化、全连接,听着像天书。但后来我发现,这些东西说白了就是一套「特征提取+决策」的流水线。
我习惯把神经网络比作一个工厂。原材料是图片、声音或文本,经过一道道工序,最后产出结果。今天咱们就拆开这个工厂,看看里面到底在干什么。
4.1 神经网络到底是什么?
神经网络,名字听着高大上,其实就是一个数学函数。输入一堆数字,输出另一堆数字。中间那些「层」就是不同的计算步骤。
举个例子。你给网络一张猫的图片,它输出「这是猫」的概率。为什么能识别?因为网络在训练过程中,自己学会了哪些像素组合代表猫的耳朵,哪些代表胡须。
我记得第一次在STM32上跑神经网络时,心里直打鼓——这么小的芯片能行吗?后来发现,只要模型剪裁得当,效果还真不错。
核心概念:神经网络由输入层、隐藏层、输出层组成。每一层包含若干神经元,神经元之间通过权重连接。训练就是不断调整这些权重,让输出接近真实值。
4.2 卷积层:特征提取的利器
卷积层是CNN(卷积神经网络)的核心。它的任务是从输入数据中提取特征。
怎么提取?用一个「小窗口」在输入上滑动,每次计算窗口内像素的加权和。这个小窗口叫卷积核,也叫滤波器。
我举个例子。你有一张32x32的灰度图,用一个3x3的卷积核去扫。每扫一次,得到一个数值。扫完整个图,得到一张新的「特征图」。这张特征图就突出了原图的某些特征,比如边缘、纹理。
在项目中,我遇到过一个问题:卷积核大小怎么选?3x3、5x5还是7x7?
我的经验是:小核(3x3)堆叠比大核更高效。两个3x3堆叠,感受野相当于5x5,但参数量更少。在STM32上,参数量直接决定内存占用,所以尽量用3x3。
实战技巧:在STM32CubeAI中,卷积层的输入输出通道数要匹配。我习惯先用小模型测试,确认推理时间在可接受范围内,再逐步增加通道数。
卷积层还有两个重要参数:步长和填充。
- 步长:卷积核每次移动的像素数。步长越大,输出特征图越小。
- 填充:在输入边缘补0,保持输出尺寸不变。
你想想看,如果步长是2,输出尺寸直接减半。这在STM32上很有用——可以快速降低特征图尺寸,减少计算量。
4.3 池化层:降维的艺术
池化层的作用很简单:压缩数据。它把一小块区域的值,用一个代表值替代。
最常见的是最大池化。比如2x2的窗口,取四个像素中的最大值。这样,特征图尺寸直接减半。
为什么要池化?两个原因:
- 减少计算量:特征图小了,后续层的计算量指数级下降。
- 防止过拟合:池化让模型更关注「有没有这个特征」,而不是「特征在哪个精确位置」。
我曾经在一个人脸识别项目里,因为没加池化层,模型在STM32上跑不动。加了池化后,推理时间从2秒降到0.3秒。嗯,这里要注意:池化层没有可训练参数,但它对性能影响巨大。
避坑指南:池化层会丢失位置信息。如果你的任务需要精确定位(比如目标检测),不要过度池化。我曾经在边缘检测任务中用了太多池化,结果边缘位置全乱了。
4.4 全连接层:决策的终点
全连接层,说白了就是传统的神经网络层。每个神经元与上一层的所有神经元相连。
它的作用是把前面提取的特征,映射到最终的分类结果上。比如前面卷积层提取了猫耳朵、猫胡须的特征,全连接层综合这些特征,判断「这是猫」。
全连接层的参数量非常大。举个例子:如果上一层有1000个神经元,这一层有500个,那参数量就是1000x500=50万。在STM32上,这很容易撑爆内存。
我建议:在嵌入式部署时,尽量用全局平均池化替代全连接层。全局平均池化直接把特征图每个通道的平均值作为输出,参数量为0。
| 层类型 | 参数量 | 计算量 | 适用场景 |
|---|---|---|---|
| 卷积层 | 中等 | 高 | 特征提取 |
| 池化层 | 0 | 低 | 降维 |
| 全连接层 | 极高 | 高 | 分类决策 |
4.5 三种层的配合使用
一个典型的CNN结构是这样的:
输入 → [卷积层 → 激活函数 → 池化层] × N → 全连接层 → 输出
卷积层提取特征,池化层压缩数据,全连接层做决策。这三者缺一不可。
在STM32CubeAI中,模型转换时会自动优化这些层的计算。但我建议你手动检查一下:
- 卷积核大小是否合理?
- 池化层是否过多?
- 全连接层能否用全局平均池化替代?
我记得有个项目,客户要求手势识别。我一开始用了三层全连接,模型在PC上跑得飞快,但一部署到STM32就崩了。后来改成全局平均池化,模型大小从2MB降到200KB,完美运行。
总结:卷积层负责「看」,池化层负责「记重点」,全连接层负责「做决定」。在嵌入式部署时,优先考虑计算量和内存占用,不要盲目堆叠层数。
好了,这一章就到这里。下一章咱们聊聊激活函数和损失函数——这两个东西决定了你的模型能不能收敛。到时候我会分享一些调参的实战经验。