从keras中将tensorflow 数据集拆分为训练集、测试集和验证集,

qnakjoqk  于 2022-11-30  发布在  其他
关注(0)|答案(3)|浏览(518)

我是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)

找到607200个文件,属于3036个类。正在使用182160个文件进行验证。
但是我不确定如何在保持正确类的同时进一步将验证拆分为测试拆分。从我所知道的(通过GitHub源代码)来看,take方法只取数据集的前x个元素,skip也是如此。我不确定这是否保持了数据的分层,也不确定如何从数据集返回标签来测试它。
任何帮助都将不胜感激。

jexiocij

jexiocij1#

我找不到支持文档,但我相信image_dataset_from_directory将数据集的末尾部分作为验证分割。shuffle现在默认设置为True,因此在训练之前对数据集进行了混洗,以避免只使用某些类别进行验证分割。image_dataset_from_directory所做的分割只与训练程序相关。如果您需要(强烈推荐)测试拆分,您应该事先将您的数据拆分为训练和测试。然后,image_dataset_from_directory会将您的训练数据拆分为训练和验证。
我通常取一个较小的百分比(10%)用于训练中的验证,并将原始数据集拆分为80%训练,20%测试。

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

在此问题中,还提供了有关如何拆分目录中的数据的其他信息:Keras split train test set when using ImageDataGenerator

yeotifhr

yeotifhr2#

对于分裂成培训和验证,也许你可以这样做。
最主要的一点是保持同一个种子。

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/

1tu0hz3e

1tu0hz3e3#

您几乎已经得到了答案。关键是使用.take().skip()将验证集进一步拆分为两个数据集--一个用于验证,另一个用于测试。如果使用您的示例,则需要执行以下代码行。假设您需要70%用于训练集,10%用于验证集,20%用于测试集。为了完整起见,我还包括了生成训练集的步骤。让我们也分配一些基本变量,这些变量在第一次将整个数据集拆分为训练集和验证集时必须相同。

seed_train_validation = 1 # Must be same for train_ds and val_ds
shuffle_value = True
validation_split = 0.3

train_ds = tf.keras.utils.image_dataset_from_directory(
directory ='etlcdb/ETL9G_IMG/',
image_size = (128, 127),
validation_split = validation_split,
subset = "training",
seed = seed_train_validation,
color_mode = 'grayscale',
shuffle = shuffle_value)

val_ds = tf.keras.utils.image_dataset_from_directory(
directory ='etlcdb/ETL9G_IMG/',
image_size = (128, 127),
validation_split = validation_split,
subset = "validation",
seed = seed_train_validation,
color_mode = 'grayscale',
shuffle = shuffle_value)

接下来,使用tf.data.experimental.cardinality确定验证集中有多少批数据可用,然后将其中的三分之二(30%的2/3 = 20%)移动到测试集中,如下所示。请注意,batch_size的默认值为32(re:文档)。

val_batches = tf.data.experimental.cardinality(val_ds)
test_ds = val_ds.take((2*val_batches) // 3)
val_ds = val_ds.skip((2*val_batches) // 3)

所有这三个数据集(train_dsval_dstest_ds)都生成了一批图像以及从目录结构推断出的标签。

相关问题