基于文件名从Keras批量验证数据集中移除文件的最简速方法
从Keras验证集中过滤指定文件名的样本
实现步骤
创建验证集时开启文件路径返回
调用tf.keras.utils.image_dataset_from_directory时添加return_filepaths=True参数,让数据集每个元素包含图像、标签和对应文件路径,为后续筛选提供依据:import tensorflow as tf import os # 替换为你的实际参数 img_height, img_width = 224, 224 batch_size = 32 val_dir = "path/to/your/validation_directory" val_ds = tf.keras.utils.image_dataset_from_directory( val_dir, image_size=(img_height, img_width), batch_size=batch_size, return_filepaths=True # 启用返回文件路径 )定义需排除的文件名集合
将需要移除的文件名存入集合(集合查找效率更高):exclude_filenames = {"sample_to_remove.jpg", "invalid_image.png", "bad_data.jpeg"}过滤数据集
使用tf.data.Dataset.filter方法剔除包含目标文件名的样本。通过TensorFlow的字符串操作提取文件名,再判断是否在排除列表中:def filter_samples(image, label, filepath): # 从完整路径中提取文件名 filename = tf.strings.split(filepath, os.sep)[-1] # 保留不在排除列表中的样本 return tf.logical_not(tf.strings.regex_full_match(filename, "|".join(exclude_filenames))) # 生成过滤后的新验证集 filtered_val_ds = val_ds.filter(filter_samples)(可选)移除文件路径字段
如果后续训练只需要图像和标签,用map方法去掉路径字段:filtered_val_ds = filtered_val_ds.map(lambda img, lbl, path: (img, lbl))
注意事项
- 确保
exclude_filenames中的文件名与数据集内的文件名完全匹配(包括大小写、文件后缀),可先打印几个样本的文件路径确认格式。 - 若某个批次的样本被全部过滤,TensorFlow会自动跳过空批次,不影响训练流程。
- 该方法仅在数据流层面过滤样本,不会修改原文件或改变初始的数据集拆分逻辑。
内容的提问来源于stack exchange,提问作者Ultan Kearns
相关产品推荐
相关产品推荐

