关于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的表达式,包括批处理和混洗.
归档时间: |
|
查看次数: |
5340 次 |
最近记录: |