【问题标题】:Splitting a tensorflow dataset into training, test, and validation sets from keras.preprocessing API从 keras.preprocessing API 将 tensorflow 数据集拆分为训练、测试和验证集
【发布时间】:2021-05-08 04:49:50
【问题描述】:

我是 tensorflow/keras 的新手,我有一个包含 3000 个文件夹的文件结构,每个文件夹包含 200 个图像,每个图像都作为数据加载。我知道keras.preprocessing.image_dataset_from_directory 允许我加载数据并将其拆分为训练/验证集,如下所示:

val_data = tf.keras.preprocessing.image_dataset_from_directory('etlcdb/ETL9G_IMG/', 
                                                           image_size = (128, 127),
                                                           validation_split = 0.3,
                                                           subset = "validation",
                                                           seed = 1,
                                                           color_mode = 'grayscale',
                                                           shuffle = True)

找到属于 3036 个类的 607200 个文件。 使用 182160 个文件进行验证。

但是我不确定如何在保持适当的类的同时进一步将我的验证拆分为测试拆分。据我所知(通过 GitHub source code),take 方法只获取数据集的前 x 个元素,skip 也是如此。我不确定这是否保持了数据的分层,并且我不太确定如何从数据集中返回标签来测试它。

任何帮助将不胜感激。

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    我找不到支持文档,但我相信 image_dataset_from_directory 将数据集的末尾部分作为验证拆分。 shuffle 现在默认设置为 True,因此数据集在训练之前会被打乱,以避免仅使用某些类进行验证拆分。 image_dataset_from_directory 进行的拆分仅与训练过程有关。如果您需要(强烈推荐)测试拆分,则应事先将数据拆分为训练和测试。然后,image_dataset_from_directory 会将您的训练数据拆分为训练和验证。

    我通常将较小的百分比 (10%) 用于训练中验证,并将原始数据集拆分为 80% 训练和 20% 测试。 使用这些值,最终拆分(从初始数据集大小)是:

    • 80% 训练:
      • 72% 训练(用于调整网络中的权重)
      • 8% 的训练中验证(仅用于在每个 epoch 后检查模型的指标)
    • 20% 测试(在训练过程中从未见过)

    在这个问题中有关于如何在你的目录中拆分数据的附加信息:Keras split train test set when using ImageDataGenerator

    【讨论】:

      【解决方案2】:

      为了拆分成训练和验证,也许你可以这样做。

      重点是保持相同的种子。

      train_ds = tf.keras.preprocessing.image_dataset_from_directory(
          directory,
          label_mode='categorical',
          validation_split=0.2,
          subset="training",
          seed=1337,
          color_mode="grayscale",
          image_size=image_size,
          batch_size=batch_size,
      )
      val_ds = tf.keras.preprocessing.image_dataset_from_directory(
          directory,
          validation_split=0.2,
          subset="validation",
          label_mode='categorical',
          seed=1337,
          color_mode="grayscale",
          image_size=image_size,
          batch_size=batch_size,
      )
      

      取自: https://keras.io/examples/vision/image_classification_from_scratch/

      【讨论】:

      • 如何使用 image_dataset_from_directory() 制作测试集?目前有没有测试集的问题,因为我的数据集太大而无法加载除此功能以外的任何东西
      • @wetmoney,如果您的意思是拆分以在测试中训练验证,那么从这里开始并不简单。也许我会尝试为测试创建一个单独的文件夹并从那里读取文件。如果有人有更好的建议,请告诉我。
      • 希望这个函数允许“测试”作为子集的参数