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

Posted

技术标签:

【中文标题】TensorFlow 新的 contrib.data.Dataset 对象如何工作?【英文标题】:TensorFlow how do the new contrib.data.Dataset objects work? 【发布时间】:2017-12-16 06:21:57 【问题描述】:

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

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

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)

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


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

我注意到我可以删除:

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)

几行代码,输入管道依然流畅运行。

所以我的问题是:

新的输入管道在后台是如何工作的?它根本不使用队列吗?还是它使用它们,然后自己启动它们?此外,如果它确实使用它们,是否有一种方法可以监控它们的填充程度,因为旧管道会自动执行此操作,而新管道则不会?

【问题讨论】:

【参考方案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 上没有它,但在我的编译中,这通常调用 _pywrap_tensorflow.TFE_Py_FastPathExecute,它使用“A Tensor of type resource”在 TF 图中创建一个节点。

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

链接:

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

【讨论】:

以上是关于TensorFlow 新的 contrib.data.Dataset 对象如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 Tensorflow 中为未知单词添加新的嵌入(训练和预设测试)

以horovd的HorovodAllreduceOp为例,学习如何在tensorflow上添加一个新的操作OP

新的出发,新的起点

初入TensorFlow————配置TensorFlow

TensorFlow LSTM 预测相同的值