我正在构建一个二进制分类器,使用来自 resnet 的任务传输和 300 张图像的总训练集。最初我将 100 张图像放在一边作为验证,并调整超参数,每次训练 200 并测试 100,直到我得到 93% 的验证准确率。
对这个准确度很满意,我在测试集(另外 170 张图像)上尝试了相同的参数,但准确度非常差(大约 65%)。
我做错什么了?
- 我应该使用交叉验证吗?
- 这里的最佳做法是什么?我应该如何调整我的超参数?
- 我可以重复我的过程并再次检查测试集吗?如果是这样,在“作弊”之前我可以这样做多少次
我正在构建一个二进制分类器,使用来自 resnet 的任务传输和 300 张图像的总训练集。最初我将 100 张图像放在一边作为验证,并调整超参数,每次训练 200 并测试 100,直到我得到 93% 的验证准确率。
对这个准确度很满意,我在测试集(另外 170 张图像)上尝试了相同的参数,但准确度非常差(大约 65%)。
我做错什么了?
如果您看到的验证性能比未见过的测试数据好得多,那么这表明存在某种过度拟合,或者,如果不是,则表明数据不是来自相同的分布。例如,这可能意味着您的测试图像与训练和验证数据有很大不同。
首先,我会仔细检查数据,以确保训练集、验证集和测试集绝对不同,并且所有三个集的正负样本数量大致相同。如果这显然不是问题,那么我很可能会猜测您将超参数过度拟合到验证数据集。
使用交叉验证很可能会帮助您查看是否是这种情况,因为如果参数过度拟合到一个特定的验证折叠,您会看到每个折叠之间的变化更加剧烈。
如果您在测试数据集上重复该过程,那么该数据将不再“看不见”并且是模型的一部分,即使您只是使用它来调整超参数。您应该将测试数据集与模型构建过程完全分开,以便在测量模型性能时,您可以真实估计在看不见的数据上会发生什么。