如何在 ImageNet-1K(2012 版本)从零训练 ResNet-34
我使用 PyTorch 从零实现并成功训练了 ResNet-34 模型,在 ImageNet-1K 上达到了原论文的性能:
- 📜 原论文结果:Top-1 准确率约 73.3%,Top-5 准确率约 91.2%
- ✅ 我的复现结果:
Top-1 Accuracy:73.06%
Top-5 Accuracy:91.39%
Test Loss:2.001115(第 92 个 epoch)
当然,能达到原论文水平,少不了时代技术的进步、社区方法的积累,以及 GPT 先生🧑🏫 的鼎力协助。
📄 原论文链接:arXiv:1512.03385
📥 PDF下载:点击查看
💻 我的项目仓库:GitHub - JiJiBo/NasResnet
🎯 模型权重:百度网盘 提取码:koaq
第一步:准备数据集与增强策略
- 使用的是 ImageNet 2012 数据集,约 140G。由于我用的是带数据集的云平台,只需解压即可。
- 数据增强方面,训练集使用了:
AutoAugment
(来自 EfficientNet 的增强策略)RandomResizedCrop
+HorizontalFlip
+RandomErasing
- 测试集只做
Resize
+CenterCrop
,避免增强干扰测试精度。
transform = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
AutoAugment(policy=AutoAugmentPolicy.IMAGENET),
transforms.ToTensor(),
transforms.RandomErasing(p=0.25, scale=(0.02, 0.33)),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])
test_transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
第二步:构建 ResNet-34 模型
- 使用原论文结构,模块包括 BasicBlock、四个层级的残差堆叠,最终是全局平均池化 + FC。
- 所有权重采用 Kaiming 初始化,确保训练更稳定。
模型代码请见:model/resnet_18.py
第三步:训练策略和技巧
为了在 ImageNet 上稳定训练 ResNet-34,我引入了大量现代技巧:
类别 | 技术 |
---|---|
优化器 | SGD + Momentum (0.9),Weight Decay 1e-4 |
学习率策略 | StepLR,epoch=[30, 60, 90, 100, 110] 降 LR |
初始化 | Kaiming 正态初始化 |
数据增强 | Mixup(前 50 epoch 生效)、AutoAugment、Random Erasing |
损失函数 | CrossEntropyLoss + Label Smoothing (0.1) |
梯度控制 | 梯度裁剪(max_norm=3.0 ) |
复现控制 | 设置固定随机种子,确保结果一致 |
训练日志 | TensorBoard 全记录,包括 loss、acc、LR、测试精度等 |
每个 epoch 大概耗时 20 分钟,约1天多可得较好结果。
最终结果如下(第 95 个 epoch):
Epoch 95: Top-1 Accuracy: 73.11% | Top-5 Accuracy: 91.39% | Test Loss: 1.999415
写在最后
训练过程中,我大量参考了原论文,同时结合 GPT 提供的建议,尝试了多种现代策略。不得不说,读原论文 + GPT 辅助探索
是非常高效的方式。但也要警惕 GPT 有时“犯迷糊”,关键点还得靠自己判断和实证。
如果你也想复现 ResNet,或者在 ImageNet 上训练自己的模型,我的这份工程代码和经验总结应该能帮到你。
欢迎提 Issue、PR 或交流想法,一起精进。