Построение нейронных сетей в 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:


Свежее новое
  • 10 известных вещей, которые были изобретены женщинами
  • Хоть и считается, что все изобретения в мире сделаны представителями мужского пола, есть известные вещи, которыми мы пользуемся каждый день,
  • Обнаружили новые артефакты, которые доказывают, что на Земле в древности жила очень развитая раса
  • Не так давно группе археологов удалось найти ряд интересных артефактов. Обнаруженные предметы стали причиной возникновения жарких споров между
  • Удалось сделать качественные фото первого серийного ударного вертолета Ми-28НМ
  • В интернет выложены фотоснимки выпускаемого серийно наиболее совершенного боевого вертолёта из РФ, который создан на основе Ми-28Н. В блоге центра,
  • Астроном «охотился» на секретный космоплан США X-37B и заснял его на орбите Земли
  • Космоплан Boeing X-37В — экспериментальная версия американского летательного аппарата, предположительно способного функционировать на высотах более
  • Атлантику окружил огромный «ковер» из саргассовых водорослей, испугав туристов
  • Изучая спутниковые снимки, американские ученые обнаружили, что в Атлантическом океане начиная с 2011 года постоянно образуется гигантский «ковер» из
Последние комментарии
Ученые раскрыли тайну «хабаровского метеорита»
Гиперзвуковой блок Авангард, чп случилось буквально накануне сообщения об успешных испытаниях. В сообщениях указывалось, что боевой блок был выпущен
Американский физик доказал, что Вселенная может быть двумерной
КОСМОС это Вечная, Единая, Субстанция, которая не имеет ни Массы, ни Пространства, ни Энергии. Эти понятия для Космоса Нулевые, их просто НЕТ.
Ученые раскрыли тайну «хабаровского метеорита»
Были там знакомые, и не фига не оползень и камета была, военные учение были, и не туда попала ракета
Благодаря перовскиту в ближайшем будущем может произойти переворот в энергетике
А как же управляемый термоядерный реактор? Именно освоение термоядерной энергии даст прорыв. Как в свое время (и сейчас) обеспечивает ядерная
Японцы создали энцефалитных клещей для борьбы с Россией: правда или миф
Бред, энцефалит был на ДВ всегда. Дохли от него пачками во время разных покорений Сибири, потом была специальная экспедиция(в 1937г.) и в её ходе
Мы в социальных сетях
Статистика
3  
Всего статей 2098
1  
Всего комментариев 368
0  
Пользователей 124