在TensorFlow中,tf.estimator.Estimator和tf.contrib.learn.Estimator有什么区别?

12
几个月前,我使用了TensorFlow的tf.contrib.learn.DNNRegressor API,发现很方便易用。但我没有关注TensorFlow的最新进展。现在我有一个项目,想再次使用回归器,但需要更多控制实际模型,这可以通过Estimator API中的model_fn参数来实现。
但是TensorFlow API中有两个Estimators:
tf.contrib.learn.Estimator tf.estimator.Estimator 两者提供类似的API,但在使用上略有不同。为什么会有两种不同的实现方法?是否有理由更喜欢其中一种?
不幸的是,我在TensorFlow文档中找不到任何差异或指南,以说明何时使用哪种Estimator。实际上,通过TensorFlow教程时产生了很多警告,因为某些接口显然已更改(例如x,y参数被input_fn参数替代等)。
4个回答

7

我也曾思考同样的问题,不能给出确切的答案,但是我有一些猜想可能会对你有所帮助:

看起来tf.estimator.Estimator结合一个返回tf.estimator.EstimatorSpec的模型函数是最新的,并且这个方法在较新的示例中被使用并将用于新代码。

我的猜测是tf.contrib.learn.Estimator是一个早期的原型,已被tf.estimator.Estimator替换。根据文档,tf.contrib中的所有内容都是不稳定的API,随时可能更改,看起来tf.estimator模块是从tf.contrib.learn模块“演变”而来的稳定API。我假设作者只是忘记将tf.contrib.learn.Estimator标记为过时的,并且它还没有被删除,因此现有的代码不会出问题。


3
现在文档中有这样一个明确的声明:
注意:TensorFlow还包括一个已弃用的Estimator类,位于tf.contrib.learn.Estimator,您不应该使用它。

https://www.tensorflow.org/programmers_guide/estimators

enter image description here

由于某种原因,代码中未标记为“已弃用”。

1
补充Christoph的答案。
这些包之间的区别在Tensorflow Dev Summit 2017 Martin Wicke中有明确提到:
引用: 核心和贡献之间的区别实际上在于核心内容不会改变。直到发布2.0版本,所有东西都是向后兼容的,现在没有人考虑这个问题。 如果你有一些核心内容,那么它是稳定的,你应该使用它。如果你有一些贡献内容,API可能会改变,根据你的需求,你可能想要使用它或者不想使用它。
因此,您可以将tf.contrib包视为“实验性”或“早期预览”。对于已经存在于tf.estimatortf.contrib中的类,您应该绝对使用tf.estimator版本,因为tf.contrib类会自动弃用(即使在文档中没有明确说明),并可能在下一个版本中被删除。
从tensorflow 1.4开始,“毕业”类的列表包括:EstimatorDNNClassifierDNNRegressorLinearClassifierLinearRegressorDNNLinearCombinedClassifierDNNLinearCombinedRegressor。这些应该移植到tf.estimator中。

0

我也有同样的问题要问。

我猜 tf.estimator.Estimator 是高级接口并且推荐使用,而 tf.contrib.learn.Estimator 被认为不是高级接口(但实际上它确实是)。正如 Christoph 所提到的,tf.contrib 不稳定,因此 tf.contrib.learn.Estimator 易受更改影响。它从 0.x 版本变成了 1.1 版本,然后在 2016.12 又进行了更改。问题是,它们的使用似乎不同。你可以使用 tf.contrib.learn.SKCompat 来包装 tf.contrib.learn.Estimator,而对于 tf.estimator.Estimator,你不能做同样的事情。如果你检查错误消息,model_fn 的要求/参数也不同。

结论是这两个 Estimator 是不同的东西!

无论如何,我认为 tf 文档在这个主题上做得非常糟糕,因为 tf.estimator 在他们的教程页面上,这意味着他们非常重视这个...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接