【YOLO】之理解预训练和微调

问题描述:在阅读YOLO论文的时候,总是出现预训练(pretraining)以及微调(fine tuning)。那么问题来了:

  1. 预训练是什么?为什么要用预训练?怎样预训练?
  2. 微调是什么?为什么要用微调?怎样微调?

(一)查询了网上的一些理解:
参考链接:https://blog.csdn.net/abc13526222160/article/details/89320108?depth_1-

  1. 什么是预训练和微调?
    你需要搭建一个网络模型来完成一个特定的图像分类的任务。首先,你需要随机初始化参数,然后开始训练网络,不断调整直到网络的损失越来越小。在训练的过程中,一开始初始化的参数会不断变化。当你觉得结果很满意的时候,你就可以将训练模型的参数保存下来,以便训练好的模型可以在下次执行类似任务时获得较好的结果。这个过程就是 pre−training。

    之后,你又接收到一个类似的图像分类的任务。这时候,你可以直接使用之前保存下来的模型的参数来作为这一任务的初始化参数,然后在训练的过程中,依据结果不断进行一些修改。这时候,你使用的就是一个 pre−trained模型,而过程就是 finetuning。

    所以,预训练 就是指预先训练的一个模型或者指预先训练模型的过程;微调 就是指将预训练过的模型作用于自己的数据集,并使参数适应自己数据集的过程。

  2. 预训练和微调的作用
    在 CNN领域中,实际上,很少人自己从头训练一个 CNN网络。主要原因是自己很小的概率会拥有足够大的数据集,基本是几百或者几千张,不像 ImageNet有 1200 万张图片这样的规模。拥有的数据集不够大,而又想使用很好的模型的话,很容易会造成过拟合。

    所以,一般的操作都是在一个大型的数据集上(ImageNet)训练一个模型,然后使用该模型作为类似任务的初始化或者特征提取器。比如 VGG,Inception等模型都提供了自己的训练参数,以便人们可以拿来微调。这样既节省了时间和计算资源,又能很快的达到较好的效果。


(二)个人理解(小白级解释):

  1. 首先,为什么使用预训练呢?因为自己的数据集规模不够大,一般只有几百张,数千张,直接应用这些数据训练一个网络,效果可能不太好,训练的模型参数可能不是最优的,容易产生过拟合问题。故提出一种思路,先在 ImageNet 上预训练,当预训练效果比较好时,将训练模型的参数保存下来,再训练自己的数据集。为什么呢?因为 ImageNet有 1200 万张图片,拥有足够大的数据集,方便达到最好的训练效果。为什么要用训练模型参数呢?因为预训练的结果是比较好的,参数也是最优的,使用预训练模型的参数具有一定的参考意义。
  2. 然后,什么是微调?微调就是微调预训练模型的参数,以适应自己数据集的训练。为什么要微调呢?毕竟每个人的数据集不一样,个人需求也不一样(有的要求速度快,有的要求精度高),个人硬件配置不一样,故微调是根据自己的实际情况而定。
  3. 最后,当训练完自己的数据集以后,就可以检测了,预测物体的位置和类别。

我们在训练自己的数据集时,直接微调训练模型(VGG,Resnet,darknet等等)即可,不需要预训练,直接下载预训练模型(当然也可以直接训练)。预训练的计算量很大,也非常耗时。

再比如,YOLOv3训练自己的数据集时,在Imagenet上预训练好的模型参数(darknet53.conv.74,大小76MB)基础上继续训练。
darknet53.conv.74下载链接: https://pjreddie.com/media/files/darknet53.conv.74,下载完成后放在darknet主目录。
也可以直接在darknet目录下通过wget命令下载:

wget https://pjreddie.com/media/files/darknet53.conv.74

附:YOLOv1论文训练部分原文叙述。
【YOLO】之理解预训练和微调_第1张图片

你可能感兴趣的:(深度学习,机器学习,深度学习,python,人工智能)