蝴蝶分类(Butterfly Classification)

作者:欧新宇(Xinyu OU)

本文档所展示的测试结果,均运行于:Intel Core i7-7700K CPU 4.2GHz, nVidia GeForce GTX 1080 Ti

最后更新:2021年2月19日


一、使用ResNet50模型进行训练

深度学习的训练包括四种模式:

  1. 从初始状态开始训练。即使用随机初始化的方法对模型的参数进行初始化,并开始训练
  2. 使用Imagenet预训练模型进行训练。Imagenet是一个包含130M数据量数据集,使用Imagenet数据集进行预训练的模型进行迁移学习可以有效提高训练的速度和准确度,即Imagenet预训练模型能更好地对模型进行参数初始化。
  3. 使用自定义预训练模型进行训练。对于一些特殊的数据集,我们可以自行使用较大的数据集进行预训练。然后,将训练好的模型迁移到类似的数据集进行微调训练。
  4. 从中断模型开始训练。在对较大、较复杂的数据进行训练的时候,有可能会因为各种原因发生训练中断的问题,从而需要恢复训练;或在使用启发式训练(loss平稳时进行手动)的过程中需要手动进行参数调整,此时需要对训练过程进行中断,并在调整参数后进行恢复训练。

下面的训练代码中,将同时实现以上四种训练模式。

1.1 标准训练模式

trainval.py

1.2 使用高层API接口进行训练

使用高层API接口进行训练代码简单,而且容易理解。但因为代码被封装,因此对于过程的分析不如标准框架清晰,需要借助于其他第三方接口,例如Paddle DL。

trainvalAPI.py

1.3 基于训练好的模型(高层API接口)直接对验证集和测试集进行评估

1.3.1 验证集准确率

1.3.2 测试集准确率

1.3.3 输出预测结果

使用paddle的高层API接口model.predict进行预测。该方法比较代码比较简单,但通常进行预测的时候都是使用部署模型进行评估,因此建议参考三、测试集评估部分,并使用部署模型进行。

二、验证集和测试集评估

2.1 (推荐)使用调优模型进行评估(可以在训练中进行调用)

eval.py

2.2 使用高层API接口在调优模型上进行评估

基于Paddle高层进行计算的代码相对简单,但是存在一个问题。接口输出的loss是基于patch的,而非整个验证集,因此数据会存在一定的偏差。这种偏差是由于计算方法带来,因此在实际应用中,如果所有的样本和方法都是用相同的计算方法影响不大。但是对于不同的模型,可能因为各种原因设置不同的batch_size,这时,所获得的loss就不具备可比性了。 因此,在进行多模型的对比评价的时候,建议使用拆解的代码结构进行书写。
同时,建议尽量使用单样本loss进行多模型对比。

evalAPI.py

2.3 使用部署模型进行评估

部署模型不包含优化器参数因此容量较小,但对验证集的评估通常都在实验室中完成,同时为了简化代码,期望可以被训练的代码复用,因此一般会采用基于调优模型进行编写。因此,推荐使用 2.1节(推荐)使用调优模型对验证集进行评估的代码,对验证集进行评估。

同时,基于部署模型的代码可以使用对测试集的代码进行复用。

evalDeployed.py