PDA

Просмотр полной версии : Нейронная сеть [PHP]


OnlyOn
20.01.2011, 00:10
Примеры нейронных сетей на PHP​

Совокупность нейронов соединённых тем или иным способом называется искусственной нейронной сетью или просто нейронной сетью.

Закон по которому нейроны соединены в сеть носит название структуры или топологией сети.


Иску́сственные нейро́нные се́ти (ИНС)
— математические модели, а также их программные или аппаратные реализации, построенные по принципу организации и функционирования биологических нейронных сетей — сетей нервных клеток живого организма. Это понятие возникло при изучении процессов, протекающих в мозге, и при попытке смоделировать эти процессы. Первой такой попыткой были нейронные сети Маккалока и Питтса. Впоследствии, после разработки алгоритмов обучения, получаемые модели стали использовать в практических целях: в задачах прогнозирования, для распознавания образов, в задачах управления и др.
Иску́сственный нейро́н (Математический нейрон Маккалока — Питтса, Формальный нейрон)
— узел искусственной нейронной сети, являющийся упрощённой моделью естественного нейрона. Математически, искусственный нейрон обычно представляют как некоторую нелинейную функцию от единственного аргумента — линейной комбинации всех входных сигналов. Данную функцию называют функцией активации или функцией срабатывания, передаточной функцией. Полученный результат посылается на единственный выход. Такие искусственные нейроны объединяют в сети — соединяют выходы одних нейронов с входами других. Искусственные нейроны и сети являются основными элементами идеального нейрокомпьютера


Множество нейронов не соединённых между собой, но соедененные с другими нейронами носит название слоя нейрона.

ИНС бывают 2х видов:

1) Однослойные

2) Многослойные

Перцептрон или "атом" ИНС​

Обычный перцептрон состоит из 1-го нейрона (Первый тип - однослойный), у которого n входов и пороговая функция активации.

Поскольку выходами сети является +1 или -1. То перцептрон эффективен для решение задачи классификации 2-х классов.

Если выход +1, то поданный на вход вектор принадлежит к I-классу, если -1 — II классу.

Вначале на 0-шаге обучения, веса входа перцептрона задаются случайным образом.

Суть обучения состоит в изменение весов.

Для осуществления процедуры обучения для всякой нейронной сети в том числе и для простого перцептрона до начала формируется обучающая выборка состоящая из векторов, которые называются обучающими векторами, причем каждый обучающий вектор состоит их 2х частей:

1) Те значения, которые подаются на вход

2) То, что должно быть с нашей точки зрения на выходе сети когда на вход сети поданы компоненты из 1-й части

Общий вид обучающего вектора:


( x1, x2, ..., Xn, {+1, -1}).


Вообще говоря, вторая часть может быть пустой, в этом случае говорят, что обучение происходит без учителя.

Если есть — с учителем.

Вектора обучающей выборки подаются на вход сети и в соответствии с поданными векторами меняются веса Wi, i=1, n в ходе процедуры обучения.

Для простого перцептрона процедура выглядит следующим образом:

1) Подаем на вход компоненты 1й части вектора обучающей выборки Xp = (X1p, ..., Xnp), p=1, P. P — индекс вектора обучающей выборки. На этой стадии считается выход y = (Xp).

2) Сравниваем выход сети с желаемым значением.

y(xp)? d(xp),

— d(xp) — желаемое значение

— y(xp) — значение сети

Если y(xp) == d(xp) (как и надо), то p=p+1, переходим на шаг1.

Иначе — шаг 3.

3) Новое значение i-веса: Wi(t) = Wi(t-1) + d(Xp)*Xi.

p=p+1, шаг 1

Вообще говоря процедура завершена, если все вектора прошли.

Возможны 2 случая:

— обучающей выборки мало для обучения сети

— обучение завершилось гораздо раньше, чем конец выборки.


Теорема сходимости (Новикова):
Если существует набор весов W* способный разделить 2 класса с помощью простого перцептрона, то предложенный алгоритм сходится к некому решению не обязательно совпадающего с W*, причем сходится за конечное число шагов.


Доказательство.

В силу использовании функции sign в определении нейрона мы можем считать ||W*||=1.

Введем в рассмотрение косинус угла между текущим значением набора весов и W*.


cos угол = (W, W*)/||W||.
(1) (W(t+1), W*) = (W(t), W*) + d(X)*(X, W*).


Поскольку W* является точным решением, то |(W*, X)|>=delta>0.

Коль скоро происходит процедура обучения, то текущий набор векторов W(t) неправильно осуществляет классификацию для текущего вектора X, а значит величина d(x)*(x, W*) = |(X, W*)|, а потому имеем (1) >= (W(t), W*)+delta.


|| W(t+1) || **2 = ||W(t)||**2 + ||X||**2 + 2d(X)*(x, w(t)).


В силу той же логики, коль скоро происходит обучение, то знаки d(x)*(X, W(T)) (W(0), W*)+tdelta.
||W(t+1)|| (W(0), W*)+tdelta.
||W(t+1)|| +inf.

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

Доказано.


Замечания 1: Если положить W(0) = 0, то из равенства косинуса tmax = M2/Delta.
Очевидно, что tmax здесь чем больше разброс векторов выборки и тем больше, чем меньше расстояние между классами.
Замечание 2: Существенно важно при формировании существования W*.
Если классы неразделимы, то простого перцептрона не хватит для решения задачи.


Классический пример задачи, которую не сможет решить простой перцептрон является XOR.

Нейронная сеть на PHP​1) Для начала создадим класс перцептрона. Там мы зададим веса, размерности и пороги.

Так-же реализуем функцию активации, которая в цикле будет разберать "веса".


W[$i];

}

if($sum>$this->porog) return1;

return -1;

}

2) Теперь зададим функцию "порогов".


/**

* Конструктор

* Аргумент - размерность перцептрона

*

* @param int $n

*/

public function__construct($n)

{

$this->size=$n;

$this->porog=100;

$this->init_weight();

}




3) Опять займёмся весами. Будем тыкать пальцем в небо и используем рандом


/**

* Инициализация ачальных весов.

* Рандом

*

*/

public functioninit_weight()

{

for($i=0;$isize;$i++)$this->W[] =rand(0,10);

}



/**

* Сохраняем в фа л

* Если файл есть - перезапишет

*

* @param string $filename

*/

public functionweight_save($filename)

{

$serialize=serialize($this->W);

fwrite(fopen($filename,"w"),$serialize);

}

4) Теперь загружаем ранее сгенерированый результат.


/**

* Грузим весы из файла

*

*

* @param string $filename

*/

public functionweight_load($filename)

{

$this->W=unserialize(file_get_contents($filename));

}



public functionteach($vector,$d)

{

if($d!=$this->ask($vector))

{

// teach

for($i=0;$isize;$i++)

{

$this->W[$i] +=$d*$vector[$i];

}

}

}

}

5) Теперь перейдём к самому вкусному =) Тут Мы зададим матрицу для распознавания линий и квадраток.

Как Вы понимаете 1 - это "обозначенные" пиксели, а 0 - "пустые". В нашем случае - черное и белое.

Тут мы зададим обучение в видео матриц 8х8 пикселей.


/**

* Example

*/

$filename='w1.txt';



/**

* Наш перцептрон буд т говорить что дали на в од, квадрат или прямую.

* Следует учесть, что в этом примере перцептро на спрашивают

* о том, чего небыло в учении.

*/



$neural= newPerceptron(64);// матрица будет 8х8, размер ость 64.


6) Обучаем перцептрон распознавать квадраты.


if(!isset($filename))

{



/**

* Учим квадраты

*/

$v1= array(1,1,1,1,1,1,1,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,1,1,1,1,1,1,1,

);

$neural->teach($v1,1);

$v1= array(0,1,1,1,1,1,1,1,

0,1,0,0,0,0,0,1,

0,1,0,0,0,0,0,1,

0,1,0,0,0,0,0,1,

0,1,0,0,0,0,0,1,

0,1,0,0,0,0,0,1,

0,1,0,0,0,0,0,1,

0,1,1,1,1,1,1,1,

);

$neural->teach($v1,1);

$v1= array(0,0,0,0,0,0,0,0,

1,1,1,1,1,1,1,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,1,1,1,1,1,1,1,

);

$neural->teach($v1,1);

$v1= array(0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

1,1,1,1,1,1,1,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,1,1,1,1,1,1,1,

);

$neural->teach($v1,1);

$v1= array(0,0,1,1,1,1,1,1,

0,0,1,0,0,0,0,1,

0,0,1,0,0,0,0,1,

0,0,1,0,0,0,0,1,

0,0,1,0,0,0,0,1,

0,0,1,0,0,0,0,1,

0,0,1,1,1,1,1,1,

0,0,0,0,0,0,0,0,

);

$neural->teach($v1,1);

$v1= array(1,1,1,1,1,1,1,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,0,0,0,0,0,0,1,

1,1,1,1,1,1,1,1,

);

$neural->teach($v1,1);





7) Тут обучим распознавать разного рода прямые


/**

* Теперь учим пр мые.

*/

$v1= array(1,1,1,1,1,1,1,1,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

);

$neural->teach($v1,-1);





$v1= array(0,0,0,0,0,0,0,1,

0,0,0,0,0,0,1,0,

0,0,0,0,0,1,0,0,

0,0,0,0,1,0,0,0,

0,0,0,1,0,0,0,0,

0,0,1,0,0,0,0,0,

0,1,0,0,0,0,0,0,

1,0,0,0,0,0,0,0,

);

$neural->teach($v1,-1);

$v1= array(0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

1,1,1,1,1,1,1,1,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

);

$neural->teach($v1, -1);



$v1= array(0,1,0,0,0,0,0,0,

0,1,0,0,0,0,0,0,

0,1,0,0,0,0,0,0,

0,1,0,0,0,0,0,0,

0,1,0,0,0,0,0,0,

0,1,0,0,0,0,0,0,

0,1,0,0,0,0,0,0,

0,1,0,0,0,0,0,0,

);

$neural->teach($v1,-1);



$v1= array(1,0,0,0,0,0,0,0,

0,1,0,0,0,0,0,0,

0,0,1,0,0,0,0,0,

0,0,0,1,0,0,0,0,

0,0,0,0,1,0,0,0,

0,0,0,0,0,1,0,0,

0,0,0,0,0,0,1,0,

0,0,0,0,0,0,0,1,

);

$neural->teach($v1,-1);



$v1= array(0,0,0,0,0,1,0,0,

0,0,0,0,0,1,0,0,

0,0,0,0,0,1,0,0,

0,0,0,0,0,1,0,0,

0,0,0,0,0,1,0,0,

0,0,0,0,0,1,0,0,

0,0,0,0,0,1,0,0,

0,0,0,0,0,1,0,0,

);

$neural->teach($v1,-1);



8) Теперь запишем выученый материал в файл


/**

* Выучили неболь ой выборкой.

* Запишем веса в файл.

*/



$neural->weight_save("w1.txt");

}

else

{

// Чтобы каждый раз не учит ся, грузим.

$neural->weight_load($filename);;

}

9) Теперь проверим нашу ИНС =)


// Даем на вход квадрат, ко орого нету в выборке

$v1= array(0,0,1,1,1,1,1,1,

0,0,1,0,0,0,0,1,

0,0,1,0,0,0,0,1,

0,0,1,0,0,0,0,1,

0,0,1,0,0,0,0,1,

0,0,1,0,0,0,0,1,

0,0,1,0,0,0,0,1,

0,0,1,1,1,1,1,1,

);

echo$neural->ask($v1)==1?"Квадратик":"прямая";

echo"\r\n";

// Еще один

$v1= array(0,0,0,0,0,0,0,0,

0,0,1,1,1,1,1,0,

0,0,1,0,0,0,1,0,

0,0,1,0,0,0,1,0,

0,0,1,0,0,0,1,0,

0,0,1,0,0,0,1,0,

0,0,1,1,1,1,1,0,

0,0,0,0,0,0,0,0,

);

echo$neural->ask($v1)==1?"Квадратик":"прямая";

echo"\r\n";





// Теперь спросим про линии

$v1= array(0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

1,1,1,1,1,1,1,1,

0,0,0,0,0,0,0,0,

);



echo$neural->ask($v1)==1?"Квадратик":"прямая";

echo"\r\n";



// Здесь просим про прямую длиной 5, а не 8.

$v1= array(0,0,0,0,1,0,0,0,

0,0,0,1,0,0,0,0,

0,0,1,0,0,0,0,0,

0,1,0,0,0,0,0,0,

1,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

);



echo$neural->ask($v1)==1?"Квадратик":"прямая";

echo"\r\n";



?>

Скачать (http://www.sendspace.com/file/yfs6hj) архив с PHP скриптом!

Материал взят from google

Изложил более-менее подробно. Как-раз решил занятся написанием нейронки для распознавания текстов

Всем спасибо за внимание! Надеюсь Вам понравилось =)

HBWS
21.01.2011, 17:42
Да... Это тебе не фейки контактов лепить... Очень познавательно, спасибо

mr.The
21.01.2011, 19:29
Я очень люблю эту тему, но код ты нагло спиздил. Я не помню откуда, но я 100% работал с этим кодом, структуру этого класса, имена функций и даже текстовых файлов я очень хорошо запомнил. Не хорошо это.

пс. на пхп писать подобное смысла нет. Чему-то серьёзному обучать эту сеть ты будешь до второго пришествия.

UPD:

Ага, а вот и источник: http://habrahabr.ru/blogs/artificial_intelligence/40659/

да и саму статью ты скопировал. Я думаю, тут не катит выдавать статью за свою просто переписывая пару предложений своими словами и тупо копируя остальное.

пс. требую показательную казнь!

gibson
21.01.2011, 19:37
>>пс. на пхп писать подобное смысла нет. Чему-то серьёзному обучать эту сеть ты будешь до второго пришествия.

это точно. лучше уже в матлабе обучить или в SNN

Gusev
21.01.2011, 19:45
Все равно очень и очень много частных случаев, поэтому нельзя всё это рассматривать как одно целое...

OnlyOn
21.01.2011, 20:54
Я очень люблю эту тему, но код ты нагло спиздил. Я не помню откуда, но я 100% работал с этим кодом, структуру этого класса, имена функций и даже текстовых файлов я очень хорошо запомнил. Не хорошо это.
пс. на пхп писать подобное смысла нет. Чему-то серьёзному обучать эту сеть ты будешь до второго пришествия.
UPD:
Ага, а вот и источник: http://habrahabr.ru/blogs/artificial_intelligence/40659/
да и саму статью ты скопировал. Я думаю, тут не катит выдавать статью за свою просто переписывая пару предложений своими словами и тупо копируя остальное.
пс. требую показательную казнь!


какбы написал про источник =)

OnlyOn
21.01.2011, 20:58
Все равно очень и очень много частных случаев, поэтому нельзя всё это рассматривать как одно целое...


тут расматривается частный случай. тоесть разгадка квадратиков 8х8 =) Если поработать можна написать многослойку что будет работать с более сложными задачами, но для представления что это - думаю нормик.

Статья дейвствительно не моя. НО я работал над созданием этого кода =) Совместно с моим другом с никос Null (Это его статья)

energ77
16.05.2011, 02:22
не важно взял ты с другово сайта или сделал сам главное что ты знаеш тему о которой пишеш и можешь обяснить если тебя кто то спросит

п.с. народ все свои знания а сетит.д. програмирование и да и ваобще большую часть знаний вы не сами изобрели, познали и придумали, а взяли от уже наработаных знаний других людей и активно этими знаниями пользуетесь, так что не надо на ТС гнать если он тему понил то это равносильно таму что сам статью написал, а если бы и переписал то смысл? зечем велосипед как говариться пересобирать? ))

OnlyOn
16.05.2011, 13:43
не важно взял ты с другово сайта или сделал сам главное что ты знаеш тему о которой пишеш и можешь обяснить если тебя кто то спросит
п.с. народ все свои знания а сетит.д. програмирование и да и ваобще большую часть знаний вы не сами изобрели, познали и придумали, а взяли от уже наработаных знаний других людей и активно этими знаниями пользуетесь, так что не надо на ТС гнать если он тему понил то это равносильно таму что сам статью написал, а если бы и переписал то смысл? зечем велосипед как говариться пересобирать? ))


Просто выше-представленный код на пыхе был написан мною и моим другом еще давненько.

Я перечитал уйму книг по нейронкам, а друг хорошо знал пыху. Обьяснил ему логику действий и чуть сам зная пыху помог написать нейронку.

Если статья ранее публиковалась на другом ресурсе, почему сразу считают что она ворованая? Я ведь соавтор кода :-\

energ77
17.05.2011, 23:24
Просто выше-представленный код на пыхе был написан мною и моим другом еще давненько.
Я перечитал уйму книг по нейронкам, а друг хорошо знал пыху. Обьяснил ему логику действий и чуть сам зная пыху помог написать нейронку.
Если статья ранее публиковалась на другом ресурсе, почему сразу считают что она ворованая? Я ведь соавтор кода :-\


Тем более раз ТС соавтор тогда вообще вопросов нет))

KoF31n
18.05.2011, 00:00
Как я понимаю с помощью этих сетей расшифровывают?

А на других языках возможно сделать тоже самое?

OnlyOn
18.05.2011, 00:08
Как я понимаю с помощью этих сетей расшифровывают?
А на других языках возможно сделать тоже самое?


На других языках как раз делают нейронки. На PHP - это садо-мазо, просто пыха - мой профиль и както давно решили написать нейронку.

По сути это стандартный пример перцептрона и его обучения на однослойке. Многослойки используются на антикапче.

OnlyOn
27.06.2011, 22:52
Решил написать многослойную нейронку для распознавания черно-белых фотографий.

Кто может дать совет по строительству нейронки на PHP?

Ludmilochka
01.09.2011, 14:12
Мне более простая помощь через нейронные сети нужна, ребята! Отзовитесь кто спец, кому за минуту определить cut off - значение, после которого нет смысла дальше проводить определение показателей.

Я бы цифры в столбик скинула. Думаю, специалисту дело на минуту.