tf.data.Dataset中batch和map以及tf.contrib.data.map_and_batch的区别

3
我创建了一个tf.data.Dataset对象,并想使用该对象来训练模型:
dataset = dataset.prefeth()
dataset = dataset.shuffle()
dataset = dataset.repeat()
dataset = dataset.map()
dataset = dataset.filter()
dataset = dataset.batch()

我想知道上述数据集与下面的数据集有什么区别:
dataset = dataset.prefeth()
dataset = dataset.shuffle()
dataset = dataset.repeat()
dataset = dataset.apply(tf.contrib.data.map_and_batch())

我知道它们除了性能不应该有区别。但我不知道是否应该使用.apply()方法?
第一种实现方式正确吗?
1个回答

2
首先,大多数 tf.contrib.data 函数已被弃用并移至 tf.data.experimental。因此,请注意这一点。
请查看 输入管道性能指南,以了解对于您的应用程序来说哪些转换顺序可能是最佳的。关于 map 和 batch,是的,我们将 map 和 batch 的结果传递给 apply 函数,并且在 map 和 batch 的返回描述中指定了该信息以供参考确认。 我们希望出于效率原因使用 map 和 batch,这通常取决于您的数据以及 map 函数的成本。性能指南提供了一些指导方针。
关于您的第一个和第二个代码块之间的区别,它们之间有一个 filter 函数,因此根据您正在过滤的内容,两个代码块可能不会给出相同的结果。

谢谢,第一段代码是为了筛选我的数据集,这就是我不得不分别使用map和batch的原因。您认为filter方法中的谓词会导致任何问题,例如进程挂起或停滞吗? - Hamed
@Hamed,这很大程度上取决于你的应用程序。如果您的映射函数可以从中受益,则始终可以使用num_parallel_calls参数来加速映射的计算。如果重要的是您需要在映射后进行过滤而不是在该管道的任何其他位置进行过滤,那么我会将其视为反映在管道中的应用程序成本。 - kvish
感谢@kvish。实际上我必须使用过滤器。现在我不关心性能。我在这里提出了另一个问题,更详细地解释了我的问题:https://stackoverflow.com/questions/54221770/what-happens-if-number-of-samples-changes-every-epoch-using-tf-data-dataset-filt - Hamed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接