Я использую Keras (с Theano), чтобы обучить мою модель CNN. У кого-нибудь есть идеи, как я могу использовать его в моем приложении C ++? Кто-нибудь пробовал что-то подобное? У меня есть идея написать некоторый код Python, который будет генерировать код C ++ с сетевыми функциями — какие-либо предложения по этому поводу?
Я нашел похожий вопрос Вот как использовать модель Tensorflow Keras в C ++, но без ответа.
Чтобы ответить на мой собственный вопрос и найти решение — я написал простое решение на c ++ под названием keras2cpp (его код доступен на github).
В этом решении вы храните сетевую архитектуру (в формате json) и веса (в формате hdf5). Затем вы можете создать дамп сети в виде простого текстового файла с помощью предоставленного сценария. Вы можете использовать полученный текстовый файл с сетью в чистом C ++ коде. Нет никаких зависимостей от библиотек Python или hdf5. Это должно работать для theano и тензорного бэкэнда.
Я оказался в похожей ситуации, но мне нужно было не только поддерживать прямые передачи последовательных моделей Keras в C ++, но и более сложные модели, построенные с функциональный API.
Поэтому я написал новую библиотеку, которая называется экономно-глубокая. Вы можете найти его на GitHub, и он опубликован под лицензией MIT: https://github.com/Dobiasd/frugally-deep
Помимо поддержки многих распространенных типов слоев, он может поддерживать (и иногда даже превосходить) производительность TensorFlow на одном процессоре. Вы можете найти последние результаты тестов для некоторых распространенных моделей в Сделки рЕПО.
Благодаря автоматическому тестированию экономно-глубокие гарантии гарантируют, что вывод модели, используемой с ним в C ++, точно такой же, как если бы он запускался с Keras в Python.
Возможно, самый простой способ — сделать системный вызов скрипта Python, который записывает прогнозы в двоичный файл или HDF5 файл, который можно прочитать в C ++. Вы также можете напрямую интегрировать Python в C ++.
Если вам нужно легко развернуть и распространить это, вы можете посмотреть на автономные установки Python, такие как анаконда, но лучше всего избегать Keras и использовать интерфейс C ++ для Caffe или Тензор потока. Я бы не рекомендовал Tensorflow, поскольку его использование в C ++ не является стандартным; увидеть это обсуждение. Кафе, возможно, вторая по популярности библиотека глубокого обучения так что ты не можешь ошибиться.
Если ваша модель keras обучается с использованием бэкэнда тензорного потока, вы можете сохранить модель кераса как модель тензорного потока, следуя следующему коду:
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'))
Решения, найденные здесь, довольно хороши, но если ваша модель имеет несколько разных типов слоев, не поддерживаемых этими библиотеками, я бы рекомендовал сделать следующее:
Если вы хотите использовать другой компилятор, отличный от bazel (например, g ++), вы можете следовать этому замечательному учебнику:
http://tuatini.me/building-tensorflow-as-a-standalone-project/
У меня была похожая потребность — я хотел встроить модели Keras в приложение C ++ — и решил написать свою собственную библиотеку: Kerasify
Цели разработки Kerasify:
Пример кода, модульные тесты и т. Д. По ссылке на github. Он не полностью завершен, он поддерживает только узкое подмножество функций Keras, которые я использую, но он должен быть расширяемым без особых усилий.