gpt4 book ai didi

tensorflow - tf.contrib.data.Dataset 随机播放重复,注意纪元结束,混合纪元?

转载 作者:行者123 更新时间:2023-12-03 00:18:53 25 4
gpt4 key购买 nike

关于tf.contrib.data.Dataset(来自 TensorFlow 1.2,请参阅 herehere )用法:当我将 repeat (对于多个纪元)与 shuffle (如 read_batch_features 内部所做的那样)一起使用时,我将如何注意到某些纪元何时结束,以及当前的纪元是什么?另外,当纪元结束时,ShuffleDataset 是否会首先等待将所有内容出队,还是已经填充了下一个纪元的更多数据?在最后一个时期,或者如果我不使用repeatShuffleDataset是否会将所有剩余数据出队,就像tf.RandomShuffleQueue出队之后所做的那样关闭?

我当前的解决方案也给了我更多的控制权:我不会使用repeat,而是遍历数据并使用ShuffleDataset来像RandomShuffleQueue一样进行洗牌,然后在某个时候我得到了 OutOfRangeError 并且我知道我已经到达了纪元的末尾。然后我重新初始化迭代器,就像描​​述的那样 here .

最佳答案

Dataset.shuffle() 的行为取决于它在管道中相对于 Dataset.repeat() 出现的位置:

  • 如果在重复之前随机播放,则输出序列将首先生成来自纪元i<的所有记录,位于纪元 i + 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.
)
)
)
)

...其中 ... 是为单个纪元定义数据集的表达式,包括批处理和洗牌。

关于tensorflow - tf.contrib.data.Dataset 随机播放重复,注意纪元结束,混合纪元?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44132307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com