Нейронная сеть в PHP на Denwere 3

С переходом на новую версию Denwera, а соответственно вместе с ним и на новую версию PHP, возникла необходимость в обновлении некоторых расширений. В частности это коснулось и библиотеки – FANN (Fast Artificial Neural Network). Что, конечно же, особо не радовало. Поскольку как было описано в этой статье, изначальная установка данной библиотеки на Denwer 2 c версией PHP 5.2 – радости не принесла. Так как не было ясности: где искать расширение, какие нужны библиотеки и т.д. На первом месте был, конечно же, вопрос: а как обстоят дела с библиотекой FANN для PHP 5.3 под Windows? Но очень быстро был найден ресурс, где есть скомпилированные библиотеки для PHP под Windows от версий 5.3 и выше. Причем как было видно, имелся даже выбор разрядности. А также выбор типа PHP NTS(Non thread safe) или TS(Thread safe). Для того чтобы узнать тип PHP и остальную о нем информацию, необходимо воспользоваться функцией phpinfo().

Установка

После распаковки архива с нужной нам версией библиотеки, нам понадобятся две библиотеки: doublefann.dll и php_fann.dll. Библиотеку doublefann.dll, помещаем в каталог с установленным PHP. А библиотеку php_fann.dll, помещаем в каталог для расширений. Ну и конечно же в файл php.ini не забываем добавить строку, указывающую на подключение нового расширения: extension=php_fann.dll. Далее запускаем Denwer. И если никаких ошибок, не возникло, значит все в порядке и можно приступать к использованию.

Наиболее частой ошибкой может являться, не совместимость типа PHP (NTS/ТS) и скачанной библиотеки. В этом случае, просто сделайте замену библиотеки на другой тип (и библиотеку doublefann.dll соответственно замените тоже).

Рассмотрим небольшой пример, по работе с данной библиотекой и обученной некой нейронной сетью:

define ( 'ROOT_DIR', dirname ( __FILE__ ) );

function MaxValueIndex($Output) {
	$max_value = $Output[0];
	$result = 0;
	
	for ($i = 0; $i < count($Output); $i++) {
		if ($max_value < $Output[$i]) {
			$max_value = $Output[$i];
			$result = $i;
		}
	}	
	return $result;
}
	
$ann = fann_create_from_file(ROOT_DIR . '/neta.net');

$Map = 'DFGHJNRSTVYZ23456789';
$Input = array ();
$Output = array ();
		
if ($Output = fann_run($ann, $Input))		
	echo $Map[MaxValueIndex($Output)];

fann_destroy($ann);

Если сравнить с примером из этой статьи, то сразу становятся очевидны существенные различия. Для работы уже не нужны функции: fann_get_num_output и fann_get_output. А функция fann_run, уже возвращает данные в виде массива, а не типа bool.

Ну а далее все довольно просто. В переменной Map, содержится множество всех вариантов значений-образцов. В нашем случае это набор некоторых символов алфавита. Переменная Input является одномерным массивом (вектором) данных некоторого образа. Но из-за его большого значения, он здесь не приводится. После выполнения выше описанного алгоритма, переменная Output будет содержать следующий массив данных:

Array
(
    [0] => 0.073703924327196
    [1] => -0.037187911779661
    [2] => -0.014984665002293
    [3] => 0.049074021389413
    [4] => 0.04317826416365
    [5] => -0.13511320471205
    [6] => 0.14024452110676
    [7] => 0.10026067223374
    [8] => 0.015948036402742
    [9] => -0.032405991949903
    [10] => 0.027925932867171
    [11] => 0.12326614831609
    [12] => -0.14642914862078
    [13] => 0.019504932156144
    [14] => -0.054388357178927
    [15] => 0.67778910123225
    [16] => 0.071657950915694
    [17] => 0.027491180360883
    [18] => 0.0067914339953066
    [19] => 0.032118565960972
)

Сейчас необходимо выявить позицию самого максимального значения массива возвращенного функцией fann_run. И в этом нам поможет функция MaxValueIndex. В качестве параметра которой и необходимо передать полученный только что результирующий массив данных. Ну, а далее по полученной позиции нейрона из множества Map, мы получаем исходный ответ.

Используемые функции библиотеки:

  • resource ann fann_create_from_file(string configuration_file) – данная функция принимает на вход один параметр, это путь к сконфигурированному файлу с настройками нейронной сети. В случае успеха возвращает указатель на созданную сеть, или FALSE в случае ошибки;
  • bool fann_run(resource ann, array input) – данная функция возвращает массив результатов, размерность массива равна количеству нейронов во входном слое. В качестве параметров этой функции передается указатель на созданную нейронную сеть и входной вектор;
  • bool fann_destroy(resource ann) – эта функция уничтожает созданную нейронную сеть и требует в качестве параметра указатель на созданную ранее нейронную сеть. Результатом функции является TRUE, или FALSE в случае ошибки.

А вот здесь вы можете ознакомиться как спроектировать и собрать нейронную сеть.