Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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.
  • Модель хранится в памяти.