Migrer de TF1 vers TF2 avec TensorFlow Hub

Cette page explique comment continuer à utiliser TensorFlow Hub lors de la migration de votre code TensorFlow de TensorFlow 1 vers TensorFlow 2. Elle complète le guide de migration général de TensorFlow.

Pour TF2, TF Hub s'est éloigné de l'ancienne API hub.Module pour créer un tf.compat.v1.Graph comme le fait tf.contrib.v1.layers . Au lieu de cela, il existe désormais un hub.KerasLayer à utiliser avec d'autres couches Keras pour créer un tf.keras.Model (généralement dans le nouvel environnement d'exécution impatient de TF2) et sa méthode hub.load() sous-jacente pour le code TensorFlow de bas niveau.

L'API hub.Module reste disponible dans la bibliothèque tensorflow_hub pour une utilisation dans TF1 et dans le mode de compatibilité TF1 de TF2. Il ne peut charger que des modèles au format TF1 Hub .

La nouvelle API de hub.load() et hub.KerasLayer fonctionne pour TensorFlow 1.15 (en mode impatient et graphique) et dans TensorFlow 2. Cette nouvelle API peut charger les nouveaux actifs TF2 SavedModel et, avec les restrictions énoncées dans le modèle guide de compatibilité , les anciens modèles au format TF1 Hub.

En général, il est recommandé d'utiliser une nouvelle API dans la mesure du possible.

Résumé de la nouvelle API

hub.load() est la nouvelle fonction de bas niveau permettant de charger un SavedModel à partir de TensorFlow Hub (ou de services compatibles). Il enveloppe tf.saved_model.load() de TF2 ; Le Guide SavedModel de TensorFlow décrit ce que vous pouvez faire avec le résultat.

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

La classe hub.KerasLayer appelle hub.load() et adapte le résultat pour une utilisation dans Keras aux côtés d'autres couches Keras. (Il peut même s'agir d'un wrapper pratique pour les SavedModels chargés utilisés d'autres manières.)

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

De nombreux didacticiels montrent ces API en action. Voici quelques exemples:

Utilisation de la nouvelle API dans la formation Estimateur

Si vous utilisez un TF2 SavedModel dans un Estimator pour l'entraînement avec des serveurs de paramètres (ou sinon dans une Session TF1 avec des variables placées sur des appareils distants), vous devez définir experimental.share_cluster_devices_in_session dans le ConfigProto de tf.Session, sinon vous obtiendrez une erreur comme "Le périphérique attribué '/job:ps/replica:0/task:0/device:CPU:0' ne correspond à aucun périphérique."

L'option nécessaire peut être définie comme

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)

À partir de TF2.2, cette option n’est plus expérimentale et la partie .experimental peut être supprimée.

Chargement des anciens modèles au format TF1 Hub

Il peut arriver qu'un nouveau TF2 SavedModel ne soit pas encore disponible pour votre cas d'utilisation et que vous deviez charger un ancien modèle au format TF1 Hub. À partir de la version 0.7 tensorflow_hub , vous pouvez utiliser l'ancien modèle au format TF1 Hub avec hub.KerasLayer comme indiqué ci-dessous :

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

De plus, KerasLayer expose la possibilité de spécifier tags , signature , output_key et signature_outputs_as_dict pour des utilisations plus spécifiques des modèles hérités au format TF1 Hub et des SavedModels hérités.

Pour plus d'informations sur la compatibilité des formats TF1 Hub consultez le guide de compatibilité des modèles .

Utiliser des API de niveau inférieur

Les anciens modèles au format TF1 Hub peuvent être chargés via tf.saved_model.load . Au lieu de

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

il est recommandé d'utiliser :

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

Dans ces exemples, m.signatures est un dict de fonctions concrètes TensorFlow saisies par des noms de signature. L'appel d'une telle fonction calcule toutes ses sorties, même si elles ne sont pas utilisées. (Ceci est différent de l'évaluation paresseuse du mode graphique de TF1.)