将数据集划分为训练、验证和测试的正确方法是什么



我正在关注一篇文章,该文章说测试文件夹还应该包含一个文件夹,其中包含所有测试图像(不会有子文件夹/标签文件夹(。另一方面,训练和验证文件夹应包含"n"个文件夹,每个文件夹都包含各自类别的图像。例如:

结构1

/Data
//train
classA folder
classB folder
classC folder
//val
classA folder
classB folder
classC folder
//test
test folder

再次,我了解了如何使用python库拆分文件夹,该文件夹将数据拆分为以下结构,

结构2

/Data
//train
classA folder
classB folder
classC folder
//val
classA folder
classB folder
classC folder
//test
classA folder
classB folder
classC folder

我使用python库拆分文件夹实现了一个(结构2(,并使用以下方法评估模型,

model.evaluate(test_generator,batch_size=32)

在这里,我只向我的评估函数提供了test_generator(我从flow_from_directory获得((我没有使用任何标签(,我的准确率约为88%。我的困惑是:

  1. 数据拆分应遵循哪种结构
  2. 如果我使用结构1,我如何评估或预测我的模型?如何从数据中提取标签
  3. 尽管我没有提供任何标签,但Python库拆分文件夹是如何在评估模型时不出错的
  1. 看起来Structure 2只是拆分了所有可用的内容,这从根本上是正确的。实际上,当使用flow_from_directory()时,您很可能会使用Structure 1。你不能在没有标签的情况下执行evaluate(),所以你的test_generator更类似于一个验证集,但你可以使用这个"验证集"进行技术评估;测试";数据,因为它们将以相同的方式创建,但理想情况下使用方式不同
  2. flow_from_directory()输出包含特征classes和标签class_indicesDataset。将Dataset对象传递给evaluate()时,该方法同时使用传递变量中的特性和标签。如果要从flow_from_directory()中提取对象的标签,如果变量是x,那么它就是x.class_indices,它将是一个字典。将Dataset传递给predict()时,仅使用特征。标签将被忽略。除非您需要手动检索Dataset对象中的某些内容,否则在评估或预测时不需要访问该对象中的任何内容
  3. split_folder对您的模型没有任何作用

train和val的以类命名的子文件夹是在将图像与标签(文件夹名称-类(进行比较时使用的。这就是flow_from_directory()跟踪每个图像的类的方式。由于预测应该使用看不见的数据作为输入,所以它不会有标签可供比较,因此在您拆分测试文件夹时没有标签(或包含类的子文件夹(。

你可以做的另一件常见的事情是,只需将训练集和测试集分开,然后从训练集创建验证集。但这两种方法基本相同。

最新更新