【问题标题】:Randomness in TensorFlow Dataset map functionTensorFlow 数据集映射函数中的随机性
【发布时间】:2019-09-16 16:38:52
【问题描述】:

我有一个原始时间序列数据的数据集,存储在磁盘上的 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. 从每个 epoch 的每个原始实例中给我不同的随机切片。

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

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

【问题讨论】:

    标签: python tensorflow tensorflow-datasets


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      编辑:

      您的问题对我来说仍然不太清楚,但我相信您总共有 50 个数据点中的每一个有 100 个样本(让我们称它们为 主样本),并且在 map 函数中,您将随机从中切出 5 个点(我们称它们为 subsamples)。我在原始答案中写的任何内容都适用于主要示例。您在每个batch 中生成的 100 个主样本的重复不会有任何问题。但在 子样本 级别,可重复性取决于您如何在本地编写 do_something 函数。

      【讨论】:

      • 我想你误会了我,我会在我的描述中澄清。假设我有 100 个初始数据样本,每个样本都是 50 个数据点的时间序列。我想生成 2000 个时间序列样本,每个样本持续时间为 5 个数据点。我希望使用 map 函数来创建我的 5 个数据点切片,然后在我完成 100 个初始样本并获得 100 个切片之后,当我再次返回时,我想要获得 100 个 不同的切片。
      猜你喜欢
      • 2020-07-20
      • 2019-02-14
      • 2018-10-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2011-09-16
      • 1970-01-01
      相关资源
      最近更新 更多