Построение нейронных сетей в php используя FANN, пример реализации

Передо мной предстала задача анализа большого количества информации и выявления закономерностей. И первое, что пришло в голову — построить математическую модель с помощью нейронной сети

Поскольку данные для анализа формируются в php и мне этот язык сейчас ближе всего, то искалась библиотека с интерфейсом для php. В связи с этим мне порекомендовали FANN (Fast Artificial Neural Network) — открытое программное обеспечение для построения сетей. У этого решения есть апи для 15 языков, так что почти каждый сможет выбрать что-то для себя. 

Пример. Распознавание языка текста на странице

Для примера возьмем задачу легкую, но недалекую от нашей реальности и от серьезных задач. Допустим есть 1000 документов, на 3-х разных языках. Пусть это будут французский, английский и польский. Наша задача научить нейронную сеть распознавать язык документа. Для этого мы используем самый простой частотный механизм. Но тем не менее его результаты неплохи. Его суть в том, что у каждого языка с разной частотой в тексте встречаются одни и те же символы. Мы подготавливаем 3 больших куска текста для каждого из языков (английский, французкий, польский), посчитаем для каждого символа частоты. Эти данные мы передадим в нейронную сеть, с указанием какой набор частот принадлежит каждому из языков. Дальше нейронная сеть все сделает сама.

Начнем с установки FANN

Пример, установки привожу для Ubuntu.

1) Нужно установить пакеты libfann1 и libfann1-dev
apt-get install libfann* 

2) Добавить поддержку fann в php

У меня стоит Apache и установлен модуль php5-dev, поэтому я делаю так

# wget http://pecl.php.net/get/fann # tar xvfz fann # cd fann-0.1.1 # phpize # ./configure # make
Если при компиляции появиться ошибки и среди них будет вот такая 
fann.c:393: error: ‘zif_fannOO___set’ undeclared (first use in this function)
то следует отредактировать файл php_fann.h и за комментировать строчку 28 #define PHP_FANN_OO 1
После этого заново скомпилировать.
В итоге у нас генерируются модули которые нужно подключить к php
sudo cp -R ./modules/* /usr/lib/php5/20090626+lfs/
 
3) И в php.ini дописать
extension=fann.so
 
4) Перегрузили апач и проверили что все ок
php -m | grep fann
 

Решение задачи

Для этого нужно выполнить 2 шага:
1) Обучить сеть (первый листинг)
2) И использовать готовую модель для классификации (второй листинг)
 
Приведу пример для первого этапа и сразу укажу ссылку на документацию
(Код я максимально снабдил комментариями, что бы было понятно что к чему и не разбирать его отдельно)
 
Файл train.php
<?php /* 
* Задаем параметры сети. 256 - это количество входов, оно должно равняться количеству ваших параметров, 
* По хорошему в этом примере должно быть намного меньне, равно количесству букв в алфавитах. 
* 128 - это количество нейронов в промежуточном слое. Здесь нуужно экспериментальным путем подбирать это число. 
* 3 это количество выходящих сигналов. По скольку у нас 3 языка, то для каждого будет возвращена вероятность 
* 1.0 - connection_rate - его лучше не менять 
* 0.7 - learning_rate - описано здесь хорошо http://www.basegroup.ru/glossary/definitions/learning_rate/ * 
*/ 
$ann = fann_create(array(256, 128, 3), 1.0, 0.7); /* 
* Первый параметр - указатель на нашу сеть, второй - обучающие данные. 
* Мы загружаем 3 порции данных.Каждая порция состоит их входящих показателей и эталонных результирующих. 
* В нем мы сообщаем, что при таких показателях, как мы сейчас передаем, нужно весь вес 
* отдавать на первы нейрон (array(1, 0, 0) // Outputs). при загрузке других типов данный мы смещаем вес на другой нейрон 
* generate_frequencies - просто расчитывает частоты. * 
* Последние 3 параметра это 
* - максимальное кол-во итераций 
* - максимальное кол-во ошибок 
* - промежуток между выводами информации * 
* В файлах en.txt, fr.txt, pl.txt хранится текс размером где-то в 10000 символов для конкретного языка 
* */ 
fann_train($ann, array( array( generate_frequencies(file_get_contents("en.txt")), 
// Inputs array(1, 0, 0) // Outputs ), array( generate_frequencies(file_get_contents("fr.txt")), 
// Inputs array(0, 1, 0) // Outputs ), array( generate_frequencies(file_get_contents("pl.txt")), 
// Inputs array(0, 0, 1) // Outputs ), ), 100000, 0.00001, 1000 ); 
/* * Сохранить нашу модель в файл. в дальнейшем ее можно использовать для класификации * */ 
fann_save($ann,"classify.txt"); 
/* * Функция расчета частот * */ 
function generate_frequencies($text){ 
// Удалим все кроме букв 
$text = preg_replace("/[^p{L}]/iu", "", strtolower($text)); 
// Найдем параметры для расчета частоты 
$total = strlen($text); $data = count_chars($text); 
// Ну и сам расчет 
array_walk($data, function (&$item, $key, $total){ $item = round($item/$total, 3); }, $total); 
return array_values($data); } 
?>

В коде выше мы только сгенерировали модель. А теперь проверим ее в деле, код ниже анализирует текст и выдает оценку принадлежности к тому или иному языку. 

Файл run.php

<?php 
/* * Загружаем модель из файла. Эту модель мы создали на предыдущем шаге. * */ 
$ann = fann_create("classify.txt"); 
/* * Ниже я в нашу сеть передаю 3 текста на разных языках * Смотрим результат * */ 
$output = fann_run($ann, generate_frequencies("ANN are slowly adjusted so as to produce the same output as in the examples. The hope is that when the ANN is shown a new X-ray images containing healthy tissues")); var_dump($output); 
$output = fann_run($ann, generate_frequencies("Voyons, Monsieur, absolument pas, les camions d’aujourd’hui ne se traînent pas, bien au contraire. Il leur arrive même de pousser les voitures. Non, croyez moi, ce qu’il vous faut, c’est un camion ! - Vous croyez ? Si vous le dites. Est-ce que je pourrais l’avoir en rouge ? - Bien entendu cher Monsieur,vos désirs sont des ordres, vous l’aurez dans quinze jours clé en main. Et la maison sera heureuse de vous offrir le porte-clé. Si vous payez comptant. Cela va sans dire, ajouta Monsieur Filou. - Ah, si ce ")); 
var_dump($output); 
$output = fann_run($ann, generate_frequencies("tworząc dzieło literackie, pracuje na języku. To właśnie język stanowi tworzywo, dzięki któremu powstaje tekst. Język literacki ( lub inaczej artystyczny) powstaje poprzez wybór odpowiednich środków i przy wykorzystaniu odpowiednich zabiegów technicznych. Kompozycja - jest to układ elementów treściowych i formalnych dzieła dokonanych według określonych zasad konstrukcyjnych. Kształtowanie tworzywa dzieła literackiego jest procesem skomplikowanym i przebiegającym na wielu poziomach. Składa się na nie:")); 
var_dump($output); 
?>

Результат

Наша модель сгенерировала следующие ответы по текстам. 
В первом случае модель решила что ей на вход передали английский язык (98%) и она права:
array(3) { 
         [0]=> float(0.98745632171631) 
         [1]=> float(0.0094089629128575) 
         [2]=> float(0) 
}

Во втором тексте она приняла решение в пользу французского и снова оказалась права:

array(3) { 
         [0]=> float(0)
         [1]=> float(0.99334162473679)
         [2]=> float(0) 
}

Третий текст она тоже правильно распознала, как польский:

array(3) { 
         [0]=> float(0.015697015449405) 
         [1]=> float(0) 
         [2]=> float(1) 
}

Некоторые пользователи жалуются что нейронные сети выдают вероятности, а не конкретный ответ. Для тех кто в танке добавлю, что в нашем мире все основано на вероятностях. За правильный ответ нужно считать тот который верен хотя бы на 90%, если меньше то сеть нужно до обучать, что бы улучшить классификацию.

 

Не смотря на такую простую систему нейронная сеть дает хорошие показатели. Можно сделать n-граммы и по ним классифицировать, это будет еще надежнее, можно оба варианта комбинировать. Нейронные сети мощный инструмент, нужно лишь научиться им пользоваться...


искусственные нейронные сети программное обеспечение сети Кохонена
Если у вас есть статья, заметка или обзор, которыми вы хотите поделиться с аудиторией нашего сайта, присылайте информацию на: neuronus.com@yandex.ru.
Гость, оставишь комментарий?
Имя:*
E-Mail:


Последние комментарии
Почему космос не имеет начала и конца: комментарии учёных
Земля находится трёх слонах, которые стоят на черепахе
Судьба ледокола «Арктика» остается неопределенной после повреждения одного из двигателей
Народ теперь что бы накачать мышцы и убрать лишний жир можно без спорта и диет, просто надел и забыл. Опробовал лично и результат удивил уже через
Сообщение о покупке водородной яхты Билом Гейтсом оказалось ложным
Народ теперь что бы накачать мышцы и убрать лишний жир можно без спорта и диет, просто надел и забыл. Опробовал лично и результат удивил уже через
Для чего динозавру абдараинуру такой необычный хвост
Народ теперь что бы накачать мышцы и убрать лишний жир можно без спорта и диет, просто надел и забыл. Опробовал лично и результат удивил уже через
Получены самые детальные снимки поверхности Солнца
Народ теперь что бы накачать мышцы и убрать лишний жир можно без спорта и диет, просто надел и забыл. Опробовал лично и результат удивил уже через
Мы в социальных сетях
Статистика
0  
Всего статей 2562
0  
Всего комментариев 999
0  
Пользователей 192