¿Cómo mantener las tablas de búsqueda inicializadas para la predicción (y no solo el entrenamiento)?

Creo una tabla de búsqueda desde tf.contrib.lookup , utilizando los datos de entrenamiento (como entrada). Luego, paso cada entrada a través de esa tabla de búsqueda, antes de pasarla a través de mi modelo.

Esto funciona para el entrenamiento, pero cuando se trata de la predicción en línea de este mismo modelo, genera el error:

Tabla no inicializada

Estoy usando SavedModel para guardar el modelo. Ejecuto la predicción de este modelo guardado.

¿Cómo puedo inicializar esta tabla para que permanezca inicializada? ¿O hay una mejor manera de guardar el modelo para que la tabla siempre se inicialice?

    Puede especificar una operación de “inicialización” cuando agrega un meta gráfico a su paquete tf.saved_model.builder.SavedModelBuilder.add_meta_graph con tf.saved_model.builder.SavedModelBuilder.add_meta_graph , usando main_op o legacy_init_op kwarg. Puede usar una sola operación o agrupar varias operaciones con tf.group si necesita más de una.

    Tenga en cuenta que en Cloud ML Engine, deberá utilizar legacy_init_op . Sin embargo, en futuros runtime_version s podrá utilizar main_op (IIRC, comenzando con runtime_version == 1.2 )

    El módulo saved_model proporciona un tf.saved_model.main_op.main_op para tf.saved_model.main_op.main_op las acciones de inicialización comunes en una sola operación (inicialización de variables locales e inicialización de tablas).

    Entonces, en resumen, el código debería verse así (adaptado de este ejemplo ):

      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 restred session.run([tf.local_variables_initializer(), tf.tables_initializer()]) # Restore the value of the saved variables saver.restre(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() ) 

    NOTA: Si está utilizando las bibliotecas de alto nivel (como tf.estimator ), este debe ser el predeterminado, y si necesita especificar acciones de inicialización adicionales, puede especificarlas como parte del objeto tf.train.Scaffold que pasa su tf.estimator.EstimatorSpec en su model_fn.

    Creo que sería mejor usar tf.tables_initializer() como legacy_init_op .

    tf.saved_model.main_op.main_op() también agrega operaciones de inicialización local y global además de la inicialización de tablas. cuando carga el modelo guardado y ejecuta legacy_init_op , restablecería sus variables, que no es lo que desea.