Преобразование модели 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, которые я использую, но он должен быть расширяемым с небольшими усилиями.