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ć usunięty.
Ł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 kompatybilnoś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.)