3

我正在使用 Dataset APIlist_files来获取source目录和target目录中的文件列表,例如:

source_path = '/tmp/data/source/*.ext1'
target_path = '/tmp/data/target/*.ext2'
source_dataset = tf.data.Dataset.list_files(source_path)
target_dataset = tf.data.Dataset.list_files(data_path)
dataset = tf.data.Dataset.zip((source_dataset, target_dataset))

源目录和目标目录内容具有相同的顺序文件名,但扩展名不同(例如,源 0001.ext1 <-> 目标 0001.ext2)。

但由于 list_files 无论如何都没有排序,因此压缩数据集包含源和目标之间的不匹配。

如何在新的数据集 API 中解决这个问题?

4

2 回答 2

1

此方法的默认行为是以不确定的随机打乱顺序返回文件名。传递种子或 shuffle=False 以获得确定顺序的结果。

source_dataset = tf.data.Dataset.list_files(source_path, shuffle=False)

或者

val = 5
source_dataset = tf.data.Dataset.list_files(source_path, seed = val)
target_dataset = tf.data.Dataset.list_files(data_path, seed = val)
于 2020-03-17T01:40:28.897 回答
0

我有同样的问题,我通过首先对文件路径进行排序来解决它。

我的文件在 OP 的情况下命名为:

input image       -> corresponding output
data/mband/01.tif -> data/gt_mband/01.tif
data/mband/02.tif -> data/gt_mband/02.tif

代码如下所示:

from pathlib import Path
import tensorflow as tf

DATA_PATH = Path("data")

# Sort the PATHS
img_paths = sorted(map(str, (DATA_PATH / 'mband').glob('*.tif')))
mask_paths = sorted(map(str, (DATA_PATH / 'gt_mband').glob('*.tif')))

# These are tensors of PATHS
# Paths are strings, so order will be preserved
img_paths = tf.data.Dataset.from_tensor_slices(img_paths)
mask_paths = tf.data.Dataset.from_tensor_slices(mask_paths)

# Load the actual images
def parse_image(image_path: 'some_tensor'):
    # Load the image somehow...
    return image_as_tensor

imgs = img_paths.map(parse_image)
masks = mask_paths.map(parse_mask)
于 2021-05-13T17:07:16.827 回答