第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的窗口,取四个像素中的最大值。这样,特征图尺寸直接减半。

为什么要池化?两个原因:

  1. 减少计算量:特征图小了,后续层的计算量指数级下降。
  2. 防止过拟合:池化让模型更关注「有没有这个特征」,而不是「特征在哪个精确位置」。

我曾经在一个人脸识别项目里,因为没加池化层,模型在STM32上跑不动。加了池化后,推理时间从2秒降到0.3秒。嗯,这里要注意:池化层没有可训练参数,但它对性能影响巨大。

避坑指南:池化层会丢失位置信息。如果你的任务需要精确定位(比如目标检测),不要过度池化。我曾经在边缘检测任务中用了太多池化,结果边缘位置全乱了。

4.4 全连接层:决策的终点

全连接层,说白了就是传统的神经网络层。每个神经元与上一层的所有神经元相连。

它的作用是把前面提取的特征,映射到最终的分类结果上。比如前面卷积层提取了猫耳朵、猫胡须的特征,全连接层综合这些特征,判断「这是猫」。

全连接层的参数量非常大。举个例子:如果上一层有1000个神经元,这一层有500个,那参数量就是1000x500=50万。在STM32上,这很容易撑爆内存。

我建议:在嵌入式部署时,尽量用全局平均池化替代全连接层。全局平均池化直接把特征图每个通道的平均值作为输出,参数量为0。

层类型 参数量 计算量 适用场景
卷积层 中等 特征提取
池化层 0 降维
全连接层 极高 分类决策

4.5 三种层的配合使用

一个典型的CNN结构是这样的:

输入 → [卷积层 → 激活函数 → 池化层] × N → 全连接层 → 输出

卷积层提取特征,池化层压缩数据,全连接层做决策。这三者缺一不可。

在STM32CubeAI中,模型转换时会自动优化这些层的计算。但我建议你手动检查一下:

  • 卷积核大小是否合理?
  • 池化层是否过多?
  • 全连接层能否用全局平均池化替代?

我记得有个项目,客户要求手势识别。我一开始用了三层全连接,模型在PC上跑得飞快,但一部署到STM32就崩了。后来改成全局平均池化,模型大小从2MB降到200KB,完美运行。

总结:卷积层负责「看」,池化层负责「记重点」,全连接层负责「做决定」。在嵌入式部署时,优先考虑计算量和内存占用,不要盲目堆叠层数。

好了,这一章就到这里。下一章咱们聊聊激活函数和损失函数——这两个东西决定了你的模型能不能收敛。到时候我会分享一些调参的实战经验。