【问题标题】:Tensorflow Dataset API: parallelising tf.data.Dataset.from_generator with parallel_interleaveTensorflow 数据集 API:将 tf.data.Dataset.from_generator 与 parallel_interleave 并行化
【发布时间】:2018-10-22 01:26:36
【问题描述】:

在生产环境中,我有来自 N 个生产者的数据,这些生产者必须通过网络。我在parallelising tf.data.Dataset.from_generator 上找到了这条评论,它真正描述了我想要的。

def generator(n):
  # returns n-th generator function

def dataset(n):
  return tf.data.Dataset.from_generator(generator(n))

ds = tf.data.Dataset.range(N).apply(tf.contrib.data.parallel_interleave(dataset, cycle_lenght=N))

# where N is the number of generators you use

但是 generator(n) 函数应该是什么样子。因为当我用

运行这个示例时
 def generator(n):
        """Returns the n-th generator function (for consumer n)
        """
        consumer = self.consumers[n]

        def gen():
            for item in consumer:
                yield item

        return gen

使用 self.consumers 一个 Python 列表然后我会得到错误:

TypeError:列表索引必须是整数或切片,而不是张量

【问题讨论】:

  • 什么是n?从您发布的代码中,它听起来像是tf.Tensor,不能用于索引到列表中。
  • 是的,这就是我提出这个问题的原因:)

标签: tensorflow tensorflow-datasets


【解决方案1】:

实现几乎是正确的,但您会遇到错误,因为 dataset(n) 中的 n 参数是“符号”tf.Tensor,而不是可以是的实际值用于在self.consumers 中查找消费者。

幸运的是,有一个解决方法,包括将n 通过可选的args 参数传递给tf.data.Dataset.from_generator()

def dataset(n):
  return tf.data.Dataset.from_generator(generator, args=(n,))

在幕后,from_generator() 在每次调用 generator 之前插入一些代码以将 n 转换为 Python 整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-15
    • 2019-02-08
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2019-07-15
    • 2019-07-24
    • 2018-06-05
    相关资源
    最近更新 更多