使用TensorFlow实现离散图像数据集按文件名规则配对并生成zip数据集
TensorFlow 数据集配对调整方案
你的问题核心是tf.data.Dataset.zip默认会对两个数据集按元素顺序一一配对,最终长度取两个数据集的最小长度,不符合你单个X数据集元素对应2个Y数据集元素的需求,可通过以下两种方案调整代码:
方案一:依赖文件名排序实现(简单高效)
适合确认Y目录下文件名严格按1_1.png、1_2.png、2_1.png、2_2.png...顺序排列的场景:
import os import tensorflow as tf # 显式获取文件路径并排序,避免默认排序逻辑不符合预期 x_files = sorted(tf.io.gfile.glob('D:/test/clear/*.png')) y_files = sorted(tf.io.gfile.glob('D:/test/haze/*.png')) # 构造X数据集:每个文件名重复2次,总长度和Y数据集一致为6 X = tf.data.Dataset.from_tensor_slices(x_files).flat_map( lambda x: tf.data.Dataset.from_tensors(x).repeat(2) ) # 构造Y数据集 Y = tf.data.Dataset.from_tensor_slices(y_files) # 配对 paired = tf.data.Dataset.zip((X, Y)) # 测试输出 for x, y in paired: print((x, y))
方案二:基于文件名前缀匹配实现(容错性高)
不依赖文件排序,只要文件名符合命名规则即可正确配对,避免Y目录文件顺序错乱导致配对错误:
import os import tensorflow as tf x_files = tf.io.gfile.glob('D:/test/clear/*.png') y_files = tf.io.gfile.glob('D:/test/haze/*.png') # 构建Y文件的前缀映射表 y_prefix_map = {} for y_path in y_files: y_filename = os.path.basename(y_path) prefix = y_filename.split('_')[0] y_prefix_map.setdefault(prefix, []).append(y_path) # 直接生成配对列表 paired_data = [] for x_path in x_files: x_filename = os.path.basename(x_path) prefix = x_filename.split('.')[0] # 每个X匹配对应前缀的两个Y文件 for y_path in y_prefix_map[prefix]: paired_data.append((x_path, y_path)) # 构造最终数据集 paired = tf.data.Dataset.from_tensor_slices(paired_data) # 测试输出 for x, y in paired: print((x, y))
内容的提问来源于stack exchange,提问作者Han
相关产品推荐
相关产品推荐

