2 min. de lectura (aproximado)

Redes neuronales en PHP con fann

(2 min. de lectura) 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.