2016-04-19 38 views
20

Sto usando Keras (con Theano) per addestrare il mio modello CNN. Qualcuno ha idea di come posso usarlo nella mia applicazione C++? Qualcuno ha provato qualcosa di simile? Ho idea di scrivere un codice Python che genererà un codice C++ con funzioni di rete - qualche suggerimento su di esso?Converti modello Keras in C++

Ho trovato una domanda simile here come utilizzare il modello Tensorflow Keras in C++ ma senza risposta.

+0

@akarsakov Quali dettagli vorresti? –

+0

@ 1 "" Scusa, ho scelto il motivo sbagliato per la taglia. Mi piacerebbe trovare più semplice o più adatto al modo di produzione di utilizzare i modelli Keras in codice C++. – akarsakov

+0

@akarsakov Qualcosa non va con la soluzione di chiamata di sistema HDF5 +? –

risposta

16

Per rispondere alla mia domanda e avere una soluzione - Ho scritto una semplice soluzione C++ chiamata keras2cpp (il suo codice disponibile su github).

In questa soluzione si archiviano l'architettura di rete (in json) e i pesi (in hdf5). Quindi è possibile scaricare una rete in un file di testo normale con lo script fornito. È possibile utilizzare il file di testo ottenuto con la rete in puro codice C++. Non ci sono dipendenze dalle librerie python o hdf5. Dovrebbe funzionare per il backend di teano e tensorflow.

+0

Mi spiace, non ho capito che volevi implementare un modello già addestrato. In tal caso, questa è una buona soluzione. –

5

Il modo più semplice è probabilmente effettuare una chiamata di sistema a uno script Python che scrive le previsioni su un file binario o HDF5, che può essere letto da C++. Puoi anche directly integrate Python into C++.

Se è necessario distribuire e distribuire questo facilmente, è possibile esaminare le installazioni autonome di Python come Anaconda, ma la soluzione migliore potrebbe essere quella di evitare Keras e utilizzare l'interfaccia C++ su Caffe o Tensorflow. Non consiglierei Tensorflow dal momento che usarlo dal C++ non è standard; vedi this discussion. Caffe è probabilmente il second most-popular deep learning library quindi non puoi davvero sbagliare.

1

ho avuto una simile esigenza - ho voluto incorporare modelli Keras in un'applicazione C++ - e ha deciso di scrivere la mia libreria: Kerasify

obiettivi di progettazione di Kerasify:

  • Compatibilità con immagine elaborazione di reti sequenziali generate da Keras tramite il backend Theano. (Potrebbe funzionare con Tensorflow se si passa all'ordinamento matrice/colonna).
  • Nessuna dipendenza esterna, libreria standard, caratteristiche C++ 11 OK.
  • Modello memorizzato su disco in formato binario che può essere letto velocemente.
  • Modello archiviato in memoria in un blocco contiguo per prestazioni della cache migliori.
  • Non genera eccezioni, restituisce solo bool in caso di errore. solo
  • CPU, senza GPU

codice di esempio, unit test, ecc al link github. Non è completamente completo, supporta solo il ristretto sottoinsieme delle funzioni di Keras che sto usando, ma dovrebbe essere estensibile con un piccolo sforzo.

1

Se il modello keras è addestrato utilizzando tensorflow backend, è possibile salvare il modello keras come modello tensorflow seguito di questo codice: https://github.com/amir-abdi/keras_to_tensorflow

Ecco una versione più corta del codice:

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

Le soluzioni trovate qui sono abbastanza buone, ma se il tuo modello ha diversi tipi di layer non supportati da queste librerie, ti consiglio di fare quanto segue:

  • Conversione del modello Keras in un modello tensorflow.
  • Congela il modello e utilizza lo strumento grafico Tranform fornito da tensorflow (dovrai costruirlo dal sorgente con bazel)
  • Compilare la libreria tensorflow dell'API C++ per utilizzarlo nel progetto.
  • Utilizzare la libreria tensorflow dell'API C++ e collegare le librerie al progetto.

Se si desidera utilizzare un compilatore diverso da Bazel (like g ++, per esempio) è possibile seguire questa grande tuturial:

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

4

mi sono trovato in una situazione simile, ma dovevo non solo supporta i passi successivi dei modelli Keras sequenziali in C++ ma anche dei modelli più complessi creati con lo functional API.

Così ho scritto una nuova libreria chiamata frugally-deep. Puoi trovarlo su GitHub ed è pubblicato sotto la licenza MIT: https://github.com/Dobiasd/frugally-deep

Oltre a supportare molti tipi di layer comuni, può tenere il passo (e talvolta anche battere) le prestazioni di TensorFlow su una singola CPU. È possibile trovare risultati di benchmark aggiornati per alcuni modelli comuni nello repo.

Il test automatico garantisce che l'output di un modello utilizzato con esso in C++ è esattamente lo stesso di quello eseguito con Keras in Python.