Redes neuronales con Delphi - Neural net with Delphi

En este post os presento el componente TFFNN que os ayudará a realizar redes neuronales.
Utiliza el algoritmo de retropropagación o propagación hacia atrás de los errores (en inglés backpropagation), método usado habitualmente para el entrenamiento de redes.

Se puede descargar desde aquí

www.datalandsoftware.com/files/ffnn.zip

Descomprimimos el componente sobre una carpeta llamada (p.ej) "redes neuronales" y desde nuestro Delphi accedemos a
File->Open

Seleccionamos FFNNPackage.dpk de la carpeta "redes neuronales" y pulsamos "Abrir"

En el ProjectGroup1 hacemos clic con el botón derecho del ratón sobre FNNPackage.bpl y activamos el menú "Install"




Con lo que se instalará el componente TFFNN en la pestaña "Dataland" de la paleta de componentes.
Guardamos y cerramos el ProjectGroup1 con File->Save All, y después File->Close.
Ahora vamos a crear una nueva aplicación de prueba:
File->New-> VCL Forms Application - Delphi for Win32


Arrastramos de la paleta de componentes (pestaña "dataland") "TFFNN" a nuestro Form, creamos un TMemo, y 4 botones (Entrenar, Mostrar, Cargar patrón de entrenamiento, Guardar patrón de entrenamiento)





Después tendremos que indicar los parámetros de nuestra red neuronal:
InputCount (Nº de entradas)=1
InputMax (Máximo número de entradas)=8
InputMin (Mínimo número de entradas)=-1
OutputCount (Nº de salidas)=1
OutputMax (Máximo número de salidas)=10
OutputMin (Mínimo número de salidas)=9
En NLayers indicaremos el número de capas de nuestra red (En este caso tendrá sólo una capa) y el número de neuronas de cada capa=2
Hay que indicar que cuanto mayor sea el número de capas y de neuronas más tiempo tardará la red en conseguir un entrenamiento óptimo.


OBJETIVO DE LA RED
Es la simulación de la función: y= 10 + x


DEFINICIÓN DE BOTONES:
Botón "Cargar patrón de entrenamiento":
FFNN1.LoadFromFile('redneural1.txt');

Botón "Guardar patrón de entrenamiento":
FFNN1.SaveToFile('redneural1.txt');

RedNeural1.txt es un fichero de texto con los parámetros y variables de nuestra red neuronal, que no hay que modificar bajo ningún concepto.

Botón "Entrenar":

procedure TForm1.EntrenarClick(Sender: TObject);
var
i: Integer;
begin
for i:=1 to 10000 do begin

FFNN1.Input[1]:=i mod 7; //Pone la entrada
FFNN1.DesiredOutput[1]:=func( i mod 7 ); //Pone lo que queremos que salga
FFNN1.BackProp; //Entrena la red con este par de valores(In, Out).
{ Cuando se usan vectores: Input, Output y DesiredOutput usan índices entre 1 y Count (Input[1], Input[2], Output[1]...
Los índices: Input[0], Output[0] y DesiredOutput[0] son reservados por la aplicación }
end;
end;

Quizás en este caso no sea necesario llegar a que el índice del bucle "i" llegue a 10000 ya que lo que se hace es que cuando el valor del error cuadrático medio sea menor que 0,01 (P.ej) se detenga el cálculo.
El Error cuadrático medio se calcula desde FFNN1.GetAvgError



Botón "Mostrar":

procedure TForm1.MostrarClick(Sender: TObject);
var
r, t: Real;
i: Integer;
begin
for i:=0 to 6 do begin
r:=i;
FFNN1.Input[1]:=r; //Pone un valor a la neurona de entrada nº 1
FFNN1.CalcOut; //Calcula la salida de la red neuronal. Después de esta linea podremos leer la salida
t:=FFNN1.Output[1];
FFNN1.DesiredOutput[1]:=func( i ); //Calculamos el valor que deseamos tenga en la salida
Memo1.Lines.Add(Format('%f %f %f %f', [r, t, FFNN1.GetAvgError, FFNN1.GetMaxError]));
//Ambos errores son los mismos ya que tenemos 1 output (Avg = Max)
end;
end;

function TForm1.func(x: Real): Real;
begin
//Entrenamos a la red para reproducir esta función
Result:=10 + x;
end;


Abajo os muestro los resultados después de entrenar a la red, como véis los resultados obtenidos se parecen bastante a los esperados con lo que podemos afirmar que la red ha sido entrenada correctamente.
Ahora debemos guardar los parámetros de la red con FFNN1.SaveToFile('redneural1.txt'), de tal forma que la próxima vez que queramos simular la función y=10+x no sea necesario entrenarla ya que bastaría con cargar el patrón de red previamente guardado con FFNN1.LoadFromFile('redneural1.txt').


Links relacionados:
Redes Neuronales y Bolsa
( Predicción de cotizaciones usando redes neuronales )
http://delphimagic.blogspot.com/2008/10/redes-neuronales-y-bolsa-prediccin-de.html