TensorFlow新的contrib.data.Dataset对象如何工作?

Joh*_*aro 6 training-data tensorflow

在TensorFlow中,旧的输入管道使用了一系列队列,并且线程将这些队列中的元素排入队列并从中排队.例如,string_input_producer文件名tf.train.batch的队列,作为批处理的队列等.

因此,在培训之前,您需要写:

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
Run Code Online (Sandbox Code Playgroud)

为了生成并启动填充所有这些队列的线程.


我已经从这个旧模型升级了我的数据输入管道,使用当前位于的新模型tf.contrib.data.TFRecordDataset来读取我用来训练的TFRecord文件.

我注意到我可以删除:

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
Run Code Online (Sandbox Code Playgroud)

代码行,输入管道仍然运行顺畅.

所以我的问题是:

新输入管道如何在引擎盖下工作?它根本不使用队列吗?或者它是否使用它们,并且只是自己启动它们?此外,如果它确实使用它们,是否有一种方法可以监控它们的完整程度,因为旧管道会自动执行,而新管道则没有?

小智 1

tl;dr 队列不再使用,因为它现在已集成到 TF 图中。迭代器管理发生在代码深处。

获取数据张量的标准方法tf.data.Dataset是调用next(dataset). 获取张量作为网络第一层的输入。在底层,这会构建一个名为IteratorV2[1] 的对象。然后,某种间接调用将调用转移到IteratorV2._next_internal[2] 处。如果不立即执行,则调用gen_dataset_ops.iterator_get_next,否则调用gen_dataset_ops.iterator_get_next_sync。这是在构建时生成的文件,因此我们在 GitHub 上没有它,但在我的编译中,这通常调用它使用“A of type ”_pywrap_tensorflow.TFE_Py_FastPathExecute在 TF 图中创建一个节点。Tensorresource

我找不到任何方法来监控幕后发生的事情。IteratorV2没有任何方法,而且tf.data.Dataset级别太高了。

链接:

  1. https://github.com/tensorflow/tensorflow/blob/r1.14/tensorflow/python/data/ops/iterator_ops.py#L588
  2. https://github.com/tensorflow/tensorflow/blob/r1.14/tensorflow/python/data/ops/iterator_ops.py#L588