Cette page a été traduite par l'API Cloud Translation.
Switch to English

Migration 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 général de migration de TensorFlow.

Pour TF2, TF Hub s'est éloigné de l' hub.Module API hub.Module pour créer un tf.compat.v1.Graph comme le font tf.contrib.v1.layers . Au lieu de cela, il existe maintenant 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 impatiente 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 hâte 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 pour charger un SavedModel à partir de TensorFlow Hub (ou de services compatibles). Il tf.saved_model.load() le 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 avec d'autres couches Keras. (Cela peut même être un wrapper pratique pour les SavedModels chargés utilisés d'une autre manière.)

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

De nombreux tutoriels montrent ces API en action. Voir en particulier

Utilisation de la nouvelle API dans la formation Estimator

Si vous utilisez un TF2 SavedModel dans un Estimator pour l'entraînement avec des serveurs de paramètres (ou autrement dans une session TF1 avec des variables placées sur des périphériques distants), vous devez définir experimental.share_cluster_devices_in_session dans le ConfigProto de tf.Session, sinon vous obtiendrez une erreur comme "Périphérique affecté '/ travail: ps / réplica: 0 / tâche: 0 / périphérique: 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 pièce .experimental peut être supprimée.

Chargement des modèles hérités 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 modèle hérité au format TF1 Hub. À partir de la version 0.7 de tensorflow_hub , vous pouvez utiliser le modèle hérité au format TF1 Hub avec hub.KerasLayer comme indiqué ci-dessous:

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

De plus, KerasLayer la possibilité de spécifier des tags , une signature , une output_key et une 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é du format TF1 Hub, consultez le guide de compatibilité des modèles .

Utilisation d'API de niveau inférieur

Les modèles au format Legacy 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 m.signatures 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.)