Machine learning TensorFlow中的tf.estimator.estimator和tf.contrib.learn.estimator有什么区别

Machine learning TensorFlow中的tf.estimator.estimator和tf.contrib.learn.estimator有什么区别,machine-learning,tensorflow,Machine Learning,Tensorflow,几个月前,我使用了TensorFlow的tf.contrib.learn.DNNRegressorAPI,我发现它使用起来非常方便。在过去的几个月里,我没有跟上TensorFlow的发展。现在,我有一个项目,我想再次使用回归器,但对实际模型有更多的控制,如DNNRegressor所提供的。据我所见,这是由使用模型fn参数的估计器API支持的 但是TensorFlow API中有两个估计器s: tf.contrib.learn.Estimator tf.estimator.estimator

几个月前,我使用了TensorFlow的
tf.contrib.learn.DNNRegressor
API,我发现它使用起来非常方便。在过去的几个月里,我没有跟上TensorFlow的发展。现在,我有一个项目,我想再次使用回归器,但对实际模型有更多的控制,如
DNNRegressor
所提供的。据我所见,这是由使用
模型fn
参数的
估计器
API支持的

但是TensorFlow API中有两个
估计器
s:

  • tf.contrib.learn.Estimator
  • tf.estimator.estimator
两者都提供了类似的API,但在用法上略有不同。为什么有两种不同的实现,有没有理由选择一种


不幸的是,我在TensorFlow文档中找不到任何区别,也找不到何时使用这两者的指南。实际上,通过TensorFlow教程的学习产生了很多警告,因为一些界面显然已经改变了(不是
x
y
参数,而是
input\u fn
参数等等)。

,但我有一些有根据的猜测可能对你有所帮助:

似乎
tf.estimator.estimator
和返回
tf.estimator.estimator.spect
的模型函数是最新示例中使用的函数,也是新代码中使用的函数


我现在猜测
tf.contrib.learn.Estimator
是一个早期原型,被
tf.Estimator.Estimator
所取代。根据文档,
tf.contrib
中的所有内容都是不稳定的API,可能随时发生变化,看起来
tf.estimator
模块是从
tf.contrib.learn
模块“进化”而来的稳定API。我假设作者只是忘记了将
tf.contrib.learn.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,您不能做同样的事情。如果您检查错误消息,则型号fn要求/参数不同

结论是这两个估计量是不同的


无论如何,我认为tf doc在这个话题上做得非常糟糕,因为tf.estimator在他们的教程页面上,这意味着他们对此非常认真…

补充Christoph的答案

2017年Tensorflow开发峰会特别提到了这些包之间的区别:

core和contrib之间的区别实际上在于核心内容 不要改变。在2.0版之前,一切都是向后兼容的,现在没有人考虑过这一点

如果你有一些核心,它是稳定的,你应该使用它。如果contrib中有某些内容,则API可能会根据您的需要进行更改 您可能想使用它,也可能不想使用它

因此,您可以将
tf.contrib
包视为“实验性”或“早期预览”。对于已经在
tf.estimator
tf.contrib
中的类,您一定要使用
tf.estimator
版本,因为
tf.contrib
类会自动被弃用(即使文档中没有明确说明),并且可以在下一版本中删除

从tensorflow 1.4开始,“分级”课程列表包括:
Estimator

DNNClassifier
dnnRecessor
LinearClassifier
linearRecessor
dnnlinearcompbinedClassifier
dnnlinearcompbinedRegressor
。这些应该移植到tf.estimator,现在文档中有这样一个明确的声明:

注意:TensorFlow在tf.contrib.learn.Estimator中还包含一个不推荐使用的Estimator类,您不应该使用它。

由于某些原因,它在代码中没有标记为不推荐