Как я Keras на C++ запускал

Автор: admin от 31-01-2019, 21:50, посмотрело: 39

Не так давно передо мной встала производственная задача – запустить обученную модель нейронной сети Kesas на нативном C++ коде. Как ни странно, решение оказалось вообще не тривиальным. В результате чего появилась собственная библиотека, дающая такую возможность. О том, как же это – нейросети на чистых крестах и будет сегодняшняя небольшая статья.


Тем, кому не терпится – вот тут репозитарий на github, с подробным описанием использования. Ну а всех остальных прошу под кат… этой статье. Но с этим также возникают трудности. Во-первых, TensorFlow собирается через Bzzel. А сам безель штука капризная и отказался собираться под UE4. Во-вторых, сам TF довольно большая и громоздкая штуковина, а мне хотелось чего-то более легкого и производительного. Могу лишь сказать, что на просторах github был найден полупабочий проект, с нужным мне функционалом. Но, он не поддерживал актуальные версии Python и Keras. А попытки переделать его, не увенчались успехом: С++ приложение валилась с ошибкой Core Dump. Было принято писать свою реализацию…


Пишем свою библиотеку!


Включив рок потяжелее, закинувшись бутылкой пиваса энергетика, я сел за код. Во многом в реализации этой библиотеки мне помог код TensorFlow, попытки реабилитации найденного на гит кода, некоторые знания об алгоритмах и структурах данных (спасибо ИТМО за его курсы) и хорошая музыка в ушах. Так или иначе библиотека была написана за одну ночь.


И так встречайте: Keras2cpp!


Первая чать библиотеки – это Python модуль для сохранения обученной модели в собственный бинарный формат.


Ничего сложного в этой операции нет. Мы просто читаем модель Keras и записываем побитово в файл: сначала тип слоя, потом размерность, потом матрицу весов в формате float.


Теперь перейдем к самому вкусному – C++ реализации.


Пользователю доступны 2 сущности tensor и model.


Tensorпеределяет собой данные с которыми работает нейросеть и является компьютерной реализацией тензора. На данный момент поддерживается максимальная размерность в 4 измерения. Размерность каждого измерения хранится в поле std::vector dims_; а вес каждого элемента тензора – в std::vector data_;. Из доступных методов можно выделить void Print() и Tensor Select(int row). Остальные операции вы можете посмотреть в исходном коде. После того как математика для тензоров была написана я приступил к реализации моделей.


Modelпредставляет собой набор слоев в каждом из которых прописаны операции над тензорами и матрица весов. Для пользователя доступны 2 функции virtual bool LoadModel(const std::string& filename); и virtual bool Apply(Tensor* in, Tensor* out);.



Вот полный пример кода.



python_model.py:



import numpy as np
from keras import Sequential
from keras.layers import Dense

#create random data
test_x = np.random.rand(10, 10).astype('f')
test_y = np.random.rand(10).astype('f')
model = Sequential([
    Dense(1, input_dim=10)
])
model.compile(loss='mse', optimizer='adam')

#train model by 1 iteration
model.fit(test_x, test_y, epochs=1, verbose=False)

#predict
data = np.array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
prediction = model.predict(data)
print(prediction)

#save model
from keras2cpp import export_model
export_model(model, 'example.model')

cpp_mpdel.cc:


#include "keras_model.h"

int main() 
{
    // Initialize model.
    KerasModel model;
    model.LoadModel("example.model");

    // Create a 1D Tensor on length 10 for input data.
    Tensor in(10);
    in.data_ = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};

    // Run prediction.
    Tensor out;
    model.Apply(&in, &out);
    out.Print();
    return 0;
}


На этом я думаю все. Приятного использования, а я пойду к любимому C# и Python писать нейросети дальше.



P.S.



Мне понравилось писать эту библиотеку. Когда пишешь все сам с нуля – больше понимаешь, а как оно работает… В планах добавить поддержку других архитектур и GPU…



github репозиторий

Источник



Источник: Хабр / Интересные публикации

Категория: Программирование

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Введите два слова, показанных на изображении: *