2017-05-26 14 views
9

Kilka miesięcy temu użyłem interfejsu API tf.contrib.learn.DNNRegressor z TensorFlow, który uważam za bardzo wygodny w użyciu. Nie nadążałem za rozwojem TensorFlow przez ostatnie kilka miesięcy. Teraz mam projekt, w którym chcę ponownie użyć Regressor, ale z większą kontrolą nad faktycznym modelem dostarczonym przez DNNRegressor. O ile widzę, jest to obsługiwane przez API Estimator przy użyciu parametru model_fn.Jaka jest różnica między tf.estimator.Estimator a tf.contrib.learn.Estimator w TensorFlow

Ale istnieją dwa Estimator s w API TensorFlow:

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

Oba zapewniają podobną API, ale są jednak nieco inne w ich wykorzystania. Dlaczego istnieją dwie różne implementacje i czy istnieją powody, by je preferować?

Niestety, nie mogę znaleźć żadnych różnic w dokumentacji TensorFlow lub przewodniku, kiedy używać których z obu. W rzeczywistości praca z samouczkami TensorFlow wywołała wiele ostrzeżeń, ponieważ niektóre interfejsy najwyraźniej się zmieniły (zamiast parametru x, y, parametru input_fn itd.).

Odpowiedz

6

zastanawiałem się samo i nie może dać ostateczną odpowiedź, ale Mam kilku wykształconych domysły, które mogą pomóc:

Wydaje się, że tf.estimator.Estimator razem z funkcją modelu zwracającej tf.estimator.EstimatorSpec jest najbardziej aktualna który jest używany w nowszych przykładach i tym, który ma być użyty w nowym kodzie.

Domyślam się, że tf.contrib.learn.Estimator to wczesny prototyp, który został zastąpiony przez tf.estimator.Estimator. Według dokumentów wszystko w tf.contrib jest niestabilnym API, które może się zmienić w każdej chwili i wygląda na to, że moduł tf.estimator jest stabilnym API, który "ewoluował" z modułu tf.contrib.learn. Zakładam, że autorzy właśnie zapomnieli oznaczyć tf.contrib.learn.Estimator jako przestarzałe i że nie zostało ono jeszcze usunięte, aby istniejący kod nie został złamany.

0

Miałem to samo pytanie zadać.

Domyślam się, że tf.estimator.Estimator jest interfejsem wysokiego poziomu i zalecanym użyciem, podczas gdy tf.contrib.learn.Estimator jest tak mówiony, a nie interfejs wysokiego poziomu (ale tak naprawdę jest).

Jak wspomniał Christoph, tf.contrib jest niestabilny, więc tf.contrib.learn.Estimator jest podatny na zmiany. Został zmieniony z wersji 0.x na wersję 1.1 i zmieniony ponownie w 2016.12. Problem polega na tym, że użycie ich wydaje się inne. Możesz użyć tf.contrib.learn.SKCompat do owijania tf.contrib.learn.Estimator podczas gdy tf.estimator.Estimator, nie możesz zrobić tego samego. I wymóg/parametr model_fn jest inny, jeśli sprawdzasz komunikaty o błędach.

Wniosek jest taki, że te dwa prognozy to coś zupełnie innego!

Zresztą, myślę, że TF doc zrobił bardzo zły na ten temat od tf.estimator jest w ich stronę samouczka, co oznacza, że ​​są bardzo poważnie o tym ...

1

Aby dodać odpowiedź do Christoph.

Rozróżnienie tych pakietów zostały szczegółowo wymienione w Tensorflow Dev Summit 2017 by Martin Wicke:

Rozróżnienie pomiędzy rdzeniem i contrib jest naprawdę podstawowych rzeczy się nie zmieniają. Rzeczy są kompatybilne wstecz aż do wersji 2.0, i nikt teraz o tym nie myśli.

Jeśli masz coś w rdzeniu, jest stabilne, powinieneś go użyć. Jeśli masz coś w contrib, interfejs API może ulec zmianie i w zależności od twoich potrzeb możesz go lub nie chcesz używać.

Można więc pomyśleć o pakiecie tf.contrib jako "eksperymentalnym" lub "wczesnym podglądzie". W przypadku klas, które już są w wersjach tf.estimator i tf.contrib, zdecydowanie powinieneś używać wersji tf.estimator, ponieważ klasa tf.contrib jest automatycznie przestarzała (nawet jeśli nie jest to wyraźnie określone w dokumentacji) i może zostać usunięta w następnej wersji.

Od tensorflow 1,4 listy "absolwent" obejmuje zajęcia: Estimator DNNClassifier, DNNRegressor, LinearClassifier, LinearRegressor, DNNLinearCombinedClassifier, DNNLinearCombinedRegressor. Powinny one zostać przeniesione do tf.estimator.

Powiązane problemy