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

时间:2017-05-26 15:11:04

标签: machine-learning tensorflow

几个月前,我使用了TensorFlow的tf.contrib.learn.DNNRegressor API,我发现它非常方便使用。在过去的几个月里,我没有跟上TensorFlow的发展。现在我有一个项目,我想再次使用一个回归器,但可以更好地控制DNNRegressor提供的实际模型。据我所知,使用Estimator参数的model_fn API支持此功能。

但是TensorFlow API中有两个Estimator

  • tf.contrib.learn.Estimator
  • tf.estimator.Estimator

两者都提供类似的API,但使用方式略有不同。为什么有两种不同的实现,是否有理由选择一种?

不幸的是,我无法在TensorFlow文档中找到任何差异,也无法在何时使用这两者中的哪一个。实际上,通过TensorFlow教程制作了很多警告,因为一些界面显然已经改变(而不是xy参数,input_fn参数等等。

4 个答案:

答案 0 :(得分:6)

我想知道同样的事情,无法给出明确的答案,但是我有一些可能对你有所帮助的有根据的猜测:

似乎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标记为已弃用且尚未删除,因此现有代码不会中断。

答案 1 :(得分:3)

现在文档中有这个明确的陈述:

Note: TensorFlow also includes a deprecated Estimator class at tf.contrib.learn.Estimator, which you should not use.

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

enter image description here

由于某些原因,它未在代码中标记为弃用。

答案 2 :(得分:1)

添加Christoph的答案。

2017年Tensorflow Dev Summit by Martin Wicke特别提到了这些软件包之间的区别:

  

核心与贡献之间的区别实际上是核心事物   不要改变。在版本2.0之前,事情向后兼容,现在没有人在考虑这个问题。

     

如果你有核心的东西,它是稳定的,你应该使用它。如果您在contrib中有某些内容,则API可能会发生变化,具体取决于您的需求   你可能想也可能不想用它。

因此,您可以将tf.contrib包视为"实验"或者"早期预览"。对于已同时位于tf.estimatortf.contrib的类,您绝对应该使用tf.estimator版本,因为tf.contrib类会自动弃用(即使它未被声明明确地在文档中)并且可以在下一个版本中删除。

从张量流1.4开始,"毕业"课程包括:Estimator DNNClassifierDNNRegressorLinearClassifierLinearRegressorDNNLinearCombinedClassifierDNNLinearCombinedRegressor。这些应移植到tf.estimator

答案 3 :(得分: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.estimator在他们的教程页面中,这意味着他们对此非常认真......