(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

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

Источник: habrahabr
rechik

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

Поскольку данные для анализа формируются в 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/

И в php.ini дописать
 

extension=fann.so

Перегрузили апач и проверили что все ок
 

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-граммы и по ним классифицировать, это будет еще надежнее, можно оба варианта комбинировать. Нейронные сети мощный инструмент, нужно лишь научиться им пользоваться
 

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 16.11.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Advanced Data Export VCL Suite (with sources) + 1 Year Maintenance
Allround Automation PL/SQL Developer - Annual Service Contract - Single user
Symantec Endpoint Protection Small Business Edition, Initial Hybrid Subscription License with Support, 1-24 Devices 1 YR
VMware Workstation Pro 12 for Linux and Windows, ESD
Nero 2018 Platinum ESD
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
СУБД Oracle "с нуля"
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
Реестр Windows. Секреты работы на компьютере
Новые материалы
Компьютерная библиотека: книги, статьи, полезные ссылки
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
Обсуждения в форумах
Написание программ для микроконтроллеров AVR, PIC, ARM, STM32 (27)
Напишу любую программу на любом искусственном языке. Профессиональный программист. Основная...
 
Ищу программиста для написания программы (63)
Ищу программиста ,владеющего Вижуал Бэйсик и программированием в Экселе, для написания...
 
Разработка программ базы данных (68)
Написание прикладных компьютерных программ (базы данных) на заказ. Разработка корпоративных...
 
Обучение программированию Python Delphi C# Mysql MSSQL (1)
Провожу обучение по технологиям : Python Delphi C# Mysql MSSQL Прокачка...
 
Ремонт часов (3)
Подскажите, куда можно отнести часы для ремонта?
 
 
 



    
rambler's top100 Rambler's Top100