No hace mucho tiempo, me enfrent茅 a la tarea de producci贸n de lanzar un Kesas
red neuronal Kesas
entrenado usando c贸digo C++
nativo. Por extra帽o que parezca, la soluci贸n no era para nada trivial. Como resultado, hab铆a una biblioteca privada, dando esa oportunidad. Acerca de c贸mo es: redes neuronales en cruces limpias y ser谩 el breve art铆culo de hoy.
Para aquellos que no pueden esperar, aqu铆 est谩 el repositorio de github, con una descripci贸n detallada del uso. Bueno, les pregunto a todos los dem谩s debajo del gato ...
Declaraci贸n del problema.
En el proceso, necesitaba ejecutar un modelo entrenado en una aplicaci贸n C++
(Unreal Engune 4) . Pero aqu铆 est谩 la mala suerte: hoy pr谩cticamente no hay forma de ejecutar el modelo Keras en C ++.
La opci贸n de compra de Python
desde C++
no me pareci贸 buena. Otra opci贸n era convertir el modelo Keras en un modelo TensorFlow y luego construir TensoFflow para cruces y llamar a la API TF desde el c贸digo C ++.
Este proceso de metamorfosis est谩 bien descrito en este art铆culo . Pero tambi茅n surgen dificultades con esto. En primer lugar , TensorFlow est谩 pasando por Bzzel
. Y el bisel en s铆 es una cosa caprichosa y se neg贸 a ensamblar bajo UE4 . En segundo lugar , TF
es algo bastante grande y voluminoso , pero quer铆a algo m谩s liviano y productivo. Solo puedo decir que en los espacios abiertos de github se encontr贸 un proyecto a medias , con la funcionalidad que necesitaba. Pero no era compatible con las versiones actuales de Python
y Keras
. Y los intentos de rehacerlo no tuvieron 茅xito: la aplicaci贸n C ++ se bloque贸 con el error Core Dump
. Era costumbre escribir mi propia implementaci贸n ...
Estamos escribiendo nuestra biblioteca!
Girando la roca m谩s fuerte, arrojando una botella pivasa energ铆a, me sent茅 en el c贸digo. El c贸digo TensorFlow, los intentos de rehabilitar el c贸digo que se encuentra en el c贸digo
, algunos conocimientos sobre algoritmos y estructuras de datos (gracias a ITMO por sus cursos) y buena m煤sica en mis o铆dos me ayudaron mucho a implementar esta biblioteca. De alguna manera la biblioteca fue escrita en una noche.
Y as铆 conoce: Keras2cpp!
La primera parte de la biblioteca es el m贸dulo Python para guardar el modelo entrenado en su propio formato binario .
No hay nada complicado en esta operaci贸n. Acabamos de leer el modelo de Keras
y escribimos poco a poco en un archivo: primero
, luego la
, luego
en formato float
.
Ahora pasemos a la implementaci贸n m谩s deliciosa: C ++.
El usuario tiene 2 entidades tensor
y model
.
Tensor : redistribuye los datos con los que funciona la red neuronal y es una implementaci贸n inform谩tica del tensor. Dimensi贸n m谩xima actualmente admitida en 4 dimensiones. La dimensi贸n de cada dimensi贸n se almacena en std::vector<int> dims_;
y el peso de cada elemento tensor est谩 en std::vector<int> data_;
. De los m茅todos disponibles, se pueden distinguir void Print()
y Tensor Select(int row)
. El resto de las operaciones las puede ver en el c贸digo fuente. Despu茅s de escribir las matem谩ticas para los tensores, comenc茅 a implementar modelos.
Modelo : es un conjunto de capas en cada una de las cuales se prescriben operaciones en tensores y una matriz de peso. 2 funciones est谩n disponibles para el usuario virtual bool LoadModel(const std::string& filename);
y virtual bool Apply(Tensor* in, Tensor* out);
.
Aqu铆 hay un ejemplo 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() {
Eso es todo lo que pienso. Disfruta us谩ndolo, y voy a ir a mi amado C # y Python para escribir m谩s redes neuronales.
PS
Me gust贸 escribir esta biblioteca. Cuando escribes todo desde cero, entiendes m谩s, pero c贸mo funciona ... Planeamos agregar soporte para otras arquitecturas y GPU ...
repositorio github
Fuente