CNN图像分类实践:对比三模型及不同结构参数的影响(基于CIFAR-10数据集)
PyTorch | CIFAR-10 |
我这里是用CPU训练的,速度较慢。有独立显卡且追求速度的可以用独立显卡训练,但注意下载显卡版本的PyTorch库(实际库名称为:torch而非pytorch这点请注意),cpu版本有200mb大小,但GPU版本有2gb大小。
注意!如果使用NIVIDIA显卡需要PyTorch与CUDA(英伟达AI训练驱动)的版本匹配。
一、实验设定
1.1 数据集
CIFAR-10,50000张训练、10000张测试,10类32×32彩色图像。
1.2 数据预处理
两个模型使用相同的增强与归一化:
| 步骤 | 训练集 | 测试集 |
|---|---|---|
| 数据增强 | RandomCrop(32, padding=4) + RandomHorizontalFlip | 无 |
| 归一化 | 自建模型用CIFAR-10统计量,迁移学习用ImageNet统计量 | 同训练集 |
1.3 实验设计
三个实验并非孤立运行,而是按照"发现问题→对比验证→改进"的逻辑串联。每条改进都有对应的A/B对比在第三节呈现。
二、模型结构
2.1 SimpleCNN(基线)
Conv(3→32, 3) → BN → ReLU → MaxPool(2) # 32→16
Conv(32→64, 3) → BN → ReLU → MaxPool(2) # 16→8
Conv(64→128, 3) → BN → ReLU → MaxPool(2) # 8→4
FC(128×4×4 → 10)
三层卷积+池化+FC,参数量约10万。Adam,lr=0.001,10 epochs。
SimpleCNN模型的训练及预测


2.2 LeNet-5 —— 从经典到实用
LeNet-5诞生于1998年,最初为MNIST灰度手写数字设计——只有6和16个卷积核。
| 版本 | 卷积核数 | BN | Dropout | Pooling | Epochs | 调度器 | 准确率 |
|---|---|---|---|---|---|---|---|
| 窄版 | 6, 16 | 无 | 无 | AvgPool | 20 | 无 | ~61% |
| 中版 | 6, 16 | 有 | 0.3 | AvgPool | 30 | StepLR | ~65% |
| 宽版 | 32, 64 | 有 | 0.3 | MaxPool | 20 | StepLR | 78.8% |
宽版结构:
Conv(3→32, 5) → BN → ReLU → MaxPool(2) # 32→14
Conv(32→64, 5) → BN → ReLU → MaxPool(2) # 14→5
FC(64×5×5→120) → BN → ReLU → Dropout(0.3)
FC(120→84) → BN → ReLU → Dropout(0.3)
FC(84→10)
参数量约40万。Adam,lr=0.001,StepLR(step_size=5, gamma=0.5)。
核心结论:加BN只有+4%的边际收益,加宽直接+13.8%,说明LeNet面对CIFAR-10的瓶颈从来不是训练问题,而是容量问题。6个卷积核扫过32×32×3的图像,网眼太大,根本兜不住有效特征。
2.3 ResNet18 迁移学习
conv1 → bn1 → layer1 → layer2 → layer3 → layer4 → fc
替换fc为512→10。两种冻结策略的对比:
| 策略 | 冻结范围 | 可训练范围 | 分组学习率 | 准确率 |
|---|---|---|---|---|
| 全冻结 | 全部预训练层 | 仅fc | 无 | ~40% |
| 仅冻结layer1 | conv1, bn1, layer1 | layer2, layer3, layer4, fc | 预训练1e-4 / fc 1e-3 | 72.1% |
SGD(momentum=0.9),15 epochs,StepLR。
三、对比实验:改了什么,效果如何
对比1:归一化用错 vs 用对(ResNet18)
最隐蔽的坑。两个归一化方案的数值差异不到0.03,后果却天差地别:
| 归一化来源 | mean | std | 测试准确率 |
|---|---|---|---|
| CIFAR-10 | (0.4914, 0.4822, 0.4465) | (0.2023, 0.1994, 0.2010) | ~40% |
| ImageNet | (0.485, 0.456, 0.406) | (0.229, 0.224, 0.225) | 72.1% |
差异 +32.1%。CIFAR-10均值比ImageNet高约0.01,标准差低约0.025。这点偏差足以把输入值域从预训练权重习惯的范围推出去,特征完全失效。规则很简单:预训练权重从哪来,归一化就用谁的统计量。
对比2:LeNet三版迭代
| 版本 | 关键改动 | 准确率 | 提升 |
|---|---|---|---|
| 窄版 | 原始LeNet-5 (6/16核) | 61.0% | — |
| 中版 | +BN + Dropout(0.3) + 30轮 | 65.0% | +4.0% |
| 宽版 | 6→32/16→64核 + MaxPool + 20轮 | 78.8% | +13.8% |
BN和Dropout只带来4%的提升,说明原版LeNet的训练稳定性并不是主要矛盾。一旦把卷积核加宽5倍,同样的20轮,准确率跳涨13.8%。这就是"网眼太小兜不住特征"的最好证明。
对比3:全冻结 vs 仅冻结layer1(ResNet18)
| 冻结策略 | 可训练层 | 准确率 |
|---|---|---|
| 全冻结 | 仅fc | ~40% |
| 仅冻结layer1 | layer2/3/4 + fc + 分组学习率 | 72.1% |
从40%到72.1%,+32.1%的提升来自两个因素的叠加:开放中高层+分组学习率。layer1处理的是最底层的边缘、纹理特征,ImageNet和CIFAR-10差异最小,冻结它是安全的。但layer4的高层语义与分类任务强相关,必须微调。

对比4:三模型横评

| 模型 | 类型 | 参数量 | 测试准确率 | 训练时间 |
|---|---|---|---|---|
| SimpleCNN | 从零训练 | ~10万 | 79.8% | 5.6 min |
| LeNet-5(宽版) | 从零训练 | ~40万 | 78.8% | 8.6 min |
| ResNet18(迁移学习) | 微调 | ~1100万 | 72.1% | 43.0 min |
三个最出乎意料的地方:
- SimpleCNN拿了第一。10万参数的轻量网络(ResNet18的1/110),准确率79.8%,比迁移学习高了7.7个百分点。
- LeNet宽版几乎追平SimpleCNN。一个1998年的架构,只靠加宽卷积核就从61%冲到78.8%,老架构不算过时。
- ResNet18垫底且耗时最长。1100万参数的模型在CIFAR-10上被两个小网络反超,训练时间却是它们的5-8倍。
这组结果对"迁移学习一定更强"的直觉是一个有力的纠正。当源域(ImageNet 224×224, 1000类)和目标域(CIFAR-10 32×32, 10类)差异过大时,一个从头设计的小网络可能更高效。如果要在CIFAR-10上真正发挥ResNet18的实力,可以考虑不冻结任何预训练层、增加训练轮数、或者换用更契合CIFAR-10尺寸的预处理(如去掉第一个7×7卷积和maxpool)。
四、关键经验
- 迁移学习先对齐归一化:预训练权重的mean/std是哪来的就用哪一套,没有例外。
- LeNet的瓶颈是容量,不是训练:加BN +4%,加宽 +13.8%,后者才是命门。
- 冻结不是二选一:底层冻结+中高层微调+分组学习率,40%→72%。
- 参数量不等于性能:10万参数的SimpleCNN赢了1100万参数的ResNet18。
- "加宽"是应对小数据集的最廉价优化:不需要改架构,不需要加层,只改卷积核数量,LeNet就从不及格变成优秀
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)