web-dev-qa-db-fra.com

Comment conserver les tables de recherche initialisées pour la prédiction (et pas seulement pour la formation)?

Je crée une table de recherche à partir de tf.contrib.lookup , en utilisant les données d'entraînement (en entrée). Ensuite, je passe chaque entrée dans cette table de recherche, avant de la passer dans mon modèle.

Cela fonctionne pour la formation, mais quand il s'agit de prédiction en ligne à partir de ce même modèle, cela soulève l'erreur:

Tableau non initialisé

J'utilise SavedModel pour enregistrer le modèle. Je lance la prédiction à partir de ce modèle enregistré.

Comment puis-je initialiser ce tableau pour qu'il reste initialisé? Ou existe-t-il un meilleur moyen d'enregistrer le modèle afin que le tableau soit toujours initialisé?

17
aka

Vous pouvez spécifier une opération "d'initialisation" lorsque vous ajoutez un méta-graphique à votre bundle SavedModel avec tf.saved_model.builder.SavedModelBuilder.add_meta_graph , en utilisant le main_op ou legacy_init_op kwarg. Vous pouvez soit utiliser une seule opération, soit regrouper un certain nombre d'opérations avec tf.group si vous en avez besoin de plusieurs.

Notez que dans Cloud ML Engine, vous devrez utiliser le legacy_init_op. Cependant à l'avenir runtime_versions vous pourrez utiliser main_op (IIRC, commençant par runtime_version == 1.2)

Le module save_model fournit un tf.saved_model.main_op.main_op pour récapituler les actions d'initialisation courantes en une seule opération (initialisation de variable locale et initialisation de table).

Donc, en résumé, le code devrait ressembler à ceci (adapté de cet exemple ):

  exporter = tf.saved_model.builder.SavedModelBuilder(
      os.path.join(job_dir, 'export', name))

  # signature_def gets constructed here

  with tf.Session(graph=prediction_graph) as session:
    # Need to be initialized before saved variables are restored
    session.run([tf.local_variables_initializer(), tf.tables_initializer()])
    # Restore the value of the saved variables
    saver.restore(session, latest)
    exporter.add_meta_graph_and_variables(
        session,
        tags=[tf.saved_model.tag_constants.SERVING],
        signature_def_map={
            tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature_def
        },
        # Relevant change to the linked example is here!
        legacy_init_op=tf.saved_model.main_op.main_op()
    )

REMARQUE: si vous utilisez les bibliothèques de haut niveau (telles que tf.estimator ) ce devrait être la valeur par défaut, et si vous devez spécifier des actions d'initialisation supplémentaires, vous pouvez les spécifier dans le cadre de tf.train.Scaffold objet que vous passez à votre tf.estimator.EstimatorSpec dans votre model_fn.

6
Eli Bixby

Je pense que vous feriez mieux d'utiliser tf.tables_initializer() comme legacy_init_op.

tf.saved_model.main_op.main_op() ajoute également des opérations d'initialisation locales et globales en plus de l'initialisation de la table. lorsque vous chargez le modèle enregistré et qu'il exécute le legacy_init_op, il réinitialise vos variables, ce qui n'est pas ce que vous voulez.

11
user8272338