【问题标题】:Tensorflow input pipelineTensorFlow 输入管道
【发布时间】:2017-09-28 08:25:11
【问题描述】:

我有一个输入管道,可以在其中动态生成样本。我使用 keras 和自定义 ImageDataGenerator 和相应的 Iterator 来获取内存中的样本。 假设我的设置中的 keras 正在使用 feed_dict(这个假设对我来说是一个问题),我正在考虑通过切换到原始 tensorflow + Dataset.from_generator() 来加快速度。

Here我看到,在最新的 Tensorflow 中,对于生成数据的输入管道的建议解决方案是使用 Dataset.from_generator()。

问题:

  1. 带有 Tensorflow 后端的 keras 是否使用 feed_dict 方法?
  2. 如果我切换到原始 tensorflow + Dataset.from_generator(my_sample_generator) 会减少 feed_dict 内存复制开销并为我购买性能吗?
  3. 在预测(评估)阶段,除了 batch_x、batch_y,我的生成器输出中也有不透明的索引向量。该向量对应于 batch_x 中的样本 ID。这是否意味着我坚持使用 feed_dict 方法预测阶段,因为我需要来自迭代器的额外 batch_z 输出?

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    新的tf.contrib.data.Dataset.from_generator() 可以通过将数据准备与训练重叠来加速您的输入管道。但是,通过尽可能切换到输入管道中的 TensorFlow 操作,您往往会获得最佳性能。

    回答您的具体问题:

    1. Keras TensorFlow 后端使用tf.placeholder() 表示编译后的函数输入,并使用feed_dict to pass arguments to a function

    2. 随着最近对tf.py_func()feed_dict 复制开销的优化,我怀疑在memcpy() 中花费的时间量将是相同的。但是,您可以更轻松地使用 Dataset.from_generator()Dataset.prefetch() 将一个批次的训练与下一批的预处理重叠。

    3. 听起来您可以为预测阶段定义一个单独的迭代器。 tf.estimator.Estimator 类通过实例化具有不同签名用于训练和评估的不同“输入函数”,然后为每个角色构建一个单独的图表来执行类似的操作。

      或者,您可以向训练迭代器添加一个虚拟输出(用于batch_z 值),并使用"feedable iterator" 在训练和评估迭代器之间切换。

    【讨论】:

      猜你喜欢
      • 2017-04-25
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 2018-07-31
      • 2018-08-11
      相关资源
      最近更新 更多