以YOLO为例进行微调和迁移学习

Fine-tuning and transfer learning by the example of YOLO

我有一个关于微调和迁移学习的一般性问题,当我试图找出如何最好地让 yolo 检测我的自定义对象(手)时出现了这个问题。

对于可能包含大量虚假信息的长文本,我深表歉意。如果有人有耐心阅读它并帮助我解决我的困惑,我会很高兴。

经过大量谷歌搜索,我了解到许多人认为微调是迁移学习的子class,而其他人则认为他们使用不同的方法来训练模型。同时,人们区分仅在自定义数据集上重新训练模型的最后 class 层与同时重新训练模型的其他层(并可能添加一个全新的 classifier 而不是再培训?)。两种方法都使用预训练模型。

我最后的困惑在于:我遵循了这些说明:https://github.com/thtrieu/darkflow 使用以下命令通过 darkflow 训练微型 yolo:

# Initialize yolo-new from yolo-tiny, then train the net on 100% GPU: flow --model cfg/yolo-new.cfg --load bin/tiny-yolo.weights --train --gpu 1.0 但是这里发生了什么?我想我只重新训练 classifier 因为说明说要更改配置文件最后一层中 classes 的数量。不过话又说回来,倒数第二层,也就是卷积层,也需要改变filter的个数。

最后,说明提供了替代培训的示例: # Completely initialize yolo-new and train it with ADAM optimizer flow --model cfg/yolo-new.cfg --train --trainer adam 我完全不明白这与不同的迁移学习方式有何关系。

我没有在 YOLO 上工作过,但看看你的问题,我想我可以提供帮助。微调、重新训练、post-调整都是有些模棱两可的术语,经常互换使用。这完全取决于你想改变多少预训练的权重。 由于您在第一种情况下使用 --load 加载权重,因此此处加载了预训练的权重 - 这可能意味着您正在以较低的学习率调整权重,或者可能根本不改变它们。然而,在第二种情况下,你没有加载任何重量,所以你可能是从头开始训练它。因此,当您进行小(精细)更改时,称之为微调,post-调整将在初始训练后再次调整,可能不如微调和再训练那么精细,然后再训练整个网络或再次分手

您可以通过不同的方式随意冻结某些图层。

如果您使用的是 AlexeyAB 的 darknet repo(不是 darkflow),他建议通过在 cfg 文件中设置此参数来进行微调而不是迁移学习:stopbackward=1 .

然后输入./darknet partial yourConfigFile.cfg yourWeightsFile.weights outPutName.LastLayer# LastLayer#如:

./darknet partial cfg/yolov3.cfg yolov3.weights yolov3.conv.81 81

它将创建 yolov3.conv.81 并冻结下层,然后您可以使用权重文件 yolov3.conv.81 代替原始 darknet53.conv.74 进行训练。

参考资料:https://github.com/AlexeyAB/darknet#how-to-improve-object-detection , https://groups.google.com/forum/#!topic/darknet/mKkQrjuLPDU