Tensorflow 如果项目是简单图像,tf.dataset.dataset.interleave()是否有任何好处?

Tensorflow 如果项目是简单图像,tf.dataset.dataset.interleave()是否有任何好处?,tensorflow,tensorflow-datasets,Tensorflow,Tensorflow Datasets,假设我们使用tensorflow数据集从磁盘加载图像,如下所示: paths = tf.data.Dataset.list_files("/path/to/dataset/train-*.png") images = paths.map(load_img_from_path, num_parallel_calls=tf.data.AUTOTUNE) 在这种特殊情况下:使用interleave()而不是map()会有什么好处(速度) 附言:我问了一个更广泛的问题,但上面的问

假设我们使用tensorflow数据集从磁盘加载图像,如下所示:

paths = tf.data.Dataset.list_files("/path/to/dataset/train-*.png")
images = paths.map(load_img_from_path, num_parallel_calls=tf.data.AUTOTUNE)
在这种特殊情况下:使用interleave()而不是map()会有什么好处(速度)


附言:我问了一个更广泛的问题,但上面的问题没有得到回答。或者更具体地说,现有答案仅将上述场景与使用tf.records数据集的另一个场景进行了比较


在下面的示例中,interleave()实际上比map()慢得多,但我可能误解了某些东西

PATHS_IMG = glob.glob(pattern)
BATCH_SIZE = 4

def main():
    measure_time(func_map)  # ~20s
    measure_time(func_interleave)  # ~60s
    measure_time(func_map)  # ~20s


def measure_time(func_parse):
    t0 = time.time()

    # setup dataset and iterate over it
    ds = tf.data.Dataset.from_tensor_slices(PATHS_IMG)
    ds = func_parse(ds)
    ds = ds.batch(BATCH_SIZE)
    ds = ds.prefetch(1)  # same time measurements if we set ds.prefetch(4)
    for i, item in enumerate(ds):
        print(f"{i}/{len(PATHS_IMG)//BATCH_SIZE}: len(item)={len(item)} and item[0].shape={item[0].shape}")

    # return
    print(f"It took {time.time() - t0} seconds")

def func_map(ds):
    ds = ds.map(_parse_tf, num_parallel_calls=BATCH_SIZE)
    return ds

def func_interleave(ds):
    ds = ds.interleave(
        lambda p: tf.data.Dataset.from_tensors(_parse_tf(p)),
        num_parallel_calls=BATCH_SIZE,
    )
    return ds


def _parse_tf(path):
    def _parse_np(path):
        img = PIL.Image.open(path)  # uint8
        img = np.array(img, dtype=np.float32)
        img = img[:512, :512, :]
        return img

    return tf.numpy_function(_parse_np, [path], tf.float32)