【问题标题】:Why does the TensorFlow Estimator API take inputs as a lambda?为什么 TensorFlow Estimator API 将输入作为 lambda?
【发布时间】:2018-09-13 12:05:57
【问题描述】:

tf.estimator API 接受返回 Datasets 的输入“输入函数”。例如,Estimator.train() 采用 input_fn (documentation)。

在我看到的示例中,只要手动提供此函数,它就是一个无参数的 lambda。

这不是说函数总是返回相同的值吗?还是在没有参数的情况下多次调用它?我无法找到有关此的文档。为什么像train() 这样的函数不直接将输入作为Dataset 明确地接受?

【问题讨论】:

  • 根据那些文档,输入是任何函数,不一定是 lambda(这将是一个相当荒谬的限制)。 “这不是说函数总是返回相同的值吗?”不,不一定。例如lambda: random.random()。请注意,如果您关注link in those docs,它会显示两个示例,这两个示例都不是 lambda 函数,其中一个带有参数。我想传递一个返回 Dataset 的函数会提供更大的灵活性。
  • 是的,我的意思是“为什么它是一个函数”。如果您通过链接引用 train_input_fn,这不是一个反例 - 它没有直接传递给 train(),它被包装在一个无参数函数中,所以我的问题仍然适用。您心目中的灵活性是什么?

标签: python tensorflow tensorflow-datasets tensorflow-estimator


【解决方案1】:

Dataset 对象也由计算图中的节点支持。 Estimator 在每个train()evaluate() 等上构造计算图。通过这样做,Estimator API 确保对不同Estimator 对象的操作是隔离的,并且Tensor/Dataset 成为独立的图表。

一些代码指针(适用于 TensorFlow 1.7)如果您有兴趣:

希望对您有所帮助。

【讨论】:

  • 但我通过 input_fn 进行训练。一次调用 train 会多次调用它吗?
  • 否(更新了评论)。对Estimator.train() 的每次调用都会创建一个新图并填充它(通过调用input_fnmodel_fn 并将它们连接在一起)。 (在上面编辑了我的答案以使其更清楚)。如果Estimator.train() 采用TensorDataset 对象,则很容易导致错误,例如用户创建TensorDataset 对象用于输入的图形与计算的图形不同由model_fn 指定的被创建。
  • 哦,我明白了,所以这些函数是在 train() 内部构建的图的上下文中调用的,这就是为什么我们不希望人们直接提供张量或数据集,而是希望它们要在该图的上下文中重建?那么,提供一个返回已经构建并属于另一个图的 Dataset 的函数是否是错误的?
  • 严格来说,我认为确实如此。但是,我认为 Python Dataset 类的实现会延迟创建图形节点,因此如果您返回相同的 Python 对象,它可能仍然有效。但你真的不应该那样做(officialexamplesdon't 也一样)。希望对您有所帮助。
  • 是的,谢谢,这说明了我应该如何使用它。我只是不明白为什么 API 是这样设计的——感觉非常不寻常和不必要。希望有人可以对推理进行更完整的解释。
【解决方案2】:

根据 Tensorflow 文档:

“估计器期望 input_fn 不接受任何参数。为了解决这个限制,我们使用 lambda 来捕获参数并提供预期的接口。”

https://www.tensorflow.org/guide/datasets_for_estimators

【讨论】:

  • 我想这将真正的问题推到后面:为什么估算器采用 lambda 而不是它返回的值:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 2017-10-27
  • 2019-08-20
  • 1970-01-01
相关资源
最近更新 更多