В этой статье мы рассмотрим инсталляцию fann и построение простейшей нейронной сети, которая будет возвращать ответ XOR-функции (исключающее ИЛИ).
Постановка задачи
XOR-функция — это логическая функция. Она возвращает true, если один из аргументов равен true, а другой false. Возвращает false, если оба аргумента принимают одно и то же значение. Можно увидеть, что в данном случае работу функцию легко запрограммировать обычным оператором IF, но мы пойдем другим путем и покажем, что можно сделать это с применением нейронных сетей.
Установка FANN
Я устанавливал на Debian 8. Процедура такая:
wget wget http://pecl.php.net/get/fann
tar xfvz fann
cd fann-1.1.0/
apt-get install php5-dev #если не установлен
phpize
./configure
make
cp -R ./modules/* /usr/lib/php5/20131226/ #папка может быть другой
echo "extension=fann.so" > /etc/php5/cli/conf.d/30-fann.ini
php -m | grep fann #должны увидеть ответ "fann"
Обучение нейронной сети
Для обучения нужно создать такой файл:
[xor.data]
4 2 1
-1 -1
-1
-1 1
1
1 -1
1
1 1
-1
и скрипт обучения (он должен быть в одной папке с файлом xor.data):
<?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);
fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);
fann_train_on_file($ann, "xor.data", $max_epochs, $epochs_between_reports, $desired_error);
fann_save($ann, "xor_float.net");
fann_destroy($ann);
?>
После запуска этого скрипта появится файл xor_float.net, который представляет собой описание нейронной сети.
Обучение можно запустить только один раз.
Использование полученной нейронной сети
Создадим скрипт, который по входным двум параметрам определяет один выходной параметр с использование полученной нейронной сети в файле xor_float.net :
<?php
$input = array();
$ann = fann_create_from_file("xor_float.net");
$input[0] = 1;
$input[1] = 1;
$calc_out = fann_run($ann, $input);
printf("xor test (%f,%f) -> %f\n", $input[0], $input[1], $calc_out[0]);
fann_destroy($ann);
?>
Массив $input — это входные параметры и его можно менять. Можно убедиться, что ответы нейронная сеть выдает верные:
xor test (-1.000000,-1.000000) -> -0.993424
xor test (-1.000000,1.000000) -> 0.940121
xor test (1.000000,-1.000000) -> 0.930212
xor test (1.000000,1.000000) -> -0.990104