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

2024-04-24 15:12:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

但我的问题是:何时将数据集拆分为训练/测试。我已经用我的数据集完成了这项工作(见下文),现在怎么办?我怎么分呢?在将文件作为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

Tags: 数据namedatanamestfcountdirload
2条回答

您可以使用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将其拆分为验证/测试,请执行以下操作:

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) 

相关问题 更多 >