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.
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.
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.
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'))
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.
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:
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/
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:
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.
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: