训练暗网立即完成
Training darknet finishes immediately
我想用yolo架构做物体检测。在用我的自定义数据训练网络之前,我按照以下步骤在 Pascal VOC 数据上训练它:https://pjreddie.com/darknet/yolo/
说明很清楚。
但是在最后一步之后
./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
暗网立即停止训练并宣布权重已写入backups/
目录
一开始以为预训练太好了,一下子就达到了停止条件。
所以我在其中一张测试图像 data/dog
上使用了带有这些权重的 ./darknet detect
命令。什么都找不到。
如果我不使用任何预训练的权重,网络会进行训练。
我编辑了 cfg/yolo-voc.cfg 以使用
# Testing
#batch=1
#subdivisions=1
# Training
batch=32
subdivisions=8
现在训练过程已经运行了好几个小时,让我的 GPU 保持温暖。
这是训练暗网的预期方式吗?
我怎样才能正确使用预训练的权重,而不会中断训练?
是否有创建检查点或了解进度的设置?
这是一个老问题,所以我希望你现在已经有了答案,但这里是我的,以防万一它有帮助。
在使用暗网大约一个月后,我 运行 解决了人们在论坛上 asked/posted 遇到的大多数障碍。在你的情况下,我很确定这是因为权重已经针对最大批数进行了训练,并且当在暗网中读取预训练的权重时假设训练已经完成。
相关个人经验:当我使用其中一个预训练的权重文件时,它从迭代 40101 和 运行 开始直到 40200 才切断。
如果您有自定义数据,我会坚持从头开始训练,但如果您想再次尝试预训练的权重,您可能会发现更改 cfg 文件中的最大批次会有所帮助。
在训练命令的末尾添加 -clear 1
将清除该模型在之前训练中看到的图像数量的统计数据。然后您可以根据新数据(集)微调您的模型。
您可以在函数签名中找到有关用法的更多信息
void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear)
在 https://github.com/pjreddie/darknet/blob/b13f67bfdd87434e141af532cdb5dc1b8369aa3b/examples/detector.c
我怀疑增加最大迭代次数是个好主意,因为学习率通常与当前的迭代次数有关。当我们想要恢复之前因达到最大迭代次数而结束的训练任务时,我们通常会增加最大迭代次数,但我们相信随着迭代次数的增加,它会给出更好的结果。
仅供参考,当你有一个小数据集时,从头开始或从分类网络对其进行训练可能不是一个好主意。您可能仍想重复使用在 Coco 或 ImageNet 等大型数据集上训练的检测网络的权重。
此外,如果使用 AlexeyAB/darknet,他们可能会遇到 -clear 选项问题,
在 detector.c:
if (clear) *nets[k].seen = 0
真的应该是:
if (clear) {*nets[k].seen = 0;*nets[k].cur_iteration = 0;}
否则训练循环将立即退出。
将你darknet/Makefile中的OpenCV编号修改为0
OpenCV=0
我想用yolo架构做物体检测。在用我的自定义数据训练网络之前,我按照以下步骤在 Pascal VOC 数据上训练它:https://pjreddie.com/darknet/yolo/
说明很清楚。 但是在最后一步之后
./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
暗网立即停止训练并宣布权重已写入backups/
目录
一开始以为预训练太好了,一下子就达到了停止条件。
所以我在其中一张测试图像 data/dog
上使用了带有这些权重的 ./darknet detect
命令。什么都找不到。
如果我不使用任何预训练的权重,网络会进行训练。 我编辑了 cfg/yolo-voc.cfg 以使用
# Testing
#batch=1
#subdivisions=1
# Training
batch=32
subdivisions=8
现在训练过程已经运行了好几个小时,让我的 GPU 保持温暖。
这是训练暗网的预期方式吗? 我怎样才能正确使用预训练的权重,而不会中断训练?
是否有创建检查点或了解进度的设置?
这是一个老问题,所以我希望你现在已经有了答案,但这里是我的,以防万一它有帮助。
在使用暗网大约一个月后,我 运行 解决了人们在论坛上 asked/posted 遇到的大多数障碍。在你的情况下,我很确定这是因为权重已经针对最大批数进行了训练,并且当在暗网中读取预训练的权重时假设训练已经完成。
相关个人经验:当我使用其中一个预训练的权重文件时,它从迭代 40101 和 运行 开始直到 40200 才切断。
如果您有自定义数据,我会坚持从头开始训练,但如果您想再次尝试预训练的权重,您可能会发现更改 cfg 文件中的最大批次会有所帮助。
在训练命令的末尾添加 -clear 1
将清除该模型在之前训练中看到的图像数量的统计数据。然后您可以根据新数据(集)微调您的模型。
您可以在函数签名中找到有关用法的更多信息
void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear)
在 https://github.com/pjreddie/darknet/blob/b13f67bfdd87434e141af532cdb5dc1b8369aa3b/examples/detector.c
我怀疑增加最大迭代次数是个好主意,因为学习率通常与当前的迭代次数有关。当我们想要恢复之前因达到最大迭代次数而结束的训练任务时,我们通常会增加最大迭代次数,但我们相信随着迭代次数的增加,它会给出更好的结果。
仅供参考,当你有一个小数据集时,从头开始或从分类网络对其进行训练可能不是一个好主意。您可能仍想重复使用在 Coco 或 ImageNet 等大型数据集上训练的检测网络的权重。
此外,如果使用 AlexeyAB/darknet,他们可能会遇到 -clear 选项问题, 在 detector.c:
if (clear) *nets[k].seen = 0
真的应该是:
if (clear) {*nets[k].seen = 0;*nets[k].cur_iteration = 0;}
否则训练循环将立即退出。
将你darknet/Makefile中的OpenCV编号修改为0
OpenCV=0