Google I/O est terminé ! Suivez les sessions TensorFlow Afficher les sessions

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 à tensorflow 2. Il complète général tensorflow guide de migration .

Pour TF2, TF Hub est passé loin de l'héritage hub.Module API pour la construction d' une tf.compat.v1.Graph comme tf.contrib.v1.layers font. Au lieu de cela, il y a maintenant un hub.KerasLayer pour une utilisation avec d' autres couches KERAS pour la construction d' un tf.keras.Model (généralement dans le nouveau TF2 environnement d'exécution désireux ) et son sous - jacent hub.load() méthode pour le code tensorflow bas niveau.

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

La nouvelle API de hub.load() et hub.KerasLayer œuvres pour tensorflow 1,15 (en mode graphique et désireux) et dans tensorflow 2. Cette nouvelle API peut charger les nouveaux TF2 SavedModel actifs, et, avec les restrictions énoncées dans le modèle guide de compatibilité , les modèles existants 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 de tensorflow Hub (ou services compatibles). Elle enveloppe de TF2 tf.saved_model.load() ; De tensorflow Guide SavedModel décrit ce que vous pouvez faire avec le résultat.

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

Le hub.KerasLayer appels de classe hub.load() et permettant d' adapter le résultat pour une utilisation dans Keras à côté d' autres couches KERAS. (Cela peut même être un wrapper pratique pour les SavedModels chargés utilisés d'autres manières.)

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 SavedModel TF2 dans un estimateur de formation 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 ConfigProto du tf.Session, ou bien 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)

A partir de TF2.2, cette option n'est expérimentale plus, et la .experimental pièce peut être abandonné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 tensorflow_hub version 0.7, vous pouvez utiliser le modèle existant 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 des tags , la signature , output_key et signature_outputs_as_dict pour plusieurs utilisations spécifiques des modèles existants au format TF1 Hub et SavedModels existants.

Pour de plus amples informations sur la compatibilité du format Hub TF1 voir le guide de compatibilité des modèles .

Utilisation d'API de niveau inférieur

Modèles de format Héritage TF1 Hub peuvent être chargés via tf.saved_model.load . À la place 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 tensorflow fonctions de béton calées 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.)