如何在 TensorFlow 中使用我自己的数据将图像拆分为测试集和训练集

How to split images into test and train set using my own data in TensorFlow

我在这里有点困惑...我刚刚花了最后一个小时阅读如何在 TensorFlow 中将我的数据集拆分为 test/train。我正在按照本教程导入图像:https://www.tensorflow.org/tutorials/load_data/images。显然可以用 sklearn: model_selection.train_test_split 分成 train/test 。

但我的问题是:我什么时候将我的数据集拆分成 train/test。我已经用我的数据集完成了这个(见下文),现在呢?我该如何拆分它?我是否必须在将文件加载为 tf.data.Dataset 之前执行此操作?

# determine names of classes
CLASS_NAMES = np.array([item.name for item in data_dir.glob('*') if item.name != "LICENSE.txt"])
print(CLASS_NAMES)

# count images
image_count = len(list(data_dir.glob('*/*.png')))
print(image_count)


# load the files as a tf.data.Dataset
list_ds = tf.data.Dataset.list_files(str(cwd + '/train/' + '*/*'))

此外,我的数据结构如下所示。没有测试文件夹,没有 val 文件夹。我需要从那组火车中抽出 20% 来进行测试。

train
 |__ class 1
 |__ class 2
 |__ class 3

您可以使用 tf.keras.preprocessing.image.ImageDataGenerator:

image_generator = tf.keras.preprocessing.image.ImageDataGenerator(validation_split=0.2)
train_data_gen = image_generator.flow_from_directory(directory='train',
                                                     subset='training')
val_data_gen = image_generator.flow_from_directory(directory='train',
                                                   subset='validation')

请注意,您可能需要为发电机设置其他 data-related parameters

更新: 您可以通过 skip()take() 获取数据集的两个切片:

val_data = data.take(val_data_size)
train_data = data.skip(val_data_size)

如果您将所有数据都放在同一个文件夹中并想使用 tf.data 拆分为 validation/testing,请执行以下操作:

list_ds = tf.data.Dataset.list_files(str(cwd + '/train/' + '*/*'))
image_count = len(list(data_dir.glob('*/*.png')))

val_size = int(image_count * 0.2) 
train_set = list_ds.skip(val_size)
val_set = list_ds.take(val_size)