几个月前,我使用了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教程制作了很多警告,因为一些界面显然已经改变(而不是x
,y
参数,input_fn
参数等等。
答案 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
由于某些原因,它未在代码中标记为弃用。
答案 2 :(得分:1)
添加Christoph的答案。
2017年Tensorflow Dev Summit by Martin Wicke特别提到了这些软件包之间的区别:
核心与贡献之间的区别实际上是核心事物 不要改变。在版本2.0之前,事情向后兼容,现在没有人在考虑这个问题。
如果你有核心的东西,它是稳定的,你应该使用它。如果您在contrib中有某些内容,则API可能会发生变化,具体取决于您的需求 你可能想也可能不想用它。
因此,您可以将tf.contrib
包视为"实验"或者"早期预览"。对于已同时位于tf.estimator
和tf.contrib
的类,您绝对应该使用tf.estimator
版本,因为tf.contrib
类会自动弃用(即使它未被声明明确地在文档中)并且可以在下一个版本中删除。
从张量流1.4开始,"毕业"课程包括:Estimator
DNNClassifier
,DNNRegressor
,LinearClassifier
,LinearRegressor
,DNNLinearCombinedClassifier
,DNNLinearCombinedRegressor
。这些应移植到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在他们的教程页面中,这意味着他们对此非常认真......