我有一个关于微调和转移学习的一般问题,当我试图弄清楚如何最好地让Yolo检测我的自定义对象(是手)时,它就会出现。
我对包含许多虚假信息的长期文字表示歉意。如果有人有耐心阅读并帮助我清除自己的困惑,我会很高兴。
经过大量谷歌搜索,我了解到许多人认为微调是转移学习的子类,而其他人则认为他们是培训模型的不同方法。同时,人们区分了自定义数据集上的模型的最后一个分类器层与还重新训练模型的其他层(并且可能添加了一个en含有新的新分类器而不是重新培训?)。两种方法都使用预训练的模型。
我的最后一口气位于这里:我遵循以下说明: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
但是这里发生了什么?我想我只会重新训练分类器,因为指令说要更改配置文件中最后一层的类数。但是话又说回来,也需要在第二层(卷积层)中更改过滤器数量。
最后,这些说明提供了一个替代培训的示例: # Completely initialize yolo-new and train it with ADAM optimizer
flow --model cfg/yolo-new.cfg --train --trainer adam
,我根本不明白这与转移学习的不同方式之间的关系。
如果您使用的是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-to-improve-object-detection,https://groups.google.com/forum/forum/# !! topic/darknet/darknet/mkkkqrjulpdu
我尚未从事YOLO的工作,但是看您的问题,我认为我可以提供帮助。微调,重新训练,调节后都是歧义的术语,通常可以互换使用。这一切都是关于要更改预训练的重量的数量。由于您在第一种情况下使用--load
加载重量,因此在此处加载了预训练的权重 - 这可能意味着您正在以低学习率或根本无法更改它们的重量。但是,在第二种情况下,您没有加载任何权重,因此您可能正在从头开始训练它。因此,当您进行少量更改时,将其称为微调,在初次培训后会再次调整调整后,也许不像微调和再培训那样细,然后再训练整个网络或零件
将有单独的方式可以选择冻结一些图层。