Há não muito tempo, enfrentei a tarefa de produção de lançar um Kesas
rede neural treinado Kesas
usando código C++
nativo. Curiosamente, a solução não era nada trivial. Como resultado, havia uma biblioteca privada, oferecendo uma oportunidade. Sobre como é - redes neurais em cruzamentos limpos e será o breve artigo de hoje.
Para quem não pode esperar - aqui está o repositório do github, com uma descrição detalhada do uso. Bem, pergunto a todos os outros sob o gato ...
Declaração do problema.
No processo, eu precisava executar um modelo treinado em um aplicativo C++
(Unreal Engune 4) . Mas aqui está a má sorte: hoje praticamente não há como executar o modelo Keras em C ++.
A opção de chamada Python
do C++
não me pareceu boa. Outra opção foi converter o modelo Keras em um modelo TensorFlow e criar o TensoFflow para cruzamentos e chamar a API TF a partir do código C ++.
Esse processo de metamorfose está bem descrito neste artigo . Mas também surgem dificuldades com isso. Primeiro , o TensorFlow está passando por Bzzel
. E a moldura em si é uma coisa extravagante e se recusou a montar sob UE4 . Em segundo lugar , o TF
si é uma coisa bastante grande e volumosa , mas eu queria algo mais leve e produtivo. Só posso dizer que nos espaços abertos do github foi encontrado um projeto meio trabalho , com a funcionalidade necessária. Mas, ele não suportava as versões atuais do Python
e Keras
. E as tentativas de refazê-lo não tiveram êxito: o aplicativo C ++ travou com o erro Core Dump
. Era costume escrever minha própria implementação ...
Estamos escrevendo nossa biblioteca!
Tornando a pedra mais difícil, jogando uma garrafa pivasa energia, sentei-me no código. O código TensorFlow, as tentativas de reabilitar o código encontrado no código
, algum conhecimento sobre algoritmos e estruturas de dados (graças ao ITMO por seus cursos) e boa música em meus ouvidos me ajudaram muito na implementação desta biblioteca. De alguma forma, a biblioteca foi escrita em uma noite.
E então conheça: Keras2cpp!
A primeira parte da biblioteca é o módulo Python para salvar o modelo treinado em seu próprio formato binário .
Não há nada complicado nesta operação. Acabamos de ler o modelo de Keras
e escrever pouco a pouco em um arquivo: primeiro
, depois a
e depois
no formato float
.
Agora vamos para a mais deliciosa implementação em C ++.
O usuário possui 2 entidades tensor
e model
.
Tensor - redistribui os dados com os quais a rede neural trabalha e é uma implementação computacional do tensor. Dimensão máxima atualmente suportada em 4 dimensões. A dimensão de cada dimensão é armazenada no std::vector<int> dims_;
e o peso de cada elemento tensor está em std::vector<int> data_;
. Dos métodos disponíveis, void Print()
e Tensor Select(int row)
podem ser distinguidos. O restante das operações você pode ver no código fonte. Depois que a matemática dos tensores foi escrita, comecei a implementar modelos.
Modelo - é um conjunto de camadas em cada uma das quais são prescritas operações em tensores e uma matriz de peso. 2 funções estão disponíveis para o usuário virtual bool LoadModel(const std::string& filename);
e virtual bool Apply(Tensor* in, Tensor* out);
.
Aqui está um exemplo de código completo.
python_model.py:
import numpy as np from keras import Sequential from keras.layers import Dense
cpp_mpdel.cc:
#include "keras_model.h" int main() {
É tudo o que penso. Aprecie usá-lo, e irei ao meu amado C # e Python para escrever ainda mais as redes neurais.
PS
Eu gostei de escrever esta biblioteca. Quando você escreve tudo do zero, entende mais, mas como funciona ... Planejamos adicionar suporte para outras arquiteturas e GPUs ...
repositório github
Fonte