Convertir el modelo de Keras 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 C ++? ¿Alguien intentó algo similar? Tengo la idea de escribir algún código de Python que genere un código c ++ con funciones de red, ¿alguna sugerencia al respecto?

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

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

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

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

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

Además de admitir muchos tipos de capas comunes, puede mantenerse (y algunas veces incluso superar) el rendimiento de TensorFlow en una sola CPU. Puede encontrar resultados de referencia actualizados para algunos modelos comunes en el repository .

Al realizar pruebas automáticas, se garantiza que la salida de un modelo utilizado con C ++ es exactamente igual a la ejecución con Keras en Python.

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

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

Si su modelo keras se entrena con el backend tensorflow, puede guardar el modelo 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')) 

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

  • Convertir el modelo de Keras a un modelo de tensorflow.
  • Congele el modelo y use la herramienta de gráfico Tranform proporcionada por tensorflow (tendrá que comstackrlo desde la fuente con bazel)
  • Compile la biblioteca tensorflow de la API de C ++ para usarla en su proyecto.
  • Utilice la biblioteca tensorflow de la API de C ++ y vincule las bibliotecas a su proyecto.

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

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

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

Objetivos de diseño de Kerasify:

  • Compatibilidad con el procesamiento de imágenes Redes secuenciales generadas por Keras utilizando el backend de Theano. (Podría funcionar con Tensorflow si cambia el orden de matriz / columna).
  • Sin dependencias externas, biblioteca estándar, características de C ++ 11 OK.
  • Modelo almacenado en disco en formato binario que puede leerse rápidamente.
  • Modelo almacenado en memoria en bloque contiguo para un mejor rendimiento de caché.
  • No lanza excepciones, solo devuelve bool en error.
  • Sólo CPU, no GPU

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