REDES NEURONALES EN PHP CON FANN

FANN significa Fast Artificial Neural Network. Es una extensión de PHP que actúa como wrapper de la librería en C llamada FANN.
Permite crear, entrenar y ejecutar redes neuronales artificiales multicapa de forma súper rápida y ligera directamente desde PHP.

¿Para qué sirve?

  • Clasificación.
  • Predicción.
  • Reconocimiento de patrones.
  • Cualquier tarea de machine learning sencilla donde se requiera algo rápido y sin dependencias pesadas como TensorFlow o PyTorch.
Es ideal para proyectos donde no quieres montar un servidor de Python solo para una red neuronal pequeña. Es muy rápida (hasta 150 veces más que otras librerías antiguas) y soporta redes fully connected y sparse.

Características principales

  • Algoritmos de entrenamiento: backpropagation, Cascade, Quickprop, RPROP, SARPROP…
  • Activaciones: sigmoid, tanh, etc..
  • Guardar/cargar redes en archivos (.net).
  • Entrenamiento con datos en archivos o en memoria.
  • Escalado automático de entradas/salidas.
  • Soporta PHP en Linux y Windows (con DLLs precompiladas).

Ejemplo clásico: resolver XOR

Crear un archivo "xor.data" con los datos de entrenamiento:

4 2 1
-1 -1
-1
-1 1
1
1 -1
1
1 1
-1
Entrenamiento (guarda como train.php)::

$num_input = 2;
$num_output = 1;
$num_layers = 3;
$num_neurons_hidden = 3;
$desired_error = 0.001;
$max_epochs = 500000;
$epochs_between_reports = 1000;

$ann = fann_create_standard($num_layers, $num_input, $num_neurons_hidden, $num_output);

if ($ann) {
    fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
    fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);

    $filename = dirname(__FILE__) . "/xor.data";
    if (fann_train_on_file($ann, $filename, $max_epochs, $epochs_between_reports, $desired_error)) {
   fann_save($ann, dirname(__FILE__) . "/xor_float.net");
   echo "¡Red entrenada y guardada!\n";
    }
    fann_destroy($ann);
}
Probar (guarda como test.php):

$ann = fann_create_from_file("xor_float.net");

$input = array(-1, 1);
$calc_out = fann_run($ann, $input);

printf("XOR (-1, 1) = %.4f\n", $calc_out[0]); // Debería dar ≈ 1

fann_destroy($ann);
Ejecutar "php train.php" y luego "php test.php". Y ver los resultados.