Convertir Keras model a C++


Estoy usando Keras (con Theano) para entrenar a mi modelo de CNN. ¿Alguien tiene idea de cómo puedo usarlo en mi aplicación de C++? ¿Alguien intentó algo similar? Tengo idea de escribir algún código python que generará un código c++ con funciones de red - ¿alguna sugerencia al respecto?

Encontré una pregunta similar aquí cómo usar el modelo Tensorflow Keras en C++ pero sin respuesta.

Author: Community, 2016-04-19

6 answers

Para responder a mi propia pregunta y tener una solución - escribí una solución simple de c++ llamada keras2cpp (su código está disponible en github).

En esta solución se almacena la arquitectura de red (en json) y los pesos (en hdf5). Luego puede volcar una red a un archivo de texto sin formato con el script proporcionado. Puede utilizar el archivo de texto obtenido con la red en código c++ puro. No hay dependencias en bibliotecas python o hdf5. Debería funcionar para el backend de theano y tensorflow.

 26
Author: pplonski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-23 07:41:30

Me encontré en una situación similar, pero necesitaba no solo soportar pases hacia adelante de modelos Keras secuenciales en C++, sino también de modelos más complejos construidos con la API funcional .

Así que escribí una nueva biblioteca llamada frugalmente-profundo. Lo puedes encontrar en GitHub y está publicado bajo la licencia MIT: https://github.com/Dobiasd/frugally-deep

Además de soportar muchos tipos de capas comunes, puede mantenerse al día (y a veces incluso superar) con el rendimiento de TensorFlow en una sola CPU. Puede encontrar resultados de referencia actualizados para algún modelo común en el repositorio .

Mediante pruebas automáticas frugalmente profundas garantiza que la salida de un modelo utilizado con él en C++ es exactamente la misma que si se ejecuta con Keras en Python.

 9
Author: Tobias Hermann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-09 14:50:20

La forma más fácil es probablemente hacer una llamada al sistema a un script Python que escribe las predicciones en un archivo binario o HDF5, que se puede leer desde C++. También puede integrar directamente Python en C++.

Si necesita implementar y distribuir esto fácilmente, puede buscar en instalaciones autónomas de Python como Anaconda, pero su mejor opción puede ser evitar Keras y usar la interfaz de C++ para Caffe o Tensorflow. No lo recomendaría Tensorflow ya que usarlo desde C++ no es estándar; vea esta discusión. Caffe es posiblemente la segunda biblioteca de aprendizaje profundo más popular por lo que realmente no puede equivocarse.

 3
Author: 1'',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-18 08:42:33

Si su modelo de keras está entrenado usando el motor tensorflow, puede guardar el modelo de keras como un modelo tensorflow siguiendo este código: https://github.com/amir-abdi/keras_to_tensorflow

Aquí hay una versión más corta del código:

from keras import backend as K
from tensorflow.python.framework import graph_util
from tensorflow.python.framework import graph_io

weight_file_path = 'path to your keras model'
net_model = load_model(weight_file_path)
sess = K.get_session()

constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph.as_graph_def(), 'name of the output tensor')
graph_io.write_graph(constant_graph, 'output_folder_path', 'output.pb', as_text=False)
print('saved the constant graph (ready for inference) at: ', osp.join('output_folder_path', 'output.pb'))
 2
Author: AHA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-30 18:40:51

Las soluciones que se encuentran aquí son bastante buenas, pero si su modelo tiene algunos tipos diferentes de capas que no son compatibles con estas bibliotecas, le recomendaría hacer lo siguiente:

  • Convirtiendo el modelo Keras a un modelo tensorflow.
  • Congele el modelo y use la herramienta Tranform graph proporcionada por tensorflow (tendrá que construirlo desde el código fuente con bazel)
  • Compile la biblioteca C++ API tensorflow para usarla en su proyecto.
  • Utilice la biblioteca de C++ API tensorflow y vincula las bibliotecas a tu proyecto.

Si quieres usar un compilador algo diferente a bazel (como g++ por ejemplo) puedes seguir este gran tutorial:

Http://tuatini.me/building-tensorflow-as-a-standalone-project /

 2
Author: TFreitas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-12 11:43:04

Tenía una necesidad similar wanted quería incrustar modelos Keras en una aplicación C++ and y decidí escribir mi propia biblioteca: Kerasify

Objetivos de diseño de Kerasify:

  • Compatibilidad con redes secuenciales de procesamiento de imágenes generadas por Keras utilizando el backend Theano. (Podría funcionar con Tensorflow si cambia alrededor de la matriz col / orden de filas).
  • No hay dependencias externas, biblioteca estándar, C++11 características OK.
  • Modelo almacenado en el disco en formato binario que puede ser lee rápidamente.
  • Modelo almacenado en memoria en bloque contiguo para un mejor rendimiento de caché.
  • No arroja excepciones, devuelve solo bool en caso de error.
  • Solo CPU, sin GPU

Código de ejemplo, pruebas unitarias, etc. en el enlace github. No está completamente completo, solo soporta el estrecho subconjunto de funciones de Keras que estoy usando, pero debería ser extensible con un poco de esfuerzo.

 1
Author: moof2k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-16 22:08:59