将数据提供到tf.contrib.data.Dataset,如队列

时间:2017-05-23 10:44:34

标签: tensorflow

关于tf.contrib.data.Dataset(来自TensorFlow 1.2,请参阅herehere)用法: 如何获取数据的方式并不适合我通常如何获取数据。在我的情况下,我有一个帖子,我在那里收到数据,我不知道它会在什么时候结束,但我知道它何时结束。然后我等到我处理完所有的缓冲区,然后我完成了一个纪元。如何使用Dataset

获得此逻辑

请注意,我更喜欢Dataset接口上的QueueBase接口,因为它为我提供了迭代器接口,我可以重新初始化,甚至重置为不同的Dataset。与在关闭后无法重新打开的队列相比,这更加强大(请参阅herehere)。

也许是一个类似的问题或同一个问题:如何在队列中包裹Dataset?我有一些线程从某处读取一些数据,可以提供它并以某种方式排队。如何将数据导入Dataset?我可以无限次地重复一些虚拟张量,然后使用map来返回我的queue.dequeue(),但这只会让我回到队列的所有原始问题,即如何重新打开队列。

1 个答案:

答案 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()并行创建多个接收器。