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

В качестве нейронной сети была выбрана библиотека – FANN (Fast Artificial Neural Network). Как ни странно, но использование нейронной сети в PHP 5.2, вызвало ряд мелких затруднений.

Во-первых, это ее установка. Для работы я использую пакет Denwer. И найти руководство по установке ее на Denwer, мне так и не удалось. Первое что я узнал после прочтения некоторой документации, так это то, что для того чтобы использовать FANN в PHP на Denwere, необходимо скачать расширение php_fann. Здесь все было хорошо, и долго его искать не пришлось. После установки расширения и попытки инициализации были получены ошибки. На следующем этапе поиск информации уже занял более длительное время. Но как оказалось, попытки поиска информации в преодолении проблемы принесли успех. Как выяснилось, необходима еще одна библиотека это fanndoubleMT.dll. Вот эту самую библиотеку (для windows XP) помещаем в каталог windows/system32. Вот теперь все окончательно готово и можем наслаждаться работой этой чудной библиотеки.

Ну, с установкой мы разобрались, а теперь самое время продемонстрировать ее работу. Здесь предполагается, что мы располагаем готовой моделью нейронной сети.

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

$ann = fann_create_from_file(ROOT_DIR . '/neta.net');

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;
}

$Map = 'DFGHJNRSTVYZ23456789';
$Input = array ();
$Output = array ();

if (fann_run($ann, $Input)) {

	for ($i = 0; $i < fann_get_num_output($ann); $i++) {

		$Output[] = fann_get_output($ann, $i);
	}
	echo $Map[MaxValueIndex($Output)];
}

fann_destroy($ann);

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

После выполнения данного скрипта в переменной Output будет размещаться массив следующего вида:

array
(
    [0] => -0.124984497083
    [1] => 0.0362023918336
    [2] => 0.103160730493
    [3] => 0.0227304909574
    [4] => 0.0367053152269
    [5] => 0.0841447045514
    [6] => 0.741507337134
    [7] => -0.165524318402
    [8] => -0.00131124177762
    [9] => 0.0482572488403
    [10] => -0.170440603492
    [11] => 0.118754000147
    [12] => -0.0797734517639
    [13] => -0.0674092885435
    [14] => 0.0151773514834
    [15] => -0.0318037079007
    [16] => 0.103354950974
    [17] => 0.0238432503845
    [18] => 0.402475724765
    [19] => -0.0714993635597
)

Нам необходимо узнать индекс самого релевантного нейрона. Для этой цели используется функция MaxValueIndex. Которая принимает на вход массив значений с релевантностью всех полученных нейронов. Далее по полученному номеру индекса из множества Map получаем ответ. Ответом будет некий символ.

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

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

Скачать необходимые библиотеки можно здесь.

Про проектирование и создание нейронных сетей смотрите здесь.