Покопался в гугле. Не нашёл ни одного вменяемого примера нейронной сети. Что б хоть понять, что это за лабуда такая. На вики есть пространные обьяснения, на специализированных сайтах умные теории с выкладками и формулами из странных значков. А на читабельном языке (php\python) ничего не нашёл.
Пришлось набросать самому. Пример выбрал самый простой, какой смог придумать — сеть учится отличать маленькие русские буквы от всех остальных символов. Некоторые вещи называю не так, как они должны называться, а так, как проще. Большую часть кода можно переписать значительно лучше, но оставил таким, каким код стал в результате копаний в течении 4-х часов.
Вообще, самое сложное, это правильно сформировать нейронные связи. Не в коде, конечно, а в голове, что бы начать понимать смысл сети вообще. В данном примере мы просто подгоняем коэффициенты.
Алгоритм обучения нейронной сети.
/*
Пример нейронной сети, которая учится отличать маленькие русские буквы от всех остальных.
Язык - php.
Пожалуйста, не удаляйте этот текст при копировании. (c) Секрет. Realme.ru
*/
class S { // глаза сети. Каждый глазик видит свою часть данных.
var $input=0;
}
class A { // нейроны
var $inputWeights=array(); // нейрон связан с каждым глазом с разной силой.
var $active=0;
/*
нейрон получает от всех глаз данные, единицу или ноль. Умножаем на силу связи глаз-нейрон, считаем среднее, сравниваем с 0.2 - это число выбрано интуитивно. Если поставить 1, сети потребуется в 4-5 раз больше обучающих примеров.
*/
function think($s){
reset($this->inputWeights);
$this->active=0;
while($temp=each($s)) {
$temp2=each($this->inputWeights);
$this->active+=($temp[1]->input)*$temp2[1];
}
$this->active/=count($s);
$this->active=($this->active > 0.2);
}
/*
при создании нейрона связываем с глазами случайным образом.
*/
function __construct($s){
$this->inputWeights=array();
reset($s);
while($temp=each($s)) {
$this->inputWeights[]=mt_rand(0,100)/100;
}
}
}
class R { // Решатель. Смотрит, что пришло от нейронов, считает среднее, выдаёт ответ.
var $answer=array();
function think($a){
$this->answer=array();
while($temp=each($a)) {
$this->answer[]=$temp[1]->active;
}
return ((array_sum($this->answer)/count($this->answer)) > 0.5);
}
}
$s=array();
$a=array();
for($q=0;$q<8;$q++) $s[$q]=new S(); // В символе восемь бит. Сделаем 8 глаз.
/*
Cделаем 20 нейронов. Собственно, для решения этой задачи достаточно одного нейрона, он нормально обучается. Стоит 20 просто для примера.
*/
for($q=0;$q<20;$q++) $a[$q]=new A($s);
$r=new R();
$correct=0;
for($ww=0;$ww<10000;$ww++){ // просто цикл.
$input=rand(0,255);
/*
Буква ё сложная для обучения, у неё код символа далеко от остальных русских букв.
Поэтому увеличим частоту её выпадания.
*/
if (rand(1,100)==1) $input=ord('ё');
// правильный ответ нужен для процесса обучения.
$answer=((($input<=ord('я'))AND($input>=ord('а')))OR(ord('ё')==$input));
// ну или preg_match('/[а-яё]/',$input);, кому так понятнее.
for($q=0;$q<8;$q++) $s[$q]->input=($input & pow(2,$q)) >> $q; // глазки смотрят.
for($q=0;$q<20;$q++) $a[$q]->think($s); // нейроны думают.
/*
Процесс обучения.
Для каждого нейрона смотрим, ответил ли он правильно.
Почему нейрон ошибается? Потому что не знает, от каких глаз данные важнее. Например, если старший бит ноль, то русской буквой символ точно быть не может. Этого нейрон не поймёт, но научиться, что данные от старшего бита важнее, он может. Изменяем силу связи с теми глазами, которые видели единицу. Единицы от одних глаз станут влиять на результат сильнее, от других - слабее.
*/
for($q=0;$q<20;$q++) if ($a[$q]->active != $answer) {
foreach($a[$q]->inputWeights as $k=>$v){
if ($s[$k]->input) {
$a[$q]->inputWeights[$k]+=(($answer)?0.01:-0.01);
}
}
}
$think=$r->think($a);
// считаем, сколько раз подряд ответили верно.
if ($think == $answer) {
$correct++;
} else {
$correct=0;
}
echo (int)$think;
echo (int)$answer;
echo ' '.chr($input).'';
if ($correct>500) {
echo "Для обучения сети потребовалось $ww обучающих примеров.";
break;
}
}
var_dump($s);
var_dump($a);
var_dump($r);
Понять не могу в какой среде посмотреть этот алгоритм в действии?
Пример написан на php.
Denwer скачай=)
Ппц, ни отступов, ни вообще какого-либо вменяемого форматирования….
Заглянуть в исходный код страницы было лень?
Поставил тег pre. Один фиг при таких шрифтах ничего не читается.
Чувак мега респект тебе, он реально живое!
Спасибо. Как раз то. что нужно. Автор, напиши в icq 11889888 или на мыло. Есть пару вопросов.
вопросы лучше сюда задать.
спасибо уже ненадо. сам понял как научить сеть возвращать символ в качестве ответа. нужно использовать 8 нейронов и из ответ перекодировать в байт->в символ. Главное незабыть каждый нейрон обучать соответствующему биту.
ТЕМА О НЕЙРО СЕТЯХ ОЧЕНЬ ИНТЕРЕСНА, И ОЧЕНЬ СЛОЖНА . ИНТЕРЕСНО, МОЖНО ЛИ ОБУЧИТЬ НЕЙРО СЕТЬ НА ПРЕДМЕТ ПРЕДСКАЗАНИЯ ЧИСЕЛ, КОТОРЫЕ МОГУТ ВЫПАСТЬ В СЛЕДУЮЩЕМ РОЗЫГРЫШЕ?
RTFM.
Или, проще — читай учебники по теории вероятности.
хм, полезно, спасибо)
Очень хорошая статья)) И хорошо, что языком был выбран PHP, хоть он и медленней всяких там си и джав, но сам код лично для меня куда понятнее)
Оно не работает
У комментаторов выше — работает, у тебя — нет. Выводы, думаю, очевидны.
Вываливает кучу непонятных символов. И что? И как понять результат работы?
Прочитать код и понять его. Для практического применения код не подходит. Он для обучения.
Секрет! А можешь тоже самое, но в Mathcad ? Оно будет понятнее для остальных 99% ищущих! А не только для 1% знающих аброкодавбры древнего php
Не знаю, как ты насчитал 99%
.
Впрочем, я не знаю Mathcad, так что нет. Посмотрел сейчас синтаксис — вполне себе нормальный php 5. Хотя реализация кривовата, да.
По-моему, использовать нейросети для распознавания символов по их их коду все равно, что использовать суперкомпьютер для сложения двух чисел. Нейросети используются для распознавания образов в условиях неполноты и искаженности входной информации. Вот если распознование символов по их изображению… Это другое дело.
2Alex:
Не будь занудой.
«Для практического применения код не подходит. Он для обучения» (цэ)
вот проблема поднятая за абру-кадабру всеж актуальна!
кто понимает это пШп как и родной паскаль, то не сочтите за трудность переведите на человеческий язык)
Да что ж везде пхп, да пхп… А на яве толкового примера не найду (
Но все равно спасибо )
Да на кой чёрт нужна эта ява?
.
Эй, не обижайте жабу, хорошая вещь. Все хорошо для своих целей
предположим, что символ с кодом #0 — русский символ.
Ваш код никогда не сможет обучить сеть распознавать этот символ
while($temp=each($s)) {
$temp2=each($this->inputWeights);
$this->active+=($temp[1]->input)*$temp2[1];
}
$this->active/=count($s);
$this->active=($this->active > 0.2);
}
здесь $temp[1]->input может принимать значения или 0 или 1.
Гораздо лучше если бы она принимала 1 или -1. То есть 0 в input менять на -1
символ с кодом #0 — не русский символ.
Зачем это предполагать? Показать, что мой пример — не идеален? Вы понимаете слово «пример»?
Кстати, и весовые коэффициенты лучше сначала раздать
не $this->inputWeights[]=mt_rand(0,100)/100; а
$this->inputWeights[]=mt_rand(-100,100)/100;
О чудо, есть пример на пхп!
Пример норм,отдельно хорошие, что он на пхп, шрифт ГОВНо по меньше еще не мог сделать ? Ждем еще продолжения.
Спасибо, Секрет. Начинаем проходить нейронные сети, искал материал, а тут сразу такое — и на понятном языке и довольно кратко и с комментариями.
Добавил в закладки.
Вот бы еще блок схемку, а то в памяти держать в каком массиве у нас что… только путает
Автору за пример респект, очень хорошая демонстрация идеи. Оффтоп: насмешила фраза «А на читабельном языке (php\python)».
Но это уже субъективное мнение
Может вы мне подскажете, как в Matlab написать программу распознавания цифр!! Буду очень признательна!!!!
хммм
чет не понял что всетаки видят ‘глазики’ ?
что за 0 или 1 ?
типа матрица из глазиков ?
И в чем состоит суть обучения ? тоесть меняется сила связи и проверяется правильный ответ ?
Напиши алгоритм программы
php типа $this->active+=($temp[1]->input)*$temp2[1]; не есть наглядное объяснение сути
можно на perl вообще все в одну строку загнать…..
> меняется сила связи и проверяется правильный ответ
Проверяем ответ и если он неверен — меняем силу связи.
Объясните, пожалуйста, что означает строка
$a[$q]->inputWeights[$k]+=(($answer)?0.01:-0.01);
Как она должна выглядеть на Си-Шарпе?
Зачем тебе си-шарп? Пиши на прологе.
я не думаю что это правильно если в переменной $answer всегда false. И кстати я что-то в интернете искал не нашел… а кирилица вроде как из двух байт состоит? а потом как пользоваться функцией ORD(), она у меня не работает с кирилицей вообще. Да знаю, будете говорить «у других работает у тебя нет» но все же…
у других работает
.
Это же 2008-й год — кодировка cp1251. Под utf8, конечно, нужно немного по-другому писать. Но ты можешь тестировать всё в cp1251.
и где мой вопрос? при удалении моего сообщения мог бы хостябы написать на мыло причину удаления…
Ему не повезло — оказался завален прочими комментариями и не показывался на главной странице в админке. (т.е. он просто был в непроверенных)
можно ли написать сеть по парсингу объявлений
т.е. есть объявления в произвольном виде по недвижимости, необходимо их структурировать, т.е выдергивать цену, этаж и т.д.
регулярками плохо получается, можно ли сделать сетью, заодно обучусь? если да то в сторону чего смотреть? спасибо.
Если только вы на нейронах ИИ напишете. Иначе нет — нейронные сети решают задачи по классификации объектов, а не семантического разбора текста.
ок, мне надо классифицировать цифры в объявлении. т.е. цена это или этаж? или телефон?
Как я сказал выше, я считаю задачу семантического разбора текста на нейронах AI-полной. Т.е. вы либо пишете ИИ на нейронах (я не знаю, возможно ли это) и он классифицирует ваши цифры, либо вы решаете задачу другим способом. Отличаете телефон по количеству цифр, а цену — по рядом стоящим словам («руб», «$», «цена»). Или делаете такую нейронную сеть, которая как раз и отличит телефон от цены по количеству цифр и коду, но это вряд ли разумно.