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模型的训练及预测

SimpleCNN

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%。这就是"网眼太小兜不住特征"的最好证明。
lenet训练曲线

对比3:全冻结 vs 仅冻结layer1(ResNet18)

冻结策略 可训练层 准确率
全冻结 仅fc ~40%
仅冻结layer1 layer2/3/4 + fc + 分组学习率 72.1%

从40%到72.1%,+32.1%的提升来自两个因素的叠加:开放中高层+分组学习率。layer1处理的是最底层的边缘、纹理特征,ImageNet和CIFAR-10差异最小,冻结它是安全的。但layer4的高层语义与分类任务强相关,必须微调。
resnet18训练曲线

ResNet18预测

对比4:三模型横评

三种模型对比

模型 类型 参数量 测试准确率 训练时间
SimpleCNN 从零训练 ~10万 79.8% 5.6 min
LeNet-5(宽版) 从零训练 ~40万 78.8% 8.6 min
ResNet18(迁移学习) 微调 ~1100万 72.1% 43.0 min

三个最出乎意料的地方:

  1. SimpleCNN拿了第一。10万参数的轻量网络(ResNet18的1/110),准确率79.8%,比迁移学习高了7.7个百分点。
  2. LeNet宽版几乎追平SimpleCNN。一个1998年的架构,只靠加宽卷积核就从61%冲到78.8%,老架构不算过时。
  3. ResNet18垫底且耗时最长。1100万参数的模型在CIFAR-10上被两个小网络反超,训练时间却是它们的5-8倍。

这组结果对"迁移学习一定更强"的直觉是一个有力的纠正。当源域(ImageNet 224×224, 1000类)和目标域(CIFAR-10 32×32, 10类)差异过大时,一个从头设计的小网络可能更高效。如果要在CIFAR-10上真正发挥ResNet18的实力,可以考虑不冻结任何预训练层、增加训练轮数、或者换用更契合CIFAR-10尺寸的预处理(如去掉第一个7×7卷积和maxpool)。


四、关键经验

  1. 迁移学习先对齐归一化:预训练权重的mean/std是哪来的就用哪一套,没有例外。
  2. LeNet的瓶颈是容量,不是训练:加BN +4%,加宽 +13.8%,后者才是命门。
  3. 冻结不是二选一:底层冻结+中高层微调+分组学习率,40%→72%。
  4. 参数量不等于性能:10万参数的SimpleCNN赢了1100万参数的ResNet18。
  5. "加宽"是应对小数据集的最廉价优化:不需要改架构,不需要加层,只改卷积核数量,LeNet就从不及格变成优秀
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐