В качестве нейронной сети была выбрана библиотека – 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 в случае ошибки.
Скачать необходимые библиотеки можно здесь.
Про проектирование и создание нейронных сетей смотрите здесь.
Нейронная сеть в PHP на Denwere 2
В качестве нейронной сети была выбрана библиотека – FANN (Fast Artificial Neural Network). Как ни странно, но использование нейронной сети в PHP 5.2, вызвало ряд мелких затруднений.
Во-первых, это ее установка. Для работы я использую пакет Denwer. И найти руководство по установке ее на Denwer, мне так и не удалось. Первое что я узнал после прочтения некоторой документации, так это то, что для того чтобы использовать FANN в PHP на Denwere, необходимо скачать расширение php_fann. Здесь все было хорошо, и долго его искать не пришлось. После установки расширения и попытки инициализации были получены ошибки. На следующем этапе поиск информации уже занял более длительное время. Но как оказалось, попытки поиска информации в преодолении проблемы принесли успех. Как выяснилось, необходима еще одна библиотека это fanndoubleMT.dll. Вот эту самую библиотеку (для windows XP) помещаем в каталог windows/system32. Вот теперь все окончательно готово и можем наслаждаться работой этой чудной библиотеки.
Ну, с установкой мы разобрались, а теперь самое время продемонстрировать ее работу. Здесь предполагается, что мы располагаем готовой моделью нейронной сети.
Переменная Map содержит перечисленное множество значений, на которых обучена нейронная сеть. В данном случае это множество символов. Переменная Input это массив в качестве вектора значений образа (здесь ее значение не приводится из-за большого ее объема). Под цифрой один указываются значащие сигналы и под нулем наоборот. В данном случае под цифрой один обозначаются черные пикселы, и белые пикселы под цифрой ноль. Переменная Output это будущий массив релевантности нейронов.
После выполнения данного скрипта в переменной Output будет размещаться массив следующего вида:
Нам необходимо узнать индекс самого релевантного нейрона. Для этой цели используется функция MaxValueIndex. Которая принимает на вход массив значений с релевантностью всех полученных нейронов. Далее по полученному номеру индекса из множества Map получаем ответ. Ответом будет некий символ.
Используемые функции библиотеки:
Скачать необходимые библиотеки можно здесь.
Про проектирование и создание нейронных сетей смотрите здесь.