tf.contrib.data.Dataset with shuffle,notice epoch end,mixed epochs?

时间:2017-05-23 10:31:30

标签: tensorflow

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

我当前的解决方案,这也让我有更多的控制权:我不会使用repeat但是只使用ShuffleDataset一次,然后使用RandomShuffleQueue进行洗牌,就像OutOfRangeError一样我得到<body> <div id="B"> <div id="A"></div> </div> <div id="C"></div> </body> ,我知道我到了时代的末尾。然后我重新初始化迭代器,就像它描述here

1 个答案:

答案 0 :(得分:12)

Dataset.shuffle()的行为取决于管道中相对于Dataset.repeat()的显示位置:

  • 如果shuffle 之前 repeat,则输出序列将首先从纪元i生成所有记录,然后再显示纪元记录中的任何记录i + 1

  • 如果shuffle repeat之后,输出序列可能会在纪元{{1}之前或之后产生纪元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. ) ) ) ) 是为单个纪元定义...的表达式,包括批处理和随机播放。