CNN 模型的(交叉)验证——何时引入测试数据?

(cross) validation of CNN models - when to bring in test data?

对于一个研究项目,我正在使用包含大约 500 张图像的数据集,使用 CNN 对焊珠图像进行缺陷检测。为此,我目前正在测试不同的模型(例如 ResNet18-50),以及数据增强和迁移学习技术。

经过一段时间的试验,我想知道 training/validation/testing 的哪种方式最适合提供 准确的性能测量 同时保持计算成本处于合理水平,考虑到我想测试尽可能多的模型etc.as。

我想执行某种交叉验证 (cv) 是合理的,尤其是因为数据集很小。然而,在进行了一些研究之后,我找不到一个明确的最佳方法来应用它,在我看来不同的人遵循不同的策略,我有点困惑。

有人可以澄清一下:

你使用验证集只是为了在训练时找到表现最好的 epoch/weights 然后直接测试测试集上的每个模型(并重复 k 次作为 k-fold -cv)?

或者您是否通过比较所有模型的平均验证集准确度(每个模型 k-运行s)找到性能最好的模型,然后检查其在测试集上的准确度?如果是这样,您会为测试加载哪些确切的重量,或者是否会为最佳模型执行另一个 cv 以确定最终测试精度?

是否可以选择为每个模型执行多个连续的训练-验证-测试 运行,而在每个 运行 洗牌数据集并将其拆分为“新的”训练集、验证集和测试集来确定平均测试精度(如蒙特卡罗-CV,但可能 运行s 的数量更少)?

非常感谢!

在你的情况下,我会为你的测试集删除 100 张图像。您应该确保它们类似于您期望最终模型能够处理的内容。例如。它应该是不在训练或验证集中的对象,因为您可能还希望它推广到新的焊缝。然后你可以做类似 5 折交叉验证的事情,你可以随机或智能地抽取 100 张图像作为你的验证集。然后,您在剩余的 300 个上训练您的模型,并将剩余的 100 个用于验证目的。然后,您可以对模型的性能使用置信区间。这个置信区间是您用来调整超参数的。

然后测试集可用于预测新数据的性能,但你应该 !!!永远不要!!!用它来调整超参数。