4、图像分类基础:卷积神经网络(CNN)核心概念、经典分类模型对比与计算量分析
各位同学,欢迎来到第四讲。今天咱们聊点硬核的——CNN的核心概念,以及几个经典分类模型的对比。说实话,这部分内容是我在部署模型时踩坑最多的地方。你想想看,一个模型在服务器上跑得飞起,到了边缘设备上却卡成PPT,这种痛,我太懂了。
所以这节课,我会把CNN的底裤扒干净,再带你们看看ResNet、MobileNet、EfficientNet到底谁更“香”。
4.1 卷积神经网络核心概念
CNN说白了就是一套“特征提取器”。它不像全连接网络那样一股脑把所有像素拉平,而是保留空间结构,用卷积核去扫描图像。我个人习惯把卷积核想象成一个小窗口,它在图像上滑动,每次只关注一小块区域。
4.1.1 卷积层
卷积操作的核心是“局部连接”和“权值共享”。什么意思?
- 局部连接:每个神经元只连接输入的一小块区域,而不是全图。这大大减少了参数量。
- 权值共享:同一个卷积核在整个图像上滑动,参数是相同的。你想想看,如果每个位置都用不同的参数,那模型得有多大?
举个例子,一个3x3的卷积核,只有9个权重加1个偏置。就这么点参数,就能提取出边缘、纹理等特征。我在项目中遇到过一个问题:有人把卷积核设得特别大(比如7x7),结果模型参数爆炸,边缘设备根本跑不动。嗯,这里要注意,边缘设备上尽量用3x3或1x1的小卷积核。
4.1.2 池化层
池化层的作用是“降采样”。说白了就是缩小特征图的尺寸,同时保留最重要的信息。常用的有最大池化和平均池化。
为什么需要池化?因为卷积层输出的特征图太大了,直接丢给全连接层,参数量会爆炸。池化还能带来一定的平移不变性——图像稍微偏移一点,池化结果变化不大。
4.1.3 激活函数
激活函数给网络引入非线性。没有它,再深的网络也只是线性变换的堆叠,表达能力有限。
常用的有ReLU、Sigmoid、Tanh。在边缘设备上,我强烈推荐ReLU及其变体(如Leaky ReLU)。为什么?因为ReLU计算简单,没有指数运算,而且能缓解梯度消失问题。
4.2 经典分类模型对比
接下来咱们看看三个经典模型:ResNet、MobileNet、EfficientNet。它们各有千秋,适合不同的场景。
4.2.1 ResNet:残差学习的里程碑
ResNet的核心创新是“残差连接”。说白了,就是让网络学习“残差”而不是直接学习映射。为什么这很重要?因为随着网络加深,梯度消失问题越来越严重。残差连接让梯度可以直接回传到浅层,从而训练更深的网络。
ResNet的典型结构是“瓶颈块”(Bottleneck Block):先用1x1卷积降维,再用3x3卷积提取特征,最后用1x1卷积升维。这种设计在参数量和计算量之间取得了很好的平衡。
我个人习惯在边缘设备上使用ResNet-18或ResNet-34。ResNet-50虽然精度更高,但参数量太大,不适合实时推理。
4.2.2 MobileNet:轻量化的典范
MobileNet专为移动和嵌入式设备设计。它的核心是“深度可分离卷积”。
普通卷积的计算量是:输入通道数 × 输出通道数 × 卷积核大小 × 特征图大小。而深度可分离卷积把它拆成了两步:
- 深度卷积:每个输入通道单独做卷积,不跨通道。
- 逐点卷积:用1x1卷积跨通道融合。
这样一拆,计算量直接降到原来的1/8到1/9。我在项目中用MobileNetV2部署到树莓派上,推理速度能达到30fps以上,精度损失却不到2%。
4.2.3 EfficientNet:精度与效率的平衡
EfficientNet的核心是“复合缩放”。它同时缩放网络的深度、宽度和分辨率,而不是只调一个维度。为什么这样更好?因为这三个维度是相互影响的——增加深度需要更宽的网络来承载,提高分辨率需要更深的网络来提取细节。
EfficientNet-B0是基线模型,参数量只有5.3M,但ImageNet Top-1精度达到了77.1%。EfficientNet-B7参数量增加到66M,精度却达到了84.3%。
不过要注意,EfficientNet在边缘设备上并不总是最优选择。它的计算量虽然比同精度的ResNet小,但结构复杂,推理时内存访问开销大。我在Jetson Nano上测试过,EfficientNet-B0的推理速度还不如MobileNetV3。
4.3 模型参数量与计算量分析
这部分是部署的关键。参数量决定模型大小,计算量决定推理速度。咱们用两个指标来衡量:
- 参数量(Params):模型有多少个可训练参数。单位通常是M(百万)。
- 计算量(FLOPs):模型进行一次前向推理需要多少次浮点运算。单位通常是G(十亿)。
下面是我整理的几个经典模型的对比数据:
| 模型 | 参数量(M) | 计算量(GFLOPs) | ImageNet Top-1 精度 |
|---|---|---|---|
| ResNet-18 | 11.7 | 1.8 | 69.8% |
| ResNet-50 | 25.6 | 4.1 | 76.2% |
| MobileNetV2 | 3.5 | 0.3 | 71.8% |
| MobileNetV3-Large | 5.4 | 0.2 | 75.2% |
| EfficientNet-B0 | 5.3 | 0.4 | 77.1% |
| EfficientNet-B3 | 12.0 | 1.8 | 81.1% |
从表中可以看出:
- MobileNetV2的参数量和计算量都是最小的,适合资源极度受限的设备。
- EfficientNet-B0在参数量和计算量上都优于ResNet-18,但精度更高。
- ResNet-50虽然精度高,但计算量是MobileNetV2的13倍以上,不适合实时推理。
- 设备算力极低(如MCU):选MobileNetV2或MobileNetV3-Small。
- 设备算力中等(如树莓派):选MobileNetV3-Large或EfficientNet-B0。
- 设备算力较强(如Jetson Nano):选ResNet-18或EfficientNet-B3。
最后,我想强调一点:参数量和计算量不是唯一的衡量标准。实际部署时,还要考虑内存带宽、缓存命中率、算子优化程度等因素。我曾经在某个项目上,明明选了个计算量最小的模型,结果推理速度反而比另一个模型慢。后来发现,是因为那个模型的内存访问模式不友好,导致缓存频繁失效。
所以,选模型时别只看纸面数据,一定要在目标设备上实际跑一下。嗯,这就是经验之谈。
好了,这节课就到这里。下节课咱们会讲模型压缩与量化,到时候我会分享一些我在实际项目中用到的“黑科技”。