Keras中如何获取或附加image_dataset_from_directory生成的MapDataset的文件名
解决方案
有两种常用实现方式,按需选择即可:
方案1:直接保留原始文件名列表
tf.keras.preprocessing.image_dataset_from_directory返回的数据集对象的filenames属性顺序,和数据集输出样本的顺序完全一致,你可以先将该列表单独保存,后续按索引匹配即可:
# 加载数据集后先保存文件名列表 train_filenames = train_ds.filenames # 后续对数据集的map、batch等操作不会改变样本顺序,直接按批次索引从train_filenames取对应文件名即可
注意:如果需要对数据集做shuffle操作,请在shuffle时指定固定随机种子,或者完成shuffle后再生成文件名列表,避免顺序不匹配。
方案2:将文件名嵌入数据集管道
如果你需要在迭代数据集时直接同步获取对应文件名,可以把文件名作为数据集的一部分一同传输:
# 生成文件名数据集 filename_ds = tf.data.Dataset.from_tensor_slices(train_ds.filenames) # 与原始图像数据集拼接 train_ds_with_filenames = tf.data.Dataset.zip((train_ds, filename_ds)) # 调整预处理函数,同步返回文件名 normalization_layer = layers.experimental.preprocessing.Rescaling(1./255) def adjust_inputs_with_filenames(img_label_pair, filename): images, _ = img_label_pair norm_img = normalization_layer(images) return (norm_img, norm_img), filename # 预处理后的数据集每个批次返回 ((训练输入, 训练真值), 对应文件名数组) normalized_train_ds = train_ds_with_filenames.map(adjust_inputs_with_filenames)
这种方式不需要额外维护文件名和样本的对应关系,迭代时直接读取即可,适用于需要频繁获取文件名的场景。
内容的提问来源于stack exchange,提问作者dosvarog
相关产品推荐
相关产品推荐

