2017-05-26 44 views
9

幾個月前,我使用了TensorFlow中的tf.contrib.learn.DNNRegressor API,我發現它非常方便使用。過去幾個月我沒有跟上TensorFlow的發展。現在我有一個項目,我想再次使用Regressor,但是可以更好地控制DNNRegressor提供的實際模型。據我所知,這是由使用model_fn參數的Estimator API支持的。TensorFlow中tf.estimator.Estimator和tf.contrib.learn.Estimator之間的區別

但有兩個Estimator S中TensorFlow API中:

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

都提供了類似的API,但仍然在它們的使用略有不同。爲什麼有兩種不同的實現,並且有理由更喜歡一個?

不幸的是,我無法在TensorFlow文檔或指南中找到任何區別。實際上,通過TensorFlow教程的工作產生了很多警告,因爲一些界面顯然已經發生了變化(而不是參數x,y參數input_fn參數等)。

回答

6

我知道同樣的,不能給出一個明確的答案,我有一些猜測,這可能有助於您:

看來,tf.estimator.Estimator與返回tf.estimator.EstimatorSpec模型函數一起是最新的一個在新的例子中使用它,在新的代碼中使用它。

我的猜測現在是tf.contrib.learn.Estimator是一個早期的原型,被tf.estimator.Estimator取代。根據文檔,tf.contrib中的所有內容都是不穩定的API,可能隨時發生變化,看起來tf.estimator模塊是穩定的API,可以從tf.contrib.learn模塊「演變」出來。我認爲作者忘記標記爲tf.contrib.learn.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是在他們的教程頁面,這意味着他們對此很嚴重......

1

爲了增加克里斯托夫的答案。

的區別這些包間已在Tensorflow開發高峯論壇2017年by Martin Wicke被特別提到:

核心和contrib請之間的區別是非常核心的東西 不會改變。在2.0版本之前,事物是向後兼容的,現在沒有人想到這一點。

如果你有核心內容,它是穩定的,你應該使用它。如果您在contrib中有某些東西,API可能會更改,並且取決於您的需求 您可能會也可能不想使用它。

所以你可以把tf.contrib包想成「實驗性」或「早期預覽」。對於已經在tf.estimatortf.contrib中的類,您應該使用tf.estimator版本,因爲tf.contrib類會自動棄用(即使未在文檔中明確說明),並且可以在下一版本中刪除。

由於tensorflow 1.4列表的 「畢業」 類包括:Estimator DNNClassifierDNNRegressorLinearClassifierLinearRegressorDNNLinearCombinedClassifierDNNLinearCombinedRegressor。這些應該移植到tf.estimator

相關問題