Exporter un modèle enregistré

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

Cette page décrit les détails de l'exportation (enregistrement) d'un modèle à partir d'un programme TensorFlow vers le format SavedModel de TensorFlow 2 . Ce format est le moyen recommandé pour partager des modèles et des éléments de modèle pré-entraînés sur TensorFlow Hub. Il remplace l'ancien format TF1 Hub et est livré avec un nouvel ensemble d'API. Vous trouverez plus d'informations sur l'export des modèles au format Hub TF1 dans Export au format Hub TF1 . Vous pouvez trouver des détails sur la façon de compresser le SavedModel pour le partager sur TensorFlow Hub ici .

Certaines boîtes à outils de création de modèles fournissent déjà des outils pour ce faire (par exemple, voir ci-dessous pour TensorFlow Model Garden ).

Aperçu

SavedModel est le format de sérialisation standard de TensorFlow pour les modèles entraînés ou les pièces de modèle. Il stocke les poids entraînés du modèle avec les opérations TensorFlow exactes pour effectuer son calcul. Il peut être utilisé indépendamment du code qui l'a créé. En particulier, il peut être réutilisé dans différentes API de création de modèles de haut niveau comme Keras, car les opérations TensorFlow sont leur langage de base commun.

Sauvegarde depuis Keras

À partir de TensorFlow 2, tf.keras.Model.save() et tf.keras.models.save_model() par défaut le format SavedModel (pas HDF5). Les SavedModels résultants qui peuvent être utilisés avec hub.load() , hub.KerasLayer et des adaptateurs similaires pour d'autres API de haut niveau dès qu'ils sont disponibles.

Pour partager un modèle Keras complet, enregistrez-le simplement avec include_optimizer=False .

Pour partager une partie d'un modèle Keras, faites de la pièce un modèle en soi, puis enregistrez-le. Vous pouvez soit présenter le code comme ça depuis le début...

piece_to_share = tf.keras.Model(...)
full_model = tf.keras.Sequential([piece_to_share, ...])
full_model.fit(...)
piece_to_share.save(...)

... ou découpez la pièce à partager après coup (si elle s'aligne sur la superposition de votre modèle complet) :

full_model = tf.keras.Model(...)
sharing_input = full_model.get_layer(...).get_output_at(0)
sharing_output = full_model.get_layer(...).get_output_at(0)
piece_to_share = tf.keras.Model(sharing_input, sharing_output)
piece_to_share.save(..., include_optimizer=False)

TensorFlow Models sur GitHub utilise la première approche pour BERT (voir nlp/tools/export_tfhub_lib.py , notez la séparation entre core_model pour l'exportation et le pretrainer -entraîneur pour restaurer le point de contrôle) et la dernière approche pour ResNet (voir legacy/image_classification/tfhub_export. pi ).

Enregistrement à partir de TensorFlow de bas niveau

Cela nécessite une bonne connaissance du guide SavedModel de TensorFlow.

Si vous souhaitez fournir plus qu'une simple signature de diffusion, vous devez implémenter l' interface Reusable SavedModel . Conceptuellement, cela ressemble à

class MyMulModel(tf.train.Checkpoint):
  def __init__(self, v_init):
    super().__init__()
    self.v = tf.Variable(v_init)
    self.variables = [self.v]
    self.trainable_variables = [self.v]
    self.regularization_losses = [
        tf.function(input_signature=[])(lambda: 0.001 * self.v**2),
    ]

  @tf.function(input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])
  def __call__(self, inputs):
    return tf.multiply(inputs, self.v)

tf.saved_model.save(MyMulModel(2.0), "/tmp/my_mul")

layer = hub.KerasLayer("/tmp/my_mul")
print(layer([10., 20.]))  # [20., 40.]
layer.trainable = True
print(layer.trainable_weights)  # [2.]
print(layer.losses)  # 0.004

Conseils aux créateurs de SavedModel

Lors de la création d'un SavedModel pour le partage sur TensorFlow Hub, pensez à l'avance si et comment ses utilisateurs doivent l'ajuster, et fournissez des conseils dans la documentation.

La sauvegarde à partir d'un modèle Keras devrait permettre à tous les mécanismes de réglage fin de fonctionner (sauvegarder les pertes de régularisation du poids, déclarer des variables entraînables, tracer __call__ pour training=True et training=False , etc.)

Choisissez une interface de modèle qui fonctionne bien avec le flux de gradient, par exemple, les logits de sortie au lieu des probabilités softmax ou des prédictions top-k.

Si le modèle utilise l'abandon, la normalisation par lots ou des techniques de formation similaires qui impliquent des hyperparamètres, définissez-les sur des valeurs qui ont du sens pour de nombreux problèmes cibles et tailles de lots attendus. (Au moment d'écrire ces lignes, économiser de Keras ne permet pas aux consommateurs de les ajuster facilement.)

Les régularisateurs de poids sur les couches individuelles sont enregistrés (avec leurs coefficients de force de régularisation), mais la régularisation du poids à partir de l'optimiseur (comme tf.keras.optimizers.Ftrl.l1_regularization_strength=...) ) est perdue. Informez les consommateurs de votre SavedModel en conséquence.

Jardin modèle TensorFlow

Le référentiel TensorFlow Model Garden contient de nombreux exemples de création de modèles enregistrés TF2 réutilisables à télécharger sur tfhub.dev .

Demandes de la communauté

L'équipe TensorFlow Hub ne génère qu'une petite partie des ressources disponibles sur tfhub.dev. Nous nous appuyons principalement sur des chercheurs de Google et de Deepmind, des instituts de recherche d'entreprise et universitaires et des passionnés de ML pour produire des modèles. Par conséquent, nous ne pouvons pas garantir que nous pourrons répondre aux demandes de la communauté pour des actifs spécifiques, et nous ne pouvons pas fournir d'estimations de temps pour la disponibilité de nouveaux actifs.

L' étape des demandes de modèle communautaire ci-dessous contient des demandes de la communauté pour des actifs spécifiques - si vous ou quelqu'un que vous connaissez êtes intéressé à produire l'actif et à le partager surtfhub.dev, nous nous félicitons de la soumission!