В чем разница между tf.estimator.Estimator и tf.contrib.learn.Estimator в TensorFlow
Несколько месяцев назад я использовал API tf.contrib.learn.DNNRegressor
от TensorFlow, который я нашел очень удобным в использовании. Последние месяцы я не отставал от развития TensorFlow. Теперь у меня есть проект, в котором я хочу снова использовать Regressor, но с большим контролем над реальной моделью, как это предусмотрено DNNRegressor
. Насколько я понимаю, это поддерживается API Estimator
, используя параметр model_fn
.
Но в TensorFlow API есть два Estimator
:
-
tf.contrib.learn.Estimator
-
tf.estimator.Estimator
Оба предоставляют аналогичный API, но, тем не менее, немного отличаются по своему использованию. Почему существуют две разные реализации и есть ли причины предпочесть один?
К сожалению, я не могу найти каких-либо различий в документации TensorFlow или руководстве, когда использовать какой из них. Фактически, работа с учебниками TensorFlow вызывала множество предупреждений, поскольку некоторые интерфейсы, по-видимому, изменились (вместо параметра x
, y
, параметр input_fn
и т.д.).
Ответы
Ответ 1
Я задавался вопросом то же самое и не могу дать окончательного ответа, но у меня есть несколько образованных догадок, которые могут вам помочь:
Кажется, что 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
как устаревшие и что они еще не удалены, поэтому существующий код не сломается.
Ответ 2
Теперь в документах есть этот явный оператор:
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
![введите описание изображения здесь]()
По какой-то причине он не помечен как устаревший в коде.
Ответ 3
Чтобы добавить к Кристофу ответ.
Различие между этими пакетами было конкретно упомянуто в Tensorflow Dev Summit 2017 от Мартина Вика:
Различие между core и contrib действительно в основном. не меняются. Совсем наоборот, до выпуска 2.0, и никто не думает об этом прямо сейчас.
Если у вас есть что-то в основном, оно стабильно, вы должны его использовать. Если у вас есть что-то в составе, API может измениться и в зависимости от ваших потребностей вы можете или не захотите его использовать.
Итак, вы можете придумать пакет tf.contrib
как "экспериментальный" или "ранний предварительный просмотр". Для классов, которые уже находятся в tf.estimator
и tf.contrib
, вы обязательно должны использовать версию tf.estimator
, потому что класс tf.contrib
автоматически устаревает (даже если он не указан явно в документации) и может быть отброшен в следующем выпуск.
В соответствии с тензорным потоком 1.4 список "градуированных" классов включает в себя: Estimator
DNNClassifier
, DNNRegressor
, LinearClassifier
, LinearRegressor
, DNNLinearCombinedClassifier
, DNNLinearCombinedRegressor
. Они должны быть перенесены на tf.estimator
.
Ответ 4
У меня был тот же вопрос, о котором я должен был спросить.
Я думаю, tf.estimator.Estimator - это интерфейс высокого уровня и рекомендуемое использование, в то время как tf.contrib.learn.Estimator так называется не интерфейс высокого уровня (но это действительно так).
Как упоминал Кристоф, tf.contrib нестабилен, поэтому tf.contrib.learn.Estimator уязвим для изменений. Он изменен с версии 0.x на версию 1.1 и снова изменен в 2016.12.12. Проблема в том, что использование их кажется другим. Вы можете использовать tf.contrib.learn.SKCompat для переноса tf.contrib.learn.Estimator, а для tf.estimator.Estimator вы не можете сделать то же самое. И параметр/параметр model_fn отличается, если вы проверяете сообщения об ошибках.
Вывод состоит в том, что этот два Оценщика - это другое дело!
Во всяком случае, я думаю, что tf doc сделал очень плохо на эту тему, поскольку tf.estimator находится на их странице учебника, что означает, что они очень серьезно относятся к этому...