В чем разница между 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 находится на их странице учебника, что означает, что они очень серьезно относятся к этому...