tenorflow — конвертировать модель Keras в переполнение стека

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

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

27

Решение

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

В этом решении вы храните сетевую архитектуру (в формате json) и веса (в формате hdf5). Затем вы можете создать дамп сети в виде простого текстового файла с помощью предоставленного сценария. Вы можете использовать полученный текстовый файл с сетью в чистом C ++ коде. Нет никаких зависимостей от библиотек Python или hdf5. Это должно работать для theano и тензорного бэкэнда.

29

Другие решения

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

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

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

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

9

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

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

3

Если ваша модель 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'))
3

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

  • Преобразование модели Кераса в модель тензорного потока.
  • Заморозьте модель и используйте инструмент Tranform graph, предоставляемый tenorflow (вам придется строить его из исходного кода с помощью bazel)
  • Скомпилируйте библиотеку tenorflow C ++ API, чтобы использовать ее в своем проекте.
  • Используйте библиотеку tenorflow C ++ API и свяжите библиотеки с вашим проектом.

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

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

2

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

Цели разработки Kerasify:

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

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

1
По вопросам рекламы [email protected]