Migracja z TF1 do TF2 za pomocą TensorFlow Hub

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

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.)