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

TF1 Hub-Format

Bei seiner Einführung im Jahr 2018 bot TensorFlow Hub eine einzige Art von Asset an: das TF1 Hub-Format für den Import in TensorFlow 1-Programme.

Auf dieser Seite wird erläutert, wie das TF1-Hub-Format in TF1 (oder im TF1-Kompatibilitätsmodus von TF2) mit der hub.Module Klasse und den zugehörigen APIs verwendet wird. (Die typische Verwendung besteht darin, einen tf.Graph zu tf.Graph , möglicherweise innerhalb eines TF1- Estimator , indem ein oder mehrere Modelle im TF1-Hub-Format mit tf.compat.layers oder tf.layers )

Benutzer von TensorFlow 2 (außerhalb des TF1-Kompatibilitätsmodus) müssen die neue API mit hub.load() oder hub.KerasLayer . Die neue API lädt den neuen TF2 SavedModel-Asset-Typ, unterstützt jedoch nur eingeschränkt das Laden des TF1 Hub-Formats in TF2 .

Verwenden eines Modells im TF1 Hub-Format

Instanziieren eines Modells im TF1 Hub-Format

Ein Modell im TF1-Hub-Format wird in ein TensorFlow-Programm importiert, indem ein hub.Module Objekt aus einer Zeichenfolge mit seiner URL oder seinem Dateisystempfad erstellt wird, z.

 m = hub.Module("path/to/a/module_dir")
 

Dadurch werden die Variablen des Moduls zum aktuellen TensorFlow-Diagramm hinzugefügt. Durch Ausführen der Initialisierer werden die vorab trainierten Werte von der Festplatte gelesen. Ebenso werden Tabellen und andere Status zum Diagramm hinzugefügt.

Caching-Module

Beim Erstellen eines Moduls aus einer URL wird der Modulinhalt heruntergeladen und im temporären Verzeichnis des lokalen Systems zwischengespeichert. Der Speicherort, an dem Module zwischengespeichert werden, kann mit der Umgebungsvariablen TFHUB_CACHE_DIR überschrieben werden. Weitere Informationen finden Sie unter Zwischenspeichern .

Modul anwenden

Einmal instanziiert, kann ein Modul m wie eine Python-Funktion von Tensoreingaben zu Tensorausgängen null oder mehrmals aufgerufen werden:

 y = m(x)
 

Jeder dieser Aufrufe fügt dem aktuellen TensorFlow-Diagramm Operationen hinzu, um y aus x zu berechnen. Wenn es sich um Variablen mit trainierten Gewichten handelt, werden diese von allen Anwendungen gemeinsam genutzt.

Module können mehrere benannte Signaturen definieren, um die Anwendung auf mehrere Arten zu ermöglichen (ähnlich wie bei Python-Objekten Methoden ). Die Dokumentation eines Moduls sollte die verfügbaren Signaturen beschreiben. Der obige Aufruf wendet die Signatur "default" . Jede Signatur kann ausgewählt werden, indem ihr Name an das optionale Argument signature= .

Wenn eine Signatur mehrere Eingaben hat, müssen diese als Diktat übergeben werden, wobei die Schlüssel durch die Signatur definiert werden. Wenn eine Signatur mehrere Ausgaben hat, können diese ebenfalls als as_dict=True abgerufen werden, indem as_dict=True unter den durch die Signatur definierten Schlüsseln übergeben wird (der Schlüssel "default" gilt für die einzelne Ausgabe, die zurückgegeben wird, wenn as_dict=False ). Die allgemeinste Form der Anwendung eines Moduls sieht also so aus:

 outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True)
y1 = outputs["cats"]
y2 = outputs["dogs"]
 

Ein Anrufer muss alle durch eine Signatur definierten Eingänge bereitstellen, es ist jedoch nicht erforderlich, alle Ausgänge eines Moduls zu verwenden. TensorFlow führt nur die Teile des Moduls aus, die als Abhängigkeiten eines Ziels in tf.Session.run() . In der Tat können Modulverleger wählen, verschiedene Ausgaben für fortgeschrittene Zwecke (wie die Aktivierung von Zwischenschichten) zusammen mit den Hauptausgaben bereitzustellen. Modulkonsumenten sollten zusätzliche Ausgaben ordnungsgemäß behandeln.

Alternative Module ausprobieren

Wenn mehrere Module für dieselbe Aufgabe vorhanden sind, empfiehlt TensorFlow Hub, sie mit kompatiblen Signartures (Schnittstellen) auszustatten, sodass das Ausprobieren verschiedener Module so einfach ist wie das Variieren des Modulhandles wie ein Hyperparameter mit Zeichenfolgen.

Zu diesem Zweck unterhalten wir eine Sammlung empfohlener allgemeiner Signaturen für beliebte Aufgaben.

Neues Modul erstellen

Kompatibilitätshinweis

Das TF1 Hub-Format ist auf TensorFlow 1 ausgerichtet. Es wird von TF Hub in TensorFlow 2 nur teilweise unterstützt. Bitte erwägen Sie stattdessen, im neuen TF2 SavedModel- Format zu veröffentlichen.

Das TF1 Hub-Format ähnelt dem SavedModel-Format von TensorFlow 1 auf syntaktischer Ebene (gleiche Dateinamen und Protokollnachrichten), ist jedoch semantisch unterschiedlich, um die Wiederverwendung, Zusammensetzung und Umschulung von Modulen zu ermöglichen (z. B. unterschiedliche Speicherung von Ressourceninitialisierern, unterschiedliche Kennzeichnung) Konventionen für Absätze). Der einfachste Weg, sie auf der Festplatte zu unterscheiden, ist das Vorhandensein oder Fehlen der Datei tfhub_module.pb .

Allgemeiner Ansatz

Um ein neues Modul zu definieren, ruft ein Publisher hub.create_module_spec() mit einer Funktion module_fn . Diese Funktion erstellt ein Diagramm, das die interne Struktur des Moduls darstellt, und verwendet tf.placeholder() für Eingaben, die vom Aufrufer bereitgestellt werden sollen. Anschließend werden Signaturen definiert, indem hub.add_signature(name, inputs, outputs) ein- oder mehrmals hub.add_signature(name, inputs, outputs) .

Beispielsweise:

 def module_fn():
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.dense(inputs, 200)
  layer2 = tf.layers.dense(layer1, 100)
  outputs = dict(default=layer2, hidden_activations=layer1)
  # Add default signature.
  hub.add_signature(inputs=inputs, outputs=outputs)

...
spec = hub.create_module_spec(module_fn)
 

Das Ergebnis von hub.create_module_spec() kann anstelle eines Pfads verwendet werden, um ein hub.create_module_spec() in einem bestimmten TensorFlow-Diagramm zu instanziieren. In diesem Fall gibt es keinen Prüfpunkt, und die Modulinstanz verwendet stattdessen die Variableninitialisierer.

Jede Modulinstanz kann über ihre export(path, session) auf die Festplatte serialisiert werden. Beim Exportieren eines Moduls wird seine Definition zusammen mit dem aktuellen Status seiner Variablen in der session in den übergebenen Pfad serialisiert. Dies kann sowohl beim ersten Exportieren eines Moduls als auch beim Exportieren eines fein abgestimmten Moduls verwendet werden.

Aus hub.LatestModuleExporter Kompatibilität mit TensorFlow Estimators exportiert hub.LatestModuleExporter Module vom neuesten Prüfpunkt, genau wie tf.estimator.LatestExporter exportiert das gesamte Modell vom neuesten Prüfpunkt.

Modulverleger sollten nach Möglichkeit eine gemeinsame Signatur implementieren, damit Verbraucher problemlos Module austauschen und die beste für ihr Problem finden können.

Echtes Beispiel

In unserem Exporter für Texteinbettungsmodule finden Sie ein Beispiel aus der Praxis, wie Sie ein Modul aus einem gängigen Texteinbettungsformat erstellen.

Feintuning

Das Trainieren der Variablen eines importierten Moduls zusammen mit denen des umgebenden Modells wird als Feinabstimmung bezeichnet . Eine Feinabstimmung kann zu einer besseren Qualität führen, führt jedoch zu neuen Komplikationen. Wir empfehlen den Verbrauchern, die Feinabstimmung erst zu prüfen, nachdem sie einfachere Qualitätsverbesserungen untersucht haben, und nur dann, wenn der Modulhersteller dies empfiehlt.

Für Verbraucher

Um die Feinabstimmung zu aktivieren, instanziieren Sie das Modul mit hub.Module(..., trainable=True) , um seine Variablen trainierbar zu machen und TensorFlows REGULARIZATION_LOSSES zu REGULARIZATION_LOSSES . Wenn das Modul mehrere Diagrammvarianten hat, stellen Sie sicher, dass Sie die für das Training geeignete auswählen. Normalerweise ist dies der mit den Tags {"train"} .

Wählen Sie ein Trainingsprogramm, das die vorab trainierten Gewichte nicht ruiniert, z. B. eine niedrigere Lernrate als beim Training von Grund auf.

Für Verlage

Beachten Sie Folgendes, um den Verbrauchern die Feinabstimmung zu erleichtern:

  • Die Feinabstimmung muss reguliert werden. Ihr Modul wird mit der REGULARIZATION_LOSSES Auflistung exportiert. REGULARIZATION_LOSSES wird Ihre Auswahl an tf.layers.dense(..., kernel_regularizer=...) usw. in das umgewandelt, was der Verbraucher von tf.losses.get_regularization_losses() erhält. Bevorzugen Sie diese Art der Definition von L1 / L2-Regularisierungsverlusten.

  • Vermeiden Sie es im Publisher-Modell, die L1 / L2-Regularisierung über die Parameter l1_ und l2_regularization_strength von tf.train.FtrlOptimizer , tf.train.ProximalGradientDescentOptimizer und anderen proximalen Optimierern zu definieren. Diese werden nicht zusammen mit dem Modul exportiert, und das globale Festlegen von Regularisierungsstärken ist für den Verbraucher möglicherweise nicht geeignet. Mit Ausnahme der L1-Regularisierung in breiten (dh spärlichen linearen) oder breiten und tiefen Modellen sollte es möglich sein, stattdessen einzelne Regularisierungsverluste zu verwenden.

  • Wenn Sie Dropout, Batch-Normalisierung oder ähnliche Trainingstechniken verwenden, setzen Sie deren Hyperparameter auf Werte, die für viele erwartete Anwendungen sinnvoll sind. Die Abbrecherquote muss möglicherweise an die Neigung des Zielproblems zur Überanpassung angepasst werden. Bei der Chargennormalisierung sollte der Impuls (auch als Abklingkoeffizient bezeichnet) klein genug sein, um eine Feinabstimmung mit kleinen Datensätzen und / oder großen Chargen zu ermöglichen. Für fortgeschrittene Verbraucher sollten Sie eine Signatur hinzufügen, die die Kontrolle über kritische Hyperparameter ermöglicht.