Tensorflow 如果项目是简单图像,tf.dataset.dataset.interleave()是否有任何好处?
假设我们使用tensorflow数据集从磁盘加载图像,如下所示: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()会有什么好处(速度) 附言:我问了一个更广泛的问题,但上面的问
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)