Convertir Un modèle Keras en C++
J'utilise Keras (avec Theano) pour entraîner mon modèle CNN. Est-ce que quelqu'un a une idée de comment je peux l'utiliser dans mon application C++? Quelqu'un a essayé quelque chose de similaire? J'ai une idée pour écrire un code python qui générera un code c++ avec des fonctions réseau - n'importe quelle suggestion à ce sujet?
j'ai trouvé une question similaire ici comment utiliser le modèle TensorFlow Keras en C++ mais sans réponse.
6 réponses
pour répondre à ma propre question et avoir une solution - j'ai écrit une solution C++ simple appelée keras2cpp (son code disponible sur github).
dans cette solution vous stockez l'architecture de réseau (en json) et les poids (en hdf5). Ensuite, vous pouvez Dumper un réseau vers un fichier texte simple avec script fourni. Vous pouvez utiliser le fichier texte obtenu avec le réseau dans le code C++ pur. Il n'y a pas de dépendances sur les bibliothèques python ou hdf5. Il doit travailler pour théano et TensorFlow backend.
je me suis trouvé dans une situation similaire, mais j'ai dû non seulement prendre en charge les passes avant des modèles séquentiels Keras en C++, mais aussi des modèles plus complexes construits avec l '"API fonctionnelle 151910920".
donc j'ai é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 soutenir de nombreux les types de couches il peut suivre (et parfois même battre) la performance de TensorFlow sur un CPU simple. Vous pouvez trouver des résultats de référence à jour pour un modèle commun dans le repo .
par des tests automatiques économes en profondeur garantit que la sortie d'un modèle utilisé avec lui en C++ est exactement la même que si exécuté avec Keras en Python.
la façon la plus facile est probablement de faire un appel système à un script Python qui écrit les prédictions à un fichier binaire ou HDF5 , qui peut être lu à partir de C++. Vous pouvez aussi intégrer directement Python dans C++ .
si vous avez besoin de déployer et de distribuer cela facilement, vous pouvez regarder dans des installations Python autonomes comme Anaconda , mais votre meilleur pari peut être d'éviter les Keras et d'utiliser le C++ interface avec Caffe ou Tensorflow. Je ne recommande pas Tensorflow car l'utiliser à partir de C++ n'est pas standard; voir cette discussion . Caffe est sans doute le deuxième plus populaire bibliothèque d'apprentissage profond donc vous ne pouvez pas vraiment vous tromper.
si votre modèle keras est formé en utilisant TensorFlow backend, vous pouvez sauver le modèle keras comme un modèle tensorflow en suivant ce code: 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'))
les solutions trouvées ici sont assez bonnes, mais si votre modèle a quelques différents types de couches non supportées par ces bibliothèques, je recommande de faire ce qui suit:
- la Conversion de la Keras modèle à un tensorflow modèle.
- geler le modèle et utiliser L'outil graphique Tranform fourni par tensorflow (vous aurez à 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 autre compilateur que bazel (comme g++ par exemple), vous pouvez suivre ce grand tutorial:
http://tuatini.me/building-tensorflow-as-a-standalone-project /
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
les objectifs de la Conception de Kerasify:
- compatibilité avec les réseaux séquentiels de traitement d'image générés par Keras en utilisant Theano backend. (Pourrait fonctionner avec Tensorflow si vous changez autour de la matrice col/ordre de rangée).
- pas de dépendances externes, bibliothèque standard, C++11 features OK.
- modèle stocké sur disque dans un format binaire qui peut être lu rapidement.
- modèle stocké en mémoire dans le bloc contigu pour une meilleure performance de cache.
- ne lance pas d'exceptions, retourne seulement bool sur erreur.
- CPU seulement, no GPU
exemple de code, essais unitaires, etc. le lien github. Il n'est pas entièrement complet, il supporte seulement le sous-ensemble étroit de Keras les fonctions que j'utilise, mais il devrait être extensible avec un peu d'effort.