Converter modelo Keras para C ++

votos
21

Eu estou usando Keras (com Theano) para treinar meu modelo CNN. Alguém tem idéia de como posso usá-lo no meu aplicativo C ++? Será que alguém tentou algo semelhante? Eu tenho a idéia de escrever algum código python que irá gerar um código c ++ com funções de rede - qualquer sugestão sobre isso?

Eu encontrei uma pergunta semelhante aqui como usar modelo Tensorflow Keras em C ++, mas sem resposta.

Publicado 19/04/2016 em 12:52
fonte usuário
Em outras línguas...                            


7 respostas

votos
5

A maneira mais fácil é provavelmente para fazer uma chamada de sistema para um script Python que escreve as previsões para um binário ou HDF5 arquivo, que pode ser lido a partir C ++. Você também pode integrar diretamente Python em C ++ .

Se você precisa para implementar e distribuir isso facilmente, você pode olhar para instalações do Python auto-suficientes, como Anaconda , mas sua melhor aposta pode ser para evitar Keras e utilizar a interface C ++ para Caffe ou Tensorflow. Eu não recomendaria Tensorflow desde a usá-lo de C ++ não é padrão; veja esta discussão . Caffe é sem dúvida o segundo mais popular biblioteca de aprendizagem profunda para que você não pode realmente dar errado.

Respondeu 01/05/2016 em 05:26
fonte usuário

votos
18

Para responder a minha própria pergunta e ter uma solução - Eu escrevi uma solução simples c ++ chamado keras2cpp (seu código disponível no github).

Nesta solução armazenar arquitetura de rede (em JSON) e pesos (em hdf5). Então você pode despejar uma rede para um arquivo de texto com script fornecido. Você pode usar o arquivo de texto obtido com a rede em puro código C ++. Não há nenhuma dependência em bibliotecas python ou hdf5. Ele deve funcionar para Theano e backend tensorflow.

Respondeu 22/05/2016 em 19:59
fonte usuário

votos
1

Eu tinha uma necessidade semelhante - Eu queria incorporar modelos Keras em uma aplicação C ++ - e decidiu escrever a minha própria biblioteca: Kerasify

objetivos do projeto de Kerasify:

  • Compatibilidade com processamento de imagem redes seqüenciais gerados pelo Keras usando Theano backend. (Poderia trabalhar com Tensorflow se você mudar em torno de matriz col / linha ordenação).
  • Nenhuma dependência externa, biblioteca padrão, C ++ 11 características OK.
  • Modelo armazenados em disco em formato binário que podem ser rapidamente ler.
  • Modelo armazenadas na memória em bloco contíguo para um melhor desempenho cache.
  • não lançar exceções, retorna apenas bool em erro.
  • única CPU, sem GPU

código exemplo, testes de unidade, etc na ligação github. Não é totalmente concluída, ele só suporta o subconjunto limitado de funções Keras que estou usando, mas deve ser extensível com um pouco de esforço.

Respondeu 08/11/2016 em 04:05
fonte usuário

votos
1

Se o seu modelo keras é treinado usando tensorflow backend, você pode salvar o modelo keras como um modelo tensorflow seguindo este código: https://github.com/amir-abdi/keras_to_tensorflow

Aqui está uma versão mais curta do 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'))
Respondeu 10/05/2017 em 04:36
fonte usuário

votos
2

As soluções encontradas aqui são muito bons, mas se o seu modelo tem alguns tipos diferentes de camadas não suportados por essas bibliotecas, eu recomendo fazer o seguinte:

  • Convertendo o modelo Keras a um modelo tensorflow.
  • Congelar o modelo e usar Tranform ferramenta de gráfico fornecido pelo tensorflow (você vai ter que construir a partir da fonte com Bazel)
  • Compilar o ++ biblioteca API tensorflow C para usá-lo em seu projeto.
  • Use o ++ biblioteca API tensorflow C e vincular as bibliotecas de seu projeto.

Se você quiser usar um algo differentcompiler de Bazel (como g ++, por exemplo) você pode seguir este grande tuturial:

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

Respondeu 26/12/2017 em 21:58
fonte usuário

votos
6

Eu me encontrei em uma situação semelhante, mas precisava não só de apoio passes para a frente de modelos sequenciais Keras em C ++, mas modelos também de mais complexo construir com a API funcional .

Então eu escrevi uma nova biblioteca chamada frugalmente de profundidade. Você pode encontrá-lo no GitHub e é publicado sob a licença MIT: https://github.com/Dobiasd/frugally-deep

Além disso a apoiar muitos tipos de camada comum que pode manter-se com (e às vezes até mesmo bater) o desempenho de TensorFlow em uma única CPU. Você pode encontrar up-to-date resultados de benchmark para algum modelo comum no repo .

Testando automática garantias frugalmente-profundas que a saída de um modelo usado com ele em C ++ é exatamente o mesmo que se execute com Keras em Python.

Respondeu 03/01/2018 em 15:47
fonte usuário

votos
0

Você pode tentar este https://github.com/gosha20777/keras2cpp

Keras2cpp é uma pequena biblioteca para a execução de modelos Keras treinados a partir de uma aplicação C ++ sem dependências.

camadas Keras suportados: - Dense - Convolution1D - Convolution2D - Convolution3D - Alise - ELU - Activation - MaxPooling2D - Incorporação - LocallyConnected1D - LocallyConnected2D - LSTM - GRU - CNN - BatchNormalization

activação suportada: - linear - Relu - Softplus - tanh - sigmóide - hard_sigmoid - elu - softsign - softmax

objetivos do projeto:

  • Compatibilidade com redes geradas por Keras usando TensorFlow backend.
  • CPU única.
  • Não há dependências externas, biblioteca padrão, C ++ 17.
  • Modelo armazenado na memória.
Respondeu 31/01/2019 em 08:58
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more