tf.contrib.data.Dataset用shuffle重复,注意epoch end,混合时代?

Alb*_*ert 5 tensorflow

关于tf.contrib.data.Dataset(来自TensorFlow 1.2,请参见此处此处)用法:当我repeat(与多个时期)一起使用shuffle(如同read_batch_features内部)时,我会在一些时期结束时注意到什么,以及当前时代是什么?此外,当纪元结束时,是ShuffleDataset等待首先将所有东西出列,还是已经填充了下一个纪元的更多数据?在上一个时代,或者如果我不使用repeat,是否会将ShuffleDataset所有剩余数据出列,例如tf.RandomShuffleQueue在关闭后出列的数据?

我目前的解决方案,这也给了我更多的控制权:我不会使用,repeat但是只使用一次数据并使用ShuffleDataset像洗牌一样RandomShuffleQueue,然后在某些时候我得到OutOfRangeError并且我知道我已经到了时代的末尾.然后我重新初始化迭代器,就像这里描述的那样.

mrr*_*rry 12

行为Dataset.shuffle()取决于管道中相对于以下内容的位置Dataset.repeat():

  • 如果你shuffle 之前repeat,输出的顺序将首先生产的所有记录的时代i,从时代的任何记录之前i + 1.

  • 如果shuffle 之后repeat,输出的序列可产生从历元的记录i时期之前或之后i + 1(和,历元i + k,以概率与所述增加buffer_size和与减小k).

如果你想在时期之间进行一些计算,并避免混合来自不同时期的数据,那么最简单的方法是避免repeat()OutOfRangeError在每个时代结束时捕捉到它们.

您可以构建一些更有趣的流水线来跟踪纪元数.例如,您可以将纪元编号编码为每个元素的组件:

dataset = (
    Dataset.range(None).flat_map(lambda epoch_num: 
        Dataset.zip(
            (Dataset.from_tensors(epoch_num).repeat(),  # Infinite repeat of `epoch_num`.
             ...,  # Definition of a Dataset over a single epoch.
            )
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

...在哪里...Dataset为单个纪元定义a的表达式,包括批处理和混洗.

  • 如果将显式(和非零)`seed`传递给`Dataset.shuffle()`,它将以相同的顺序重复; 如果你不传递种子,它将在每个时代重新洗牌. (2认同)