0

我有两个虚拟图像数据集,第一个数据集中有 3 个元素,第二个数据集中有 6 个元素。

像第一个数据集图像名称 = [1.png, 2.png, 3.png]

第二个数据集图像名称 = [1_1.png, 1_2.png, 2_1.png, 2_2.png, 3_1.png, 3_2.png]

我试图弄清楚,如何以这样的方式对这些数据集进行压缩,以映射这两个数据集,[1.png 必须与 1_1.png 和 1_2.png] 映射,而 [2.png 必须映射与 2_1.png 和 2_2.png] 等等。这可能吗?这是我试图实现的代码,但我真的不知道该怎么做。


代码

import os
import tensorflow as tf

X=tf.data.Dataset.list_files('D:/test/clear/*.png',shuffle=False)
Y=tf.data.Dataset.list_files('D:/test/haze/*.png',shuffle=False)
paired=tf.data.Dataset.zip((X,Y))
for x in paired:
    print(x)

结果

(<tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\clear\\1.png'>, <tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\haze\\1_1.png'>)
(<tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\clear\\2.png'>, <tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\haze\\1_2.png'>)

我想要的结果

(<tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\clear\\1.png'>, <tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\haze\\1_1.png'>)
(<tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\clear\\1.png'>, <tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\haze\\1_2.png'>)
(<tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\clear\\2.png'>, <tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\haze\\2_1.png'>)
(<tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\clear\\2.png'>, <tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\haze\\2_2.png'>)
4

1 回答 1

0

(这是我在 StackOverflow 上写的第一个答案,所以我希望它会很清楚(足够)并且没有太多格式错误。)

我现在能想到的最简单的方法是复制 X 的文件名。

这些是我使用的虚拟文件路径列表:

files_x = ["D:\\test\\clear\\1.png", "D:\\test\\clear\\2.png", "D:\\test\\clear\\3.png"] 
files_y = ["D:\\test\\haze\\1_1.png", "D:\\test\\haze\\1_2.png",  "D:\\test\\haze\\2_1.png", "D:\\test\\haze\\2_2.png", "D:\\test\\haze\\3_1.png", "D:\\test\\haze\\3_2.png"]

首先,您根据文件路径列表创建一个数据集。

ds_files_x_dup = tf.data.Dataset.from_tensor_slices(files_x)

然后,您可以通过 map 函数将 tf.repeat 应用于每个元素来重复元素。然而,这会导致重复的元素被分组为一个样本。要获得每个样本一个元素的数据集,您必须在数据集上应用 flat_map。

ds_files_x_dup = ds_files_x_dup.map(lambda x: tf.repeat(x,2))
ds_files_x_dup = ds_files_x_dup.flat_map(lambda x: tf.data.Dataset.from_tensor_slices(x))

现在您只需要基于 files_y 创建数据集:

ds_files_y = tf.data.Dataset.from_tensor_slices(files_y)

并将两者压缩在一起:

paired = tf.data.Dataset.zip((ds_files_x_dup, ds_files_y))

那么paired的元素是:

(<tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\clear\\1.png'>, <tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\haze\\1_1.png'>)
(<tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\clear\\1.png'>, <tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\haze\\1_2.png'>)
(<tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\clear\\2.png'>, <tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\haze\\2_1.png'>)
(<tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\clear\\2.png'>, <tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\haze\\2_2.png'>)
(<tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\clear\\3.png'>, <tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\haze\\3_1.png'>)
(<tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\clear\\3.png'>, <tf.Tensor: shape=(), dtype=string, numpy=b'D:\\test\\haze\\3_2.png'>)
于 2021-10-08T15:51:51.903 回答