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个卷积核。

版本卷积核数BNDropoutPoolingEpochs调度器准确率
窄版6, 16AvgPool20~61%
中版6, 160.3AvgPool30StepLR~65%
宽版32, 640.3MaxPool20StepLR78.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%
仅冻结layer1conv1, bn1, layer1layer2, layer3, layer4, fc预训练1e-4 / fc 1e-372.1%

SGD(momentum=0.9),15 epochs,StepLR。


三、对比实验:改了什么,效果如何

对比1:归一化用错 vs 用对(ResNet18)

最隐蔽的坑。两个归一化方案的数值差异不到0.03,后果却天差地别:

归一化来源meanstd测试准确率
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%
仅冻结layer1layer2/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 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐