С переходом на новую версию 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 в случае ошибки.
А вот здесь вы можете ознакомиться как спроектировать и собрать нейронную сеть.
Нейронная сеть в 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 соответственно замените тоже).
Рассмотрим небольшой пример, по работе с данной библиотекой и обученной некой нейронной сетью:
Если сравнить с примером из этой статьи, то сразу становятся очевидны существенные различия. Для работы уже не нужны функции: fann_get_num_output и fann_get_output. А функция fann_run, уже возвращает данные в виде массива, а не типа bool.
Ну а далее все довольно просто. В переменной Map, содержится множество всех вариантов значений-образцов. В нашем случае это набор некоторых символов алфавита. Переменная Input является одномерным массивом (вектором) данных некоторого образа. Но из-за его большого значения, он здесь не приводится. После выполнения выше описанного алгоритма, переменная Output будет содержать следующий массив данных:
Сейчас необходимо выявить позицию самого максимального значения массива возвращенного функцией fann_run. И в этом нам поможет функция MaxValueIndex. В качестве параметра которой и необходимо передать полученный только что результирующий массив данных. Ну, а далее по полученной позиции нейрона из множества Map, мы получаем исходный ответ.
Используемые функции библиотеки:
А вот здесь вы можете ознакомиться как спроектировать и собрать нейронную сеть.