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é?
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_version
s 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.
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.