una tutorial notebook guardar graficos grafica español documentacion datos curso como comandos cargar python tensorflow protocol-buffers

python - tutorial - graficos pandas



TensorFlow guardando/cargando un gráfico desde un archivo (2)

Hay muchas formas de abordar el problema de guardar un modelo en TensorFlow, lo que puede hacer que sea un poco confuso. Tomando cada una de sus subpreguntas por turno:

  1. Los archivos de punto de control (producidos, por ejemplo, llamando a saver.save() en un objeto tf.train.Saver ) contienen solo los pesos y cualquier otra variable definida en el mismo programa. Para usarlos en otro programa, debe volver a crear la estructura gráfica asociada (por ejemplo, ejecutando código para construirlo nuevamente o llamando a tf.import_graph_def() ), que le dice a TensorFlow qué hacer con esos pesos. Tenga en cuenta que llamar a saver.save() también produce un archivo que contiene un MetaGraphDef , que contiene un gráfico y detalles sobre cómo asociar los pesos desde un punto de control con ese gráfico. Vea MetaGraphDef para más detalles.

  2. tf.train.write_graph() solo escribe la estructura del gráfico; No las pesas.

  3. Bazel no está relacionado con la lectura o escritura de gráficos TensorFlow. (Quizás no entiendo su pregunta: siéntase libre de aclararla en un comentario).

  4. Se puede cargar un gráfico congelado usando tf.import_graph_def() . En este caso, los pesos están (típicamente) integrados en el gráfico, por lo que no necesita cargar un punto de control separado.

  5. El cambio principal sería actualizar los nombres de los tensor (es) que se introducen en el modelo y los nombres de los tensor (es) que se obtienen del modelo. En la demostración de Android TensorFlow, esto correspondería a las inputName y outputName que se pasan a TensorFlowClassifier.initializeTensorFlow() .

  6. GraphDef es la estructura del programa, que generalmente no cambia a través del proceso de capacitación. El punto de control es una instantánea del estado de un proceso de capacitación, que generalmente cambia en cada paso del proceso de capacitación. Como resultado, TensorFlow utiliza diferentes formatos de almacenamiento para este tipo de datos, y la API de bajo nivel proporciona diferentes formas de guardarlos y cargarlos. Las bibliotecas de nivel superior, como las bibliotecas MetaGraphDef , Keras y skflow basan en estos mecanismos para proporcionar formas más convenientes de guardar y restaurar un modelo completo.

Por lo que he reunido hasta ahora, hay varias formas diferentes de volcar un gráfico TensorFlow en un archivo y luego cargarlo en otro programa, pero no he podido encontrar ejemplos / información claros sobre cómo funcionan. Lo que ya sé es esto:

  1. Guarde las variables del modelo en un archivo de punto de control (.ckpt) usando un tf.train.Saver() y restaure más tarde ( source )
  2. Guarde un modelo en un archivo .pb y cárguelo nuevamente usando tf.train.write_graph() y tf.import_graph_def() ( source )
  3. Cargue un modelo desde un archivo .pb, vuelva a entrenarlo y vuélvalo a un nuevo archivo .pb usando Bazel ( source )
  4. Congele el gráfico para guardar el gráfico y los pesos juntos ( source )
  5. Use as_graph_def() para guardar el modelo, y para pesos / variables, as_graph_def() en constantes ( source )

Sin embargo, no he podido aclarar varias preguntas con respecto a estos diferentes métodos:

  1. Con respecto a los archivos de puntos de control, ¿solo guardan los pesos entrenados de un modelo? ¿Podrían los archivos de puntos de control cargarse en un nuevo programa y usarse para ejecutar el modelo, o simplemente sirven como formas de guardar los pesos en un modelo en un determinado momento / etapa?
  2. Con respecto a tf.train.write_graph() , ¿también se guardan los pesos / variables?
  3. Con respecto a Bazel, ¿solo puede guardar / cargar desde archivos .pb para reentrenamiento? ¿Hay un simple comando de Bazel solo para volcar un gráfico en un .pb?
  4. Con respecto al congelamiento, ¿se puede cargar un gráfico congelado usando tf.import_graph_def() ?
  5. La demostración de Android para TensorFlow se carga en el modelo Inception de Google desde un archivo .pb. Si quisiera sustituir mi propio archivo .pb, ¿cómo lo haría? ¿Necesitaría cambiar algún código / método nativo?
  6. En general, ¿cuál es exactamente la diferencia entre todos estos métodos? O, en términos más generales, ¿cuál es la diferencia entre as_graph_def() /.ckpt/.pb?

En resumen, lo que estoy buscando es un método para guardar tanto un gráfico (como en las diversas operaciones y demás) como sus pesos / variables en un archivo, que luego se puede usar para cargar el gráfico y los pesos en otro programa , para uso (no necesariamente continua / reentrenamiento).

La documentación sobre este tema no es muy sencilla, por lo que cualquier respuesta / información sería muy apreciada.


Puedes probar el siguiente código:

with tf.gfile.FastGFile(''model/frozen_inference_graph.pb'', "rb") as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) g_in = tf.import_graph_def(graph_def, name="") sess = tf.Session(graph=g_in)