Преобразование модели Keras в С++
Я использую Keras (с Theano) для обучения моей модели CNN. Кто-нибудь знает, как я могу использовать его в своем приложении на С++? Кто-нибудь пробовал что-то подобное? У меня есть идея написать код python, который будет генерировать код С++ с сетевыми функциями - любое предложение на нем?
Я нашел аналогичный вопрос здесь, как использовать модель Tensorflow Keras в С++, но без ответа.
Ответы
Ответ 1
Чтобы ответить на мой собственный вопрос и иметь решение, я написал простое С++-решение под названием keras2cpp (его код доступен на github).
В этом решении вы храните сетевую архитектуру (в json) и весовые коэффициенты (в hdf5). Затем вы можете отправить сеть в текстовый файл с предоставленным script. Вы можете использовать полученный текстовый файл с сетью в чистом С++-коде. Нет никаких зависимостей от библиотек python или hdf5. Он должен работать для бэкэнда anano и tensorflow.
Ответ 2
Я оказался в аналогичной ситуации, но мне нужно было не только поддерживать прямые передачи последовательных моделей Keras в C++, но и более сложные модели, построенные с помощью функционального API.
Поэтому я написал новую библиотеку, которая называется экономно-глубокая. Вы можете найти его на GitHub, и он опубликован под лицензией MIT: https://github.com/Dobiasd/frugally-deep
Помимо поддержки многих распространенных типов слоев, он может поддерживать (а иногда даже превосходить) производительность TensorFlow на одном процессоре. Вы можете найти последние результаты тестов для некоторых распространенных моделей в репо.
Автоматическое тестирование экономно гарантирует, что выходные данные модели, использованной с ним в C++, будут точно такими же, как если бы они запускались с Keras в Python.
Ответ 3
Самый простой способ - это сделать системный вызов Python script, который записывает предсказания в двоичный файл или HDF5, который может быть прочитан из С++. Вы также можете напрямую интегрировать Python в С++.
Если вам нужно легко развернуть и распространять это, вы можете посмотреть автономные установки Python, такие как Anaconda, но ваш лучший выбор может быть чтобы избежать Keras и использовать интерфейс С++ для Caffe или Tensorflow. Я бы не рекомендовал Tensorflow, поскольку использование его на С++ не является стандартным; см. эту дискуссию. Caffe, возможно, является второй самой популярной библиотекой глубокого обучения, поэтому вы не можете ошибиться.
Ответ 4
Если ваша модель keras обучается с использованием бэкэнда tensorflow, вы можете сохранить модель 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'))
Ответ 5
Решения, найденные здесь, довольно хороши, но если ваша модель имеет несколько разных типов слоев, не поддерживаемых этими библиотеками, я бы рекомендовал сделать следующее:
- Преобразование модели Кераса в модель тензорного потока.
- Заморозьте модель и используйте инструмент Tranform graph, предоставляемый tenorflow (вам придется строить его из исходного кода с помощью bazel)
- Скомпилируйте библиотеку tenorflow API C++, чтобы использовать ее в своем проекте.
- Используйте библиотеку tenorflow API C++ и свяжите библиотеки с вашим проектом.
Если вы хотите использовать другой компилятор, отличный от bazel (например, g++), вы можете следовать этому замечательному учебнику:
http://tuatini.me/building-tensorflow-as-a-standalone-project/
Ответ 6
У меня была аналогичная потребность - я хотел встроить модели Keras в приложение на С++ и решил написать свою собственную библиотеку: Kerasify
Цели дизайна Kerasify:
- Совместимость с обработкой изображений. Последовательные сети, созданные Keras с использованием Theano. (Может работать с Tensorflow, если вы переключаете порядок символов col/row).
- Нет внешних зависимостей, стандартной библиотеки, возможностей С++ 11.
- Модель хранится на диске в двоичном формате, который можно быстро прочитать.
- Модель хранится в памяти в непрерывном блоке для повышения производительности кэша.
- Не генерирует исключений, возвращает только ошибку bool при ошибке.
- Только процессор, нет GPU
Пример кода, модульные тесты и т.д. по ссылке github. Он не полностью завершен, он поддерживает только узкое подмножество функций Keras, которые я использую, но он должен быть растяжимым с небольшим усилием.
Ответ 7
Йокан также использует это: https://github.com/gosha20777/keras2cpp
это небольшая библиотека для запуска обученных моделей Keras 2 из собственного кода C++. Поддерживает python3 и keras 2.x
Ответ 8
Вы можете попробовать это https://github.com/gosha20777/keras2cpp
Keras2cpp - это небольшая библиотека для запуска обученных моделей Keras из приложения C++ без каких-либо зависимостей.
Поддерживаемые слои Keras: - Плотный - Convolution1D - Convolution2D - Convolution3D - Выровнять - ELU - Активация - MaxPooling2D - Встраивание - Локально подключен1D - Локально подключен2D - LSTM - ГРУ - CNN - BatchNormalization
Поддерживаемая активация: - линейная - relu - softplus - tanh - сигмовидная - hard_sigmoid - elu - softsign - softmax
Цели дизайна:
- Совместимость с сетями, сгенерированными Keras с использованием бэкэнда TensorFlow.
- Только процессор.
- Нет внешних зависимостей, стандартная библиотека, C++ 17.
- Модель хранится в памяти.