关于tf.contrib.data.Dataset
(来自TensorFlow 1.2,请参阅here和here)用法:
当我repeat
(对于多个纪元)与shuffle
一起使用时(内部为read_batch_features
),当一些纪元结束时,我会注意到什么,以及当前的纪元是什么?此外,当纪元结束时,ShuffleDataset
是否会先等待一切出列或者是否已经填充了下一个纪元的更多数据?在上一个时代,或者如果我不使用repeat
,ShuffleDataset
是否会将所有剩余数据出列,例如tf.RandomShuffleQueue
出列后是否会出列?
我当前的解决方案,这也让我有更多的控制权:我不会使用repeat
但是只使用ShuffleDataset
一次,然后使用RandomShuffleQueue
进行洗牌,就像OutOfRangeError
一样我得到<body>
<div id="B">
<div id="A"></div>
</div>
<div id="C"></div>
</body>
,我知道我到了时代的末尾。然后我重新初始化迭代器,就像它描述here。
答案 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.
)
)
)
)
是为单个纪元定义...
的表达式,包括批处理和随机播放。