【问题标题】:TensorFlow dataset.shuffle() behavior when used with repeat() and batch()TensorFlow dataset.shuffle() 与 repeat() 和 batch() 一起使用时的行为
【发布时间】:2023-04-05 02:49:01
【问题描述】:

这究竟会做什么?

dataset = tf.data.Dataset.from_tensor_slices([0, 0, 0, 1, 1, 1, 2, 2, 2])
dataset.shuffle(buffer_size=5).repeat().batch(3)

我注意到了几个相关的问题,但没有一个能完全回答我的担忧。我对shuffle(buffer_size) 在做什么感到困惑。我知道它将需要 5 个第一个示例 [0, 0, 0, 1, 1] 进入内存,但是接下来它会用这个缓冲区做什么呢?以及这个缓冲区如何与repeat()batch() 交互?

【问题讨论】:

  • 您可能会感到困惑,因为在 tf2.0 的 alpha 和 beta 版本中,shuffle 和 repeat 的组合没有按照文档和以前的 tensorflow 版本的预期执行。有关详细信息,请参阅此 github 问题(以及我发现对理解 shuffle、repeat 和批处理操作非常有帮助的一些示例):github.com/tensorflow/tensorflow/issues/27680

标签: tensorflow dataset


【解决方案1】:

shuffle 的工作方式很复杂,但您可以假装它可以工作,首先填充大小为 buffer_size 的缓冲区,然后每次请求一个元素时,在该缓冲区中采样一个均匀随机的位置并用一个新元素替换它.

在洗牌前进行批处理意味着您将对预先制作的小批次进行洗牌(因此小批本身不会改变,只会改变它们的顺序),而在洗牌后进行批处理则可以让您随机更改批次的内容。同样,在洗牌前重复意味着您将洗牌一个无限流示例(因此第二个时期将与第一个时期具有不同的顺序),而在洗牌后重复意味着您将在每个时期中始终看到相同的示例。

【讨论】:

  • 我仍然不清楚它是如何工作的。你能用问题中给出的例子来演示这个过程吗?
猜你喜欢
  • 2019-11-18
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2021-11-25
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
相关资源
最近更新 更多