关于tf.contrib.data.Dataset
(来自TensorFlow 1.2,请参阅here和here)用法:
如何获取数据的方式并不适合我通常如何获取数据。在我的情况下,我有一个帖子,我在那里收到数据,我不知道它会在什么时候结束,但我知道它何时结束。然后我等到我处理完所有的缓冲区,然后我完成了一个纪元。如何使用Dataset
?
请注意,我更喜欢Dataset
接口上的QueueBase
接口,因为它为我提供了迭代器接口,我可以重新初始化,甚至重置为不同的Dataset
。与在关闭后无法重新打开的队列相比,这更加强大(请参阅here和here)。
也许是一个类似的问题或同一个问题:如何在队列中包裹Dataset
?我有一些线程从某处读取一些数据,可以提供它并以某种方式排队。如何将数据导入Dataset
?我可以无限次地重复一些虚拟张量,然后使用map
来返回我的queue.dequeue()
,但这只会让我回到队列的所有原始问题,即如何重新打开队列。
答案 0 :(得分:7)
新的Dataset.from_generator()
方法允许您定义由Python生成器提供的Dataset
。 (要使用此功能,您必须下载每晚TensorFlow版本或从源代码自行构建。它将成为TensorFlow 1.4的一部分。)
实现示例的最简单方法是使用生成器替换接收线程,伪代码如下:
def receiver():
while True:
next_element = ... # Receive next element from external source.
# Note that this method may block.
end_of_epoch = ... # Decide whether or not to stop based on next_element.
if not end_of_epoch:
yield next_element # Note: you may need to convert this to an array.
else:
return # Returning will signal OutOfRangeError on downstream iterators.
dataset = tf.contrib.data.Dataset.from_generator(receiver, output_types=...)
# You can chain other `Dataset` methods after the generator. For example:
dataset = dataset.prefetch(...) # This will start a background thread
# to prefetch elements from `receiver()`.
dataset = dataset.repeat(...) # Note that each repetition will call
# `receiver()` again, and start from
# a fresh state.
dataset = dataset.batch(...)
更复杂的拓扑是可能的。例如,您可以使用Dataset.interleave()
并行创建多个接收器。