web-dev-qa-db-fra.com

Conversion du modèle Keras en C++

J'utilise Keras (avec Theano) pour former mon modèle CNN. Quelqu'un at-il une idée de comment puis-je l'utiliser dans mon application C++? Est-ce que quelqu'un a essayé quelque chose de similaire? J'ai l'idée d'écrire du code python qui générera un code c ++ avec des fonctions de réseau - une suggestion à ce sujet?

J'ai trouvé une question similaire ici comment utiliser le modèle Tensorflow Keras en C++ mais sans réponse.

27
pplonski

Pour répondre à ma propre question et avoir une solution - j'ai écrit une solution simple en c ++ appelée keras2cpp (son code disponible sur github).

Dans cette solution, vous stockez l'architecture réseau (en json) et les poids (en hdf5). Ensuite, vous pouvez vider un réseau dans un fichier texte avec le script fourni. Vous pouvez utiliser le fichier texte obtenu avec network dans du code pur c ++. Il n'y a pas de dépendances sur les bibliothèques python ou hdf5. Cela devrait fonctionner pour le backean et le back-tensorflow.

34
pplonski

Je me suis trouvé dans une situation similaire, mais je devais non seulement prendre en charge les passages en aval de modèles Keras séquentiels en C++, mais également de modèles plus complexes construits avec le fonctionnal API .

J'ai donc écrit une nouvelle bibliothèque appelée frugally-deep. Vous pouvez le trouver sur GitHub et il est publié sous la licence MIT: https://github.com/Dobiasd/frugally-deep

En plus de prendre en charge de nombreux types de couche courants, il peut suivre (et parfois même battre) les performances de TensorFlow sur un seul processeur. Vous pouvez trouver des résultats de référence actualisés pour un modèle commun dans le répertoire repo .

En testant automatiquement, frugally-deep garantit que la sortie d’un modèle utilisé en C++ est exactement la même que si elle était exécutée avec Keras en Python.

9
Tobias Hermann

Si votre modèle keras est formé à l'aide de backend tensorflow, vous pouvez l'enregistrer en tant que modèle tensorflow en respectant le code suivant: https://github.com/amir-abdi/keras_to_tensorflow

Voici une version plus courte du code:

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'))
4
AHA

Le moyen le plus simple est probablement de faire un appel système à un script Python qui écrit les prédictions dans un fichier binaire ou HDF5 , qui peut être lu à partir de C++. Vous pouvez également intégrer directement Python en C++ .

Si vous avez besoin de déployer et de distribuer cela facilement, vous pouvez rechercher des installations Python autonomes telles que Anaconda , mais le mieux est peut-être d'éviter Keras et d'utiliser l'interface C++ pour Caffe ou Tensorflow. Je ne recommanderais pas Tensorflow car son utilisation à partir de C++ n'est pas standard; voir cette discussion . Caffe est sans doute la deuxième bibliothèque d’apprentissage en profondeur la plus populaire , vous ne pouvez donc pas vous tromper.

3
1''

Les solutions trouvées ici sont plutôt bonnes, mais si votre modèle comporte différents types de couches non prises en charge par ces bibliothèques, je vous recommande de procéder comme suit:

  • Conversion du modèle de Keras en modèle de tensorflow. 
  • Geler le modèle et utiliser l’outil graphique Tranform fourni par tensorflow (vous devrez le construire à partir de la source avec bazel)
  • Compilez la bibliothèque tensorflow de l'API C++ pour l'utiliser dans votre projet. 
  • Utilisez la bibliothèque tensorflow de l'API C++ et liez les bibliothèques à votre projet.

Si vous voulez utiliser un compilateur différent de bazel (comme g ++ par exemple), vous pouvez suivre ce bon tutoriel: 

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

2
TFreitas

J'avais un besoin similaire - je voulais intégrer des modèles Keras dans une application C++ - et j'ai décidé d'écrire ma propre bibliothèque: Kerasify

Objectifs de conception de Kerasify:

  • Compatibilité avec le traitement des images Réseaux séquentiels générés par Keras avec le backend Theano. (Peut fonctionner avec Tensorflow si vous inversez l'ordre des colonnes/rangées de la matrice).
  • Aucune dépendance externe, bibliothèque standard, fonctionnalités C++ 11 OK.
  • Modèle stocké sur disque au format binaire pouvant être lu rapidement.
  • Modèle stocké en mémoire dans un bloc contigu pour améliorer les performances du cache.
  • Ne jette pas d'exceptions, ne retourne que bool en cas d'erreur.
  • CPU uniquement, pas de GPU

Exemple de code, tests unitaires, etc. sur le lien github. Ce n'est pas tout à fait complet, il ne supporte que le sous-ensemble étroit des fonctions de Keras que j'utilise, mais il devrait être extensible avec un petit effort.

2
moof2k

Vous pouvez essayer celui-ci https://github.com/gosha20777/keras2cpp

Keras2cpp est une petite bibliothèque permettant d'exécuter des modèles Keras formés à partir d'une application C++, sans aucune dépendance.

Couches Keras prises en charge: - Dense - Convolution1D - Convolution2D - Convolution3D - Flatten - ELU - Activation - MaxPooling2D - Intégration- LocallyConnected1D - LocallyConnected2D - LSTM - GRU - CNN - BatchNormalization

Activation prise en charge: - linéaire - relu - softplus - tanh - sigmoïde - hard_sigmoïde - élu - softsign - softmax

Objectifs de conception:

  • Compatibilité avec les réseaux générés par Keras avec le backend TensorFlow.
  • CPU seulement.
  • Aucune dépendance externe, bibliothèque standard, C++ 17.
  • Modèle stocké en mémoire.
0