但是TensorFlow API中有两个Estimators:
tf.contrib.learn.Estimator tf.estimator.Estimator 两者提供类似的API,但在使用上略有不同。为什么会有两种不同的实现方法?是否有理由更喜欢其中一种?
不幸的是,我在TensorFlow文档中找不到任何差异或指南,以说明何时使用哪种Estimator。实际上,通过TensorFlow教程时产生了很多警告,因为某些接口显然已更改(例如x,y参数被input_fn参数替代等)。
我也曾思考同样的问题,不能给出确切的答案,但是我有一些猜想可能会对你有所帮助:
看起来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
标记为过时的,并且它还没有被删除,因此现有的代码不会出问题。
tf.contrib
包视为“实验性”或“早期预览”。对于已经存在于tf.estimator
和tf.contrib
中的类,您应该绝对使用tf.estimator
版本,因为tf.contrib
类会自动弃用(即使在文档中没有明确说明),并可能在下一个版本中被删除。Estimator
、DNNClassifier
、DNNRegressor
、LinearClassifier
、LinearRegressor
、DNNLinearCombinedClassifier
和DNNLinearCombinedRegressor
。这些应该移植到tf.estimator
中。我也有同样的问题要问。
我猜 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 在他们的教程页面上,这意味着他们非常重视这个...