Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Migration von TF1 zu TF2 mit TensorFlow Hub

Auf dieser Seite wird erläutert, wie Sie TensorFlow Hub weiterhin verwenden, während Sie Ihren TensorFlow-Code von TensorFlow 1 nach TensorFlow 2 migrieren. Sie ergänzt das allgemeine Migrationshandbuch von TensorFlow.

Für TF2 hat TF Hub von der hub.Module API zum tf.compat.v1.Graph eines tf.compat.v1.Graph wie tf.contrib.v1.layers . Stattdessen gibt es jetzt einen hub.KerasLayer , der zusammen mit anderen Keras-Ebenen zum tf.keras.Model eines tf.keras.Model (normalerweise in der neuen eifrigen Ausführungsumgebung von TF2) und der zugrunde liegenden hub.load() -Methode für TensorFlow-Code auf niedriger Ebene verwendet werden kann.

Die hub.Module API bleibt in der Bibliothek tensorflow_hub zur Verwendung in TF1 und im TF1-Kompatibilitätsmodus von TF2 verfügbar. Es können nur Modelle im TF1 Hub-Format geladen werden .

Die neue API von hub.load() und hub.KerasLayer funktioniert für TensorFlow 1.15 (im hub.KerasLayer und Grafikmodus) und in TensorFlow 2. Diese neue API kann die neuen TF2 SavedModel- Assets und mit den im Modell festgelegten Einschränkungen laden Kompatibilitätshandbuch , die Legacy-Modelle im TF1 Hub-Format.

Im Allgemeinen wird empfohlen, wo immer möglich eine neue API zu verwenden.

Zusammenfassung der neuen API

hub.load() ist die neue Low-Level-Funktion zum Laden eines SavedModel von TensorFlow Hub (oder kompatiblen Diensten). Es tf.saved_model.load() ; Das SavedModel-Handbuch von TensorFlow beschreibt, was Sie mit dem Ergebnis tun können.

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

Die hub.KerasLayer Klasse ruft hub.load() und passt das Ergebnis für die Verwendung in Keras zusammen mit anderen Keras-Ebenen an. (Es kann sogar ein praktischer Wrapper für geladene SavedModels sein, die auf andere Weise verwendet werden.)

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

Viele Tutorials zeigen diese APIs in Aktion. Siehe insbesondere

Verwenden der neuen API im Estimator-Training

Wenn Sie ein TF2 SavedModel in einem Estimator für das Training mit Parameterservern verwenden (oder auf andere Weise in einer TF1-Sitzung mit Variablen, die auf Remote-Geräten gespeichert sind), müssen Sie experimental.share_cluster_devices_in_session in ConfigProto von tf.Session festlegen. Andernfalls wird eine Fehlermeldung angezeigt wie "Zugewiesenes Gerät '/ job: ps / replica: 0 / task: 0 / device: CPU: 0' stimmt mit keinem Gerät überein."

Die notwendige Option kann wie folgt eingestellt werden

 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)
 

Ab TF2.2 ist diese Option nicht mehr experimentell und das .experimental kann fallengelassen werden.

Laden älterer Modelle im TF1 Hub-Format

Es kann vorkommen, dass ein neues TF2 SavedModel für Ihren Anwendungsfall noch nicht verfügbar ist und Sie ein Legacy-Modell im TF1 Hub-Format laden müssen. Ab tensorflow_hub Release 0.7 können Sie das Legacy-Modell im TF1-Hub-Format zusammen mit hub.KerasLayer wie hub.KerasLayer :

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

Zusätzlich KerasLayer die Möglichkeit, tags , signature , output_key und signature_outputs_as_dict für spezifischere Verwendungen von Legacy-Modellen im TF1 Hub-Format und Legacy-SavedModels anzugeben.

Weitere Informationen zur Kompatibilität des TF1 Hub-Formats finden Sie im Modellkompatibilitätshandbuch .

Verwenden von APIs niedrigerer Ebene

Legacy-Modelle im TF1-Hub-Format können über tf.saved_model.load geladen werden. Anstatt

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

Es wird empfohlen:

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

In diesen Beispielen ist m.signatures ein Diktat von TensorFlow- konkreten Funktionen, die durch Signaturnamen m.signatures sind. Durch Aufrufen einer solchen Funktion werden alle ihre Ausgaben berechnet, auch wenn sie nicht verwendet werden. (Dies unterscheidet sich von der verzögerten Auswertung des Grafikmodus von TF1.)