张量流数据集:通过取消批处理(批处理 -> 映射 -> 取消批处理)或仅映射来更有效地进行矢量化?

tensorflow datasets: more efficient to vectorize with unbatching (batch -> map -> unbatch) or just map?

TensorFlow 建议在使用 map 进行转换之前对数据集进行批处理,以便对转换进行矢量化并减少开销:https://www.tensorflow.org/guide/data_performance#vectorizing_mapping

但是,在某些情况下,您希望对数据集执行转换,然后对 UNBATCHED 数据集执行某些操作(例如,随机播放)。

我没能找到任何东西来表明哪个更有效:

1) dataset.map(my_transformations)

2) dataset.batch(batch_size).map(my_transformations).unbatch()

(2) 减少了使用批处理向量化的地图开销,但由于必须在之后取消对数据集进行批处理而产生额外开销。

我也可以看出没有普遍的规则。每次我尝试新的数据集或转换(或硬件!)时都没有测试,这里有好的经验法则吗?我在网上看到几个例子使用(2)没有解释,但是我对这个问题没有直觉,所以...

提前致谢!

编辑:我发现至少在某些情况下,(2) 比 (1) 效率低得多。例如,在我们的图像数据集上,每个时期应用随机翻转和旋转(使用 .map 和内置 TF 函数 tf.image.random_flip_left_right、tf.image.random_flip_up_down 和 tf.image.rot90)以进行数据扩充(2) 需要 50% 的时间。我仍然不知道什么时候会出现这种情况,但教程建议的方法至少有时是错误的。

答案是(1)。 https://github.com/tensorflow/tensorflow/issues/40386

TF 正在修改文档以反映取消批处理的开销通常(总是?)高于向量化转换节省的开销。