Na tej stronie wyjaśniono, jak nadal korzystać z TensorFlow Hub podczas migracji kodu TensorFlow z TensorFlow 1 do TensorFlow 2. Uzupełnia ona ogólny przewodnik migracji TensorFlow.
W przypadku TF2 TF Hub zrezygnował ze starszego interfejsu API hub.Module
do tworzenia tf.compat.v1.Graph
, tak jak robią to tf.contrib.v1.layers
. Zamiast tego istnieje teraz hub.KerasLayer
, której można używać wraz z innymi warstwami Keras do budowania modelu tf.keras.Model
(zwykle w nowym środowisku szybkiego wykonywania TF2) oraz leżąca u jej podstaw hub.load()
dla niskopoziomowego kodu TensorFlow.
Interfejs API hub.Module
pozostaje dostępny w bibliotece tensorflow_hub
do użytku w TF1 i w trybie zgodności TF1 TF2. Może ładować tylko modele w formacie TF1 Hub .
Nowy interfejs API hub.load()
i hub.KerasLayer
działa dla TensorFlow 1.15 (w trybie chętnym i wykresowym) oraz w TensorFlow 2. Ten nowy interfejs API może ładować nowe zasoby TF2 SavedModel i, z ograniczeniami określonymi w modelu przewodnik zgodności , starsze modele w formacie TF1 Hub.
Ogólnie rzecz biorąc, zaleca się używanie 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 zgodnych 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 razem z innymi warstwami Keras. (Może to być nawet wygodne opakowanie dla załadowanych modeli SavedModels używanych w inny sposób).
model = tf.keras.Sequential([
hub.KerasLayer(handle),
...])
Wiele samouczków pokazuje te interfejsy API w akcji. Zobacz w szczególności
Korzystanie z nowego interfejsu API w szkoleniu Estimator
Jeśli używasz TF2 SavedModel w estymatorze do trenowania 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, a fragment .experimental
można odrzucić.
Ładowanie starszych modeli w formacie TF1 Hub
Może się zdarzyć, że nowy TF2 SavedModel nie jest jeszcze dostępny dla twojego przypadku użycia i musisz załadować starszy model w formacie TF1 Hub. Począwszy od wersji 0.7 tensorflow_hub
, możesz 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ślania tags
, signature
, klucza wyjściowego i output_key
dla bardziej szczegółowych zastosowań starszych modeli w formacie TF1 Hub i starszych modeli signature_outputs_as_dict
.
Aby uzyskać więcej informacji na temat zgodności formatu TF1 Hub, zobacz przewodnik 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 dyktatem konkretnych funkcji TensorFlow z kluczami według nazw sygnatur. Wywołanie takiej funkcji oblicza wszystkie jej wyjścia, nawet jeśli nie są używane. (Różni się to od leniwej oceny trybu graficznego TF1.)