我已经使用Tensorflow的对象检测Api使用自定义数据集训练了一个更快的rcnn模型。随着时间的推移,我想继续使用其他图像(每周收集一次)更新模型。目标是优化准确性并随着时间推移对新图像进行加权。
以下是一些替代方案:
这是我的想法: 选项1:比较耗时,但是所有图片都将被“平等地”对待。
选项2:希望减少额外的训练时间,但一个问题是该算法可能会对较早的图像进行更多加权。
选项3:这似乎是最好的选择。采用原始模型,只专注于培训新事物。
其中之一明显更好吗?每种优点/缺点是什么?
此外,我想知道保留一个测试集作为准确性的控制还是每次创建一个包含新图像的新测试是更好的选择。也许将一部分新图像添加到模型中,再将另一部分添加到测试集中,然后将较旧的测试集图像反馈到模型中(或将其丢弃)?
答案 0 :(得分:1)
考虑您的数据集接近完美的情况。如果您在新图像上运行模型(每周收集一次),那么结果(即带有分数的框)将恰好是您希望从模型中获得的结果,将它们添加到数据集将毫无意义,因为模型不会学习任何新知识
对于不完善的数据集,新图像的结果将显示(一些)错误,这些都适合进行进一步的训练。但是数据集中可能已经存在“不良”图像,因此最好将其删除。这表明选项1必须按一定时间表发生,以完全消除“不良”图像的影响。
在较短的时间表上,如果新图像在各个域类别(从某种意义上说,是前一个数据集的代表性子集)之间合理地平衡,则选项3是合适的。
选项2看起来很安全,而且更容易理解。当您说“算法可能会对较早的图像进行更多加权”时,如果较早的图像为“良好”,我不明白为什么这是一个问题。但是,我可以看到域可能会随着时间(演变)而变化,在这种情况下,您可能希望抵消旧图像的权重。我了解您可以修改培训数据来执行此问题中讨论的操作:
Class weights for balancing data in TensorFlow Object Detection API