将数据目录拆分为训练和测试目录,并保留子目录结构

Sha*_*sai 9 python machine-learning neural-network deep-learning keras

我有兴趣在Keras中使用ImageDataGenerator进行数据扩充.但它要求具有类子目录的训练和验证目录分别如下所示(这来自Keras文档).我有一个目录,包含2个子目录(2个类(Data/Class1和Data/Class2).如何将其随机分成训练和验证目录

    train_datagen = ImageDataGenerator(
    rescale=1./255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

    test_datagen = ImageDataGenerator(rescale=1./255)

    train_generator = train_datagen.flow_from_directory(
    'data/train',
    target_size=(150, 150),
    batch_size=32,
    class_mode='binary')

   validation_generator = test_datagen.flow_from_directory(
    'data/validation',
    target_size=(150, 150),
    batch_size=32,
    class_mode='binary')

   model.fit_generator(
    train_generator,
    steps_per_epoch=2000,
    epochs=50,
    validation_data=validation_generator,
    validation_steps=800)
Run Code Online (Sandbox Code Playgroud)

我有兴趣通过随机训练和验证数据拆分多次重新运行我的算法.

Sha*_*sai 11

感谢你们!我能够编写自己的函数来创建训练和测试数据集.这是任何正在寻找的人的代码.

import os
source1 = "/source_dir"
dest11 = "/dest_dir"
files = os.listdir(source1)
import shutil
import numpy as np
for f in files:
    if np.random.rand(1) < 0.2:
        shutil.move(source1 + '/'+ f, dest11 + '/'+ f)
Run Code Online (Sandbox Code Playgroud)


小智 7

/sf/answers/3666042971/提供了最简单的方法:ImageDataGenerator 现在支持从具有子目录的单个目录直接拆分为 train/test。

这是直接从该答案中复制的,没有任何更改。我不相信。我试过了,效果很好。

请注意,train_data_dirtrain_generator和中是相同的validation_generator。如果你想有一个三路分离(火车/测试/有效)使用ImageDataGenerator,源代码将需要进行修改---有很好的指示在这里

train_datagen = ImageDataGenerator(rescale=1./255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    validation_split=0.2) # set validation split

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary',
    subset='training') # set as training data

validation_generator = train_datagen.flow_from_directory(
    train_data_dir, # same directory as training data
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary'
    subset='validation') # set as validation data

model.fit_generator(
    train_generator,
    steps_per_epoch = train_generator.samples // batch_size,
    validation_data = validation_generator, 
    validation_steps = validation_generator.samples // batch_size,
    epochs = nb_epochs)
Run Code Online (Sandbox Code Playgroud)

  • 我想知道我们是否可以通过创建另一个不带validation_split参数的ImageDataGenerator实例来进行三路分割? (2认同)

bla*_*tor 1

您需要手动复制一些训练数据并将其粘贴到验证目录中,或者创建一个程序将数据从训练目录随机移动到验证目录。使用这两个选项中的任何一个,您都需要将验证目录ImageDataGenerator().flow_from_directory()作为路径传递给您的验证。

该视频介绍了在目录结构中组织数据的详细信息。