Преобразование модели Keras в C++

Я использую Keras (с Theano) для обучения моей модели CNN. Кто-нибудь знает, как я могу использовать его в своем приложении C++? Кто-нибудь пробовал что-то подобное? У меня есть идея написать код python, который будет генерировать код C++ с сетевыми функциями - любое предложение по нему?

Я нашел аналогичный вопрос здесь как использовать модель Tensorflow Keras в C++, но без ответа.

6 ответов


чтобы ответить на мой собственный вопрос и есть решение - я написал простое решение c++ под названием keras2cpp (его код доступен на github).

в этом решении вы храните сетевую архитектуру (в json) и веса (в hdf5). Затем вы можете сбросить сеть в текстовый файл с предоставленным скриптом. Вы можете использовать полученный текстовый файл с сетью в чистом коде c++. Нет никаких зависимостей от библиотек python или hdf5. Он должен работать для бэкэнда theano и tensorflow.


Я оказался в аналогичной ситуации, но мне нужно было не только поддерживать прямые проходы последовательных моделей Keras на C++, но и более сложных моделей, построенных с помощью функциональный API.

поэтому я написал новую библиотеку под названием frugally-deep. Вы можете найти его на GitHub, и он опубликован под лицензией MIT:https://github.com/Dobiasd/frugally-deep

дополнительно к поддерживать много общих типов слоя он может держать вверх С (и иногда даже бить) производительность TensorFlow на одном процессоре. Вы можете найти актуальные результаты тестов для некоторых распространенных моделей в РЕПО.

при автоматическом тестировании frugally-deep гарантирует, что вывод модели, используемой с ней на C++, точно такой же, как при запуске с Keras в Python.


самый простой способ, вероятно, сделать системный вызов скрипта Python, который записывает предсказания в двоичный файл или HDF5 файл, который можно прочитать из C++. Вы также можете непосредственно интегрировать Python в C++.

Если вам нужно развернуть и распространить это легко, вы можете посмотреть на автономные установки Python, такие как Анаконда, но лучше всего избегать Keras и использовать интерфейс C++ для Caffe или Tensorflow. Я бы не рекомендовал Tensorflow, так как использование его с C++ не является стандартным; см. эта дискуссия. Caffe, возможно,вторая по популярности библиотека глубокого обучения Так что вы не можете ошибиться.


Если ваша модель keras обучена с использованием бэкэнда tensorflow, вы можете сохранить модель keras как модель tensorflow после этого кода: https://github.com/amir-abdi/keras_to_tensorflow

вот более короткая версия код:

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

найденные здесь решения довольно хороши, но если ваша модель имеет несколько разных типов слоев, не поддерживаемых этими библиотеками, я бы рекомендовал сделать следующее:

  • преобразование модели Keras в модель tensorflow.
  • заморозить модель и использовать инструмент Tranform graph, предоставляемый tensorflow (вам нужно будет построить его из источника с помощью bazel)
  • скомпилируйте библиотеку tensorflow API C++, чтобы использовать ее в своем проекте.
  • используйте C++ API tensorflow library и свяжите библиотеки с вашим проектом.

Если вы хотите использовать что-то differentcompiler, чем bazel (например, g++), вы можете следовать этому великому tuturial:

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


У меня была аналогичная потребность-я хотел встроить модели Keras в приложение C++-и решил написать свою собственную библиотеку:Kerasify

цели дизайна Kerasify:

  • совместимость с последовательными сетями обработки изображений, генерируемыми Keras с помощью бэкэнда Theano. (Может работать с Tensorflow, если вы переключаетесь вокруг упорядочения матрицы col / row).
  • нет внешних зависимостей, стандартная библиотека, функции C++11 в порядке.
  • модель, хранящаяся на диск в двоичном формате, который можно быстро прочитать.
  • модель хранится в памяти в непрерывном блоке для повышения производительности кэша.
  • не создает исключений, возвращает только bool при ошибке.
  • только CPU, без GPU

пример кода, модульные тесты и т. д. по ссылке github. Он не полностью завершен, он поддерживает только узкое подмножество функций Keras, которые я использую, но он должен быть расширяемым с небольшими усилиями.