本文主要比较在Cifar10数据集上从零开始训练ResNet50网络和使用预训练参数(load imagenet pretrained weight)训练ResNet50网络的异同。
运行环境(在下面的环境中测试通过):
- Python = 3.7.9 64bit
- Paddle GPU = 2.0.1 安装命令:conda install paddlepaddle-gpu==2.0.1 cudatoolkit=10.0 -c paddle
- OS = Windows10 64bit
测试结果:
比较项 | 从零开始训练, 手动建模 | 从零开始训练, 使用模型库 | 使用预训练参数 |
---|---|---|---|
Batch size | 256 | 256 | 256 |
Epochs | 20 | 20 | 10 |
eval_freq | 5 | 5 | 2 |
测试数据集上的精度 | 76.71% | 78.08% | 88.99% |
结论:
- 若是学生,推荐手动编写ResNet,这样可以加深对模型的理解;虽然有好的轮子,也要自己造一造,通过造轮子来加深对知识的理解。
- 若是做项目的工程师,推荐使用深度学习框架模型库里面的模型,好处是bugs少。若分类对象跟ImageNet图像类似,可以直接使用预训练参数,这样训练时间少,模型精度高,更加适合工程应用。
- 工程应用尽量避免造轮子,因为造轮子的过程中大概率会引入bug,还需要花很多时间精力进行调优,最终结果也不如现成的轮子好用。
- 若有自己的大型数据集和GPU集群,比如:3亿人脸,可以不断优化业务方向上的预训练参数。在业务落地的过程中,高精度的预训练参数,直接影响项目交付的质量和速度。