Migracja z TF1 do TF2 za pomocą TensorFlow Hub

Na tej stronie wyjaśniono, jak nadal korzystać z TensorFlow Hub podczas migracji kodu TensorFlow z TensorFlow 1 do TensorFlow 2. Stanowi ona uzupełnienie ogólnego przewodnika po migracji TensorFlow.

W przypadku TF2 TF Hub odszedł od starszego interfejsu API hub.Module do tworzenia tf.compat.v1.Graph , tak jak robi to tf.contrib.v1.layers . Zamiast tego dostępna jest teraz metoda hub.KerasLayer , której można używać wraz z innymi warstwami Keras do budowania tf.keras.Model (zazwyczaj w nowym środowisku wykonawczym TF2) i leżącej u jej podstaw metody hub.load() dla niskopoziomowego kodu TensorFlow.

Interfejs API hub.Module pozostaje dostępny w bibliotece tensorflow_hub do użycia w TF1 i w trybie zgodności TF1 w TF2. Może ładować tylko modele w formacie TF1 Hub .

Nowe API hub.load() i hub.KerasLayer działa w TensorFlow 1.15 (w trybie Eacher i graph) oraz w TensorFlow 2. To nowe API może ładować nowe zasoby TF2 SavedModel oraz, z ograniczeniami określonymi w modelu przewodnik po kompatybilności , starsze modele w formacie TF1 Hub.

Ogólnie rzecz biorąc, zaleca się stosowanie nowego API tam, gdzie jest to możliwe.

Podsumowanie nowego API

hub.load() to nowa funkcja niskiego poziomu służąca do ładowania SavedModel z TensorFlow Hub (lub kompatybilnych usług). Zawija tf.saved_model.load() TF2 ; Przewodnik SavedModel TensorFlow opisuje, co możesz zrobić z wynikiem.

m = hub.load(handle)
outputs = m(inputs)

Klasa hub.KerasLayer wywołuje hub.load() i dostosowuje wynik do użycia w Keras wraz z innymi warstwami Keras. (Może to być nawet wygodne opakowanie dla załadowanych SavedModels używanych w inny sposób.)

model = tf.keras.Sequential([
    hub.KerasLayer(handle),
    ...])

Wiele samouczków przedstawia te interfejsy API w akcji. Oto kilka przykładów:

Wykorzystanie nowego API w szkoleniu z Estymatora

Jeśli używasz TF2 SavedModel w estymatorze do uczenia z serwerami parametrów (lub w inny sposób w sesji TF1 ze zmiennymi umieszczonymi na zdalnych urządzeniach), musisz ustawić experimental.share_cluster_devices_in_session w ConfigProto tf.Session, w przeciwnym razie pojawi się błąd na przykład „Przypisane urządzenie „/job:ps/replica:0/task:0/device:CPU:0” nie pasuje do żadnego urządzenia.”

Niezbędną opcję można ustawić jak

session_config = tf.compat.v1.ConfigProto()
session_config.experimental.share_cluster_devices_in_session = True
run_config = tf.estimator.RunConfig(..., session_config=session_config)
estimator = tf.estimator.Estimator(..., config=run_config)

Począwszy od TF2.2, ta opcja nie jest już eksperymentalna i element .experimental może zostać porzucony.

Ładowanie starszych modeli w formacie TF1 Hub

Może się zdarzyć, że nowy zapisany model TF2 nie będzie jeszcze dostępny dla twojego przypadku użycia i będziesz musiał załadować starszy model w formacie TF1 Hub. Począwszy od wersji 0.7 tensorflow_hub , można używać starszego modelu w formacie TF1 Hub razem z hub.KerasLayer , jak pokazano poniżej:

m = hub.KerasLayer(handle)
tensor_out = m(tensor_in)

Dodatkowo KerasLayer udostępnia możliwość określenia tags , signature , output_key i signature_outputs_as_dict dla bardziej specyficznych zastosowań starszych modeli w formacie TF1 Hub i starszych SavedModels.

Więcej informacji na temat zgodności formatu TF1 Hub można znaleźć w przewodniku po zgodności modeli .

Korzystanie z interfejsów API niższego poziomu

Starsze modele w formacie TF1 Hub można ładować za pośrednictwem tf.saved_model.load . Zamiast

# DEPRECATED: TensorFlow 1
m = hub.Module(handle, tags={"foo", "bar"})
tensors_out_dict = m(dict(x1=..., x2=...), signature="sig", as_dict=True)

zaleca się stosowanie:

# TensorFlow 2
m = hub.load(path, tags={"foo", "bar"})
tensors_out_dict = m.signatures["sig"](x1=..., x2=...)

W tych przykładach m.signatures jest dyktando konkretnych funkcji TensorFlow oznaczonych nazwami podpisów. Wywołanie takiej funkcji powoduje obliczenie wszystkich jej wyników, nawet jeśli są nieużywane. (Różni się to od leniwej oceny trybu graficznego TF1.)