TensorFlow Dataset 映射函数中的随机性

Randomness in TensorFlow Dataset map function

我有一个存储在磁盘上 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 函数做的是,对于每个原始实例,随机获取数据片段,以便我从实例中获得一小部分 window 数据。但是在下一个时期,我想确保从每个实例中得到一个 不同的 随机切片。我的主要问题是,如果将随机性引入 map 函数(即我的 do_something 函数),是否会:

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

我想要 (2),所以如果没有发生,是否有其他方法可以实现它?

例如,假设我有 100 个初始样本,每个样本都是 50 个数据点的时间序列。我想生成 2000 个较小切片样本,比如 5 个数据点切片。如果我在我的 map 函数中随机 select 切片,我是否会在每个 repeat 上得到相同的 100 个 5 数据点切片,或者有什么方法可以得到 100 不同 每次循环遍历 100(50 个数据点)初始样本时有 5 个数据点切片?

不考虑你的 do_something 函数,在 tf.data 中,只要你在 repeat 之前有 shuffle 操作,你保证不会重复任何sample 直到所有样本都迭代一次。所以,默认情况下你一定会得到第二个特征,即 给我每个时期每个原始实例的不同随机切片。

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

编辑:

我还是不太清楚你的问题,但我相信你总共有 100 个样本,每个数据点有 50 个(我们称它们为 主要样本 )和内部映射函数,你将从中随机切出 5 个点(我们称它们为 subsamples)。无论我在原始答案中写了什么,都适用于 主要样本 。您在每个 batch 中生成的 100 主要样本 的重复不会有任何问题。但是在 subsamples 级别,可重复性取决于您如何在本地编写 do_something 函数。

每个时期您将获得不同的随机切片。每个epoch都会再次调用你的map函数,所以只要你的map函数每次调用时生成不同的切片,你就会得到不同的切片。