是否可以使用其元素的索引对数据集进行混洗?

时间:2019-08-19 09:26:17

标签: tensorflow tensorflow-datasets

我在tensorflow(TF1.14和TF2.0)中使用tf.data.experimental.make_csv_dataset来读取包含3列的csv文件;索引,column1和column2。对我来说,只有第1列和第2列很重要。 column1中的每个元素都是形状(1,4)的数组,而column2具有(1,1)。在此数据集上,当我使用tf.data.shuffle(buffer_size = some_number)进行改组时,花费大量时间来对消息Filling Up the shuffle buffer进行改组。我的问题是,是否有一种方法可以使用column1 / column2的索引来对数据集进行混洗,因为混排可能仅花费索引就不需要花费太多时间。

1 个答案:

答案 0 :(得分:1)

  

我的问题是,是否有一种方法可以使用column1 / column2的索引来对数据集进行混洗,因为这可能不需要花费太多时间进行混洗,因为仅仅是索引而已

不,不幸的是没有。不是那样的。

原因是tf.data.Dataset对象本身是延迟加载的。这样做是有意的,因为它可以表示任意大(甚至是无限)的数据集,因此尝试将其全部加载到内存中或进行所有预处理都没有道理。

这意味着,尽管(当然)可以读取和改组索引,但我们随后无法访问原始数据集中的第n个元素(至少不便宜)。

值得一提的是,混洗缓冲区仅需要填充一次,因此延迟只会在训练开始时发生(如果混洗每个纪元,则每个纪元的开始)。

您可能已经考虑过的一个明智的解决方法是,将数据集与shuffle一起加载一次,然后在所有行都经过预洗的地方写出到某个位置(可能是tfrecord格式)。