Neftis - Redes Neuronales Artificiales

Iniciado por El Benjo, 18 Septiembre 2020, 20:47 PM

0 Miembros y 1 Visitante están viendo este tema.

El Benjo

Neftis
Artificial Neural Network Framework


Hola, buen día.
Hacía mucho que no ingresaba a la comunidad porque estaba trabajando en un proyecto muy importante para mí, tanto a nivel personal como profesional. Y hoy es un enorme gusto para mí el poder mostrárselos. Aún queda mucho por hacer, pero es lo suficientemente maduro para ser utilizado sin muchos inconvenientes (espero), pues no he tenido los recursos para probarlo en hardware distinto al de mi propia máquina. Dejo este post aquí porque, aún cuando el proyecto actualmente está hecho para funcionar únicamente en .NET Framework, mi idea es poder adaptarlo a otros lenguajes de programación y otros SOs distintos a Windows. Espero que a más de uno le sea de utilidad, pues ese es el propósito de lo que hacemos nosotros como programadores, crear algo que sea útil.
Neftis, como dice el título del post, es un marco de trabajo para la creación, entrenamiento y ejecución de redes neuronales artificiales. El objetivo de Neftis es proporcionar un entorno de trabajo que sea rápido y fácil de utilizar, pero que al mismo tiempo sea flexible y sencillo de aprender, con reglas bien definidas, una programación intuitiva y objetos concretos para llevar a cabo cada una de las tareas necesarias en cada etapa del desarrollo de un sistema que implemente una o múltiples redes neuronales artificiales.
Con Neftis primero construimos un modelo neuronal en base a una descripción formal de la red neuronal. Ejemplo: Si la red neuronal tiene 3 capas y su respectivo número de neuronas es, 2 neuronas en la capa de entrada, 3 neuronas en la capa oculta y 1 neurona en la capa de salida [2, 3, 1] y conectadas en una estructura Madaline, entonces la creamos de la siguiente manera:

Código (csharp) [Seleccionar]
NeuralNetwork redNeuronal = new NeuralNetwork();
NeuralNetwork redNeuronal.CreateMadaline(new int[] {2, 3, 1);


El siguiente paso es cargar los datos de entrenamiento en una estructura de datos con dos campos, inputs y outputs que son cada uno un arreglo unidimensional de enteros del mismo tamaño que la primera (inputs) y última (outputs) capa de la red neuronal. Después se carga otro conjunto de datos con la misma estructura, que será utilizado por la red neuronal para validar el entrenamiento de la misma.

Código (csharp) [Seleccionar]
public struct STRUCT_InputOutputValuePairs
{
public string Id;
public float[] InputValues;
public float[] OutputValues;
}


Después se definen los parámetros de entrenamiento y se entrena la red neuronal. Los parámetros a definir son los siguientes:

AutoSaveFilestringFile name and path for the auto save file.
BatchSizeInt32Training values evaluated before weights change.
LearningReasonfloatIncrement at which neural network learns.
MaxAgeInt32Max age every generation should reach if the neural network doesn't reach the NetworkErrorMargin value.
MaxGenerationInt32Max generation the training process will reach if the neural network doesn't reach the NetworkErrorMargin value.
NetworkErrorMarginfloatThe error that the neural network must reach before the training process stops.
RandomWeightsboolTells if the weights must be randomized. If the training is continuing with a previous training this should be set to false, otherwise training progress will be erased.
SaveEveryNAgesInt32Interval between every autosave the training process made of the neural network if is > 0.
TestCasesInputsAndOuputsSTRUCT_InputOutputValuePairs[]Data sets to test training progress between ages.
TestOutputMarginfloatMargin at the output neurons value.
TrainingInputsAndOutputsSTRUCT_InputOutputValuePairs[]Training values array.
UseGPUboolUse GPU device for training. If is true and there is no GPU device training wont start.

Una vez que la red neuronal ha sido entrenada se guarda en un archivo de red neuronal.

Código (csharp) [Seleccionar]
// Training.
    NeuralNetworkTrainer trainer = new NeuralNetworkTrainer();
STRUCT_TrainingParameters trainingParameters = new STRUCT_TrainingParameters {
        BatchSize = Convert.ToInt32(Txt_BatchSize.Text),
        TrainingInputsAndOutputs = Inputs,
        LearningReason = learnningReazon,
        MaxAge = maxAges,
        SaveEveryNAges = 0,
        AutoSaveFile = "",
        MaxGeneration = maxGeneration,
        NetworkErrorMargin = 0.01f,
        RandomWeights = true,
        TestCasesInputsAndOuputs = testInputs,
        TestOutputMargin = 0.1f,
        UseGPU = false
    };
// Write the results.
    Neftis.ENUM_StartTrainingResult result = trainer.StartTraining(RedNeuronal, trainingParameters);


En la aplicación que va hacer uso de la red neuronal se carga la estructura de la red neuronal ya entrenada, se establecen los valores de entrada y se procede a evaluar los valores de salida.

En el sitio web pueden ver códigos de ejemplo, incluyendo código generado con una función de Neftis que genera código para Arduino a partir de un modelo entrenado.
Neftis es de uso libre (no código abierto). Y cualquiera puede usarlo, ya sea en un proyecto personal o comercial. Si desean apoyar o contribuir al proyecto, en el sitio web vienen las formas de hacerlo, también si tienen dudas, preguntas o desean aportar al proyecto de otra manera, pueden escribirme al correo  neftisprojectcontact@gmail.com.

Muchas gracias a todos. Sigamos programando.

www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.