TensorFlow数据集映射功能中的随机性

时间:2019-09-16 16:38:52

标签: python tensorflow tensorflow-datasets

我有一个原始时间序列数据的数据集,该数据集存储在磁盘上的TFRecords中:

dataset = TFRecordDataset(tfrecords)  # tfrecords is a list of filenames
dataset = dataset.map(lambda x: do_something(x))
dataset = dataset.shuffle(1024)
dataset = dataset.repeat()
dataset = dataset.batch(128)        

我希望我的do_something函数要做的是,对于每个原始实例,随机获取数据的一部分,以使实例中的数据窗口变小。但是在下一个时期,我想确保从每个实例中得到一个不同随机切片。我的主要问题是,如果将随机性引入map函数(即我的do_something函数)中,它将:

  1. 只需从每个原始实例中随机抽取一个切片,然后继续在每个时期遍历相同的切片。
  2. 在每个时期给我与每个原始实例不同的随机切片。

我渴望(2),所以如果那没有发生,有没有其他方法可以实现呢?

例如,假设我有100个初始样本,每个样本有50个数据点的时间序列。我想生成2000个较小切片的样本,例如5个数据点切片。如果我在map函数中随机选择切片,我会在每个repeat上获得相同的100个5个数据点切片,还是有办法获得100个 different < / em>每次循环100个(50个数据点)初始样本时,都会有5个数据点切片吗?

2 个答案:

答案 0 :(得分:0)

do_something中不考虑tf.data函数的情况下,只要您在shuffle之前进行过repeat操作,就可以保证直到任何样本都不会重复所有样本都迭代一次。因此,默认情况下,您必然会获得第二个特征,即在每个时期为每个原始实例提供不同的随机切片。

接下来,map函数用于预处理内容。这可能类似于标准化数据输入,或从文件名读取图像等。您不应该使用map来随机整理数据。您应该允许shuffle操作对数据执行随机改组。

编辑:

您的问题对我来说还不太清楚,但是我相信您在50个数据点中每个都有100个样本(让我们称它们为主要样本),并且在map函数内部,您将随机选择从中切出5分(我们称其为 subsamples )。无论我最初写的是什么内容,对于主要样本都是如此。在每个batch中生成100个主要样本,您将没有任何问题。但是在子样本级别,可重复性取决于您如何在本地编写do_something函数。

答案 1 :(得分:0)

每个时期您将获得不同的随机切片。每个时期都会再次调用您的map函数,因此只要您的map函数每次被调用生成不同的片段,您就会获得不同的片段。