2、基础知识:CNN核心组件(卷积、池化、全连接)与计算量/参数量评估指标(FLOPs、MACs、Params)

在进入 TinyML 轻量级模型(MobileNet、EfficientNet-Lite 等)的讨论之前,必须先厘清卷积神经网络(CNN)的基本构成单元,以及衡量这些单元“轻”与“重”的量化标尺。TinyML 场景下的模型设计,本质上是在表达能力与资源消耗之间寻找帕累托最优解。若不了解卷积、池化、全连接各自的计算特性,不理解 FLOPs、MACs、Params 三个指标背后的物理含义,后续对轻量级网络结构的优化分析将无从谈起。本章将系统拆解 CNN 核心组件的计算模式,并建立一套用于评估模型复杂度的指标体系,为后续章节的模型选型与部署优化打下坚实基础。

CNN 核心组件与复杂度评估指标映射 输入特征图 H×W×C 卷积层 K×K×C_in×C_out FLOPs = 2×K²×C_in×C_out×H_out×W_out 池化层 最大/平均池化 FLOPs ≈ 0(无参数) 全连接层 输入维度×输出维度 Params = I×O + O 输出特征图 H'×W'×C_out 三大评估指标 Params(参数量) 模型存储占用 单位:个 / KB / MB 卷积核 + 偏置 全连接权重矩阵 决定 Flash 占用 FLOPs(浮点运算量) 所有乘加运算总和 单位:FLOPs / MFLOPs 卷积 MAC 计数 全连接矩阵乘法 决定推理延迟 MACs(乘加次数) 1 MAC = 1 乘 + 1 加 FLOPs = 2 × MACs 硬件 DSP 单元计数 MCU 侧更常用 决定功耗与吞吐

2.1 卷积层:特征提取的核心引擎

卷积层是 CNN 中计算量最集中的部分,也是轻量化改造的重点对象。其核心操作是使用一组可学习的卷积核(Kernel)在输入特征图上滑动,通过局部感受野的加权求和提取空间特征。一个标准的二维卷积操作,假设输入特征图尺寸为 H×W×C_in,卷积核尺寸为 K×K,输出通道数为 C_out,则输出特征图的空间尺寸 H_out、W_out 由步长(Stride)和填充(Padding)决定。每个输出像素点需要执行 K×K×C_in 次乘法与 K×K×C_in-1 次加法,再加上偏置的 1 次加法,总计约 2×K²×C_in 次浮点运算。整个卷积层的 FLOPs 为 2×K²×C_in×C_out×H_out×W_out。

从参数量角度看,卷积层的权重数量为 K×K×C_in×C_out,加上 C_out 个偏置项。值得注意的是,卷积层的参数量与输入特征图的空间尺寸 H、W 无关,只与卷积核尺寸、输入输出通道数相关。这一特性使得卷积层在参数量上远小于全连接层,也是 CNN 能够高效处理图像数据的关键原因之一。在 TinyML 场景中,3×3 卷积是最常用的配置,因为它在感受野大小与计算量之间取得了良好平衡;5×5 或 7×7 卷积虽然感受野更大,但计算量呈平方级增长,通常会被分解为多个 3×3 卷积的堆叠。

深度可分离卷积的动机:标准卷积的计算量中,K² 与 C_in 是乘法关系。MobileNet 的核心创新在于将标准卷积分解为深度卷积(Depthwise Convolution)与逐点卷积(Pointwise Convolution)两步。深度卷积对每个输入通道独立使用一个 K×K 卷积核,计算量为 K²×C_in×H_out×W_out;逐点卷积使用 1×1 卷积核进行跨通道信息融合,计算量为 C_in×C_out×H_out×W_out。两者相加后,计算量约为标准卷积的 1/C_out + 1/K²,在典型配置(K=3, C_out=64)下可减少约 8-9 倍计算量。

2.2 池化层:空间降维与特征压缩

池化层(Pooling Layer)在 CNN 中承担着逐步降低特征图空间分辨率、扩大感受野、增强平移不变性的任务。最常见的两种池化操作是最大池化(Max Pooling)和平均池化(Average Pooling)。最大池化取窗口内最大值,对纹理边缘等高频特征更敏感;平均池化取窗口内均值,对背景等低频信息更平滑。池化层没有可学习的参数,因此 Params 恒为 0。其计算量也极低:对于 2×2 池化窗口、步长为 2 的配置,每个输出像素仅需比较或累加 4 个输入值,FLOPs 约为输入像素总数的 4 倍(最大池化)或 3 次加法加 1 次除法(平均池化)。

在轻量级网络设计中,池化层往往与卷积层的步长设置协同工作。例如,MobileNetV1 使用步长为 2 的深度卷积替代部分池化操作,在降低分辨率的同时完成特征提取,减少了网络层数。EfficientNet-Lite 则采用 MBConv 模块中的 SE(Squeeze-and-Excitation)注意力机制配合全局平均池化(Global Average Pooling)来替代全连接层,大幅削减参数量。全局平均池化将每个通道的特征图压缩为一个标量,直接输出长度为通道数的向量,彻底消除了全连接层中巨大的权重矩阵。

2.3 全连接层:特征映射与分类决策

全连接层(Fully Connected Layer)将卷积和池化提取到的二维特征图展平为一维向量,并通过矩阵乘法映射到样本标记空间。假设输入维度为 I(展平后的特征总数),输出维度为 O(类别数或隐藏层神经元数),则全连接层的权重矩阵尺寸为 I×O,偏置向量长度为 O,参数量为 I×O + O。计算量方面,每个输出神经元需要执行 I 次乘法和 I 次加法,总计 FLOPs 为 2×I×O。

全连接层是 CNN 中参数量爆炸的主要来源。以 VGG16 为例,其最后一个全连接层输入维度为 7×7×512=25088,输出维度为 4096,仅这一层的参数量就超过 1 亿,占整个模型参数的 74% 以上。在 TinyML 场景中,这种规模的参数量完全不可接受。因此,现代轻量级网络普遍采用全局平均池化 + 1×1 卷积的组合替代全连接层。例如,MobileNetV2 在分类头之前使用 1×1 卷积将特征通道数映射到类别数,再通过全局平均池化输出最终分类结果,参数量仅为 C_in×C_out + C_out,比全连接层减少数个数量级。

层类型 参数量公式 FLOPs 公式 典型值(输入 32×32×3,输出 10 类)
标准卷积(3×3, 64 通道) 3×3×3×64 + 64 = 1792 2×3×3×3×64×30×30 ≈ 3.1M Params: 1.8K, FLOPs: 3.1M
深度可分离卷积(3×3, 64 通道) (3×3×3 + 3) + (3×64 + 64) = 238 2×3×3×3×30×30 + 2×3×64×30×30 ≈ 0.4M Params: 238, FLOPs: 0.4M
最大池化(2×2, 步长 2) 0 ≈ 输入像素数 × 3(比较操作) Params: 0, FLOPs: ≈ 27K
全连接层(输入 1024, 输出 10) 1024×10 + 10 = 10250 2×1024×10 = 20480 Params: 10.2K, FLOPs: 20K

2.4 三大评估指标:FLOPs、MACs 与 Params 的工程含义

在 TinyML 模型选型与部署中,FLOPs、MACs、Params 三个指标各有侧重,不能相互替代。Params 直接决定模型文件在 Flash 中的存储占用,以及运行时权重数据需要占用的 RAM 空间。对于典型 MCU(如 Cortex-M4 或 M7),Flash 容量通常在 256KB 到 2MB 之间,RAM 在 64KB 到 512KB 之间。一个 1MB 的模型文件可能直接超出低端 MCU 的存储上限。FLOPs 则反映模型推理所需的算术运算总量,与推理延迟和动态功耗强相关。在相同硬件条件下,FLOPs 越低,推理速度越快,单位时间内的能量消耗也越低。MACs 与 FLOPs 的关系为 FLOPs = 2 × MACs,因为一次乘加操作(MAC)包含一次乘法和一次加法,在硬件 DSP 指令中通常计为一次操作。

需要特别注意的是,FLOPs 并不直接等同于推理时间。实际推理延迟还受到内存访问带宽、数据复用率、硬件并行度、算子实现效率等因素影响。例如,深度可分离卷积虽然 FLOPs 远低于标准卷积,但其内存访问频率更高,在缺乏优化的 MCU 上可能无法达到理论加速比。因此,在评估模型时,应同时关注 Params(存储压力)和 FLOPs(计算压力),并结合目标硬件的实际 benchmark 结果进行综合判断。

工程经验:在 TinyML 场景下,建议优先关注 Params 是否满足 Flash/RAM 约束,其次关注 FLOPs 是否满足实时性要求。对于电池供电设备,还需结合 MCU 的工作频率和功耗模型,估算单次推理的能量消耗(Energy = FLOPs × 每 FLOP 能耗)。通常,Cortex-M4 系列在 80MHz 下,单次 MAC 操作约需 2-4 个时钟周期,能耗约为 0.5-1 nJ/MAC。

2.5 案例拆解:CIFAR-10 分类模型的复杂度对比

为了直观理解上述指标的实际应用,我们设计一个小型实验:在 CIFAR-10 数据集(32×32×3 输入,10 类输出)上,分别构建三个结构不同但精度相近的 CNN 模型,对比其 Params 与 FLOPs 差异。模型 A 使用两层标准 3×3 卷积(通道数 32→64)+ 全连接层;模型 B 使用两层深度可分离卷积(通道数 32→64)+ 全局平均池化;模型 C 使用一层 5×5 标准卷积(通道数 32)+ 一层 3×3 标准卷积(通道数 64)+ 全局平均池化。

模型 A 的参数量计算:第一层卷积 3×3×3×32 + 32 = 896,第二层卷积 3×3×32×64 + 64 = 18496,展平后特征维度为 8×8×64 = 4096,全连接层参数量为 4096×10 + 10 = 40970,总计约 60K 参数。FLOPs 约为 2×3×3×3×32×30×30 + 2×3×3×32×64×14×14 + 2×4096×10 ≈ 1.55M + 7.24M + 0.08M ≈ 8.87M。模型 B 的参数量:深度可分离卷积第一层 3×3×3 + 3 + 3×32 + 32 = 134,第二层 3×3×32 + 32 + 32×64 + 64 = 2432,全局平均池化无参数,总计约 2.6K 参数。FLOPs 约为 0.4M + 1.2M ≈ 1.6M。模型 C 的参数量:第一层 5×5×3×32 + 32 = 2432,第二层 3×3×32×64 + 64 = 18496,总计约 21K 参数。FLOPs 约为 2×5×5×3×32×28×28 + 2×3×3×32×64×12×12 ≈ 3.76M + 5.31M ≈ 9.07M。

从结果可以看出,模型 B 在保持相近分类精度(约 82% vs 84%)的前提下,参数量仅为模型 A 的 4.3%,FLOPs 仅为模型 A 的 18%。模型 C 虽然参数量比模型 A 少,但由于 5×5 卷积在 32×32 输入上的计算开销较大,FLOPs 反而略高于模型 A。这一案例清晰展示了深度可分离卷积在轻量化方面的巨大优势,也提醒我们:单纯减少参数量并不一定能降低计算量,必须同时关注卷积核尺寸和特征图分辨率对 FLOPs 的影响。

常见误区:许多初学者误以为“参数量越小,模型就越轻量”。实际上,FLOPs 与 Params 是两个正交的维度。例如,一个使用 1×1 卷积的模型可能参数量很小,但如果特征图分辨率很高(如 128×128),其 FLOPs 依然可观。在 TinyML 部署中,应同时评估两者,并针对硬件瓶颈(Flash 不足还是算力不足)进行针对性优化。另外,某些硬件加速器(如 CMSIS-NN)对标准卷积的优化程度高于深度可分离卷积,实际加速比可能达不到理论值,务必以板端实测为准。

2.6 总结与复盘

本章系统梳理了 CNN 三大核心组件的计算特性与复杂度评估方法。卷积层是特征提取的主力,其 FLOPs 与 K²、C_in、C_out、H_out、W_out 五个因素相关,参数量仅与 K²、C_in、C_out 相关;池化层无参数、计算量极低,主要用于空间降维;全连接层参数量巨大,在轻量级网络中应尽量避免或替换为全局平均池化。FLOPs、MACs、Params 三个指标分别从计算量、乘加次数、存储占用三个维度刻画模型复杂度,在 TinyML 场景下需综合考量。