Примеры нейронных сетей на PHP Совокупность нейронов соединённых тем или иным способом называется искусственной нейронной сетью или просто нейронной сетью. Закон по которому нейроны соединены в сеть носит название структуры или топологией сети. Множество нейронов не соединённых между собой, но соедененные с другими нейронами носит название слоя нейрона. ИНС бывают 2х видов: 1) Однослойные 2) Многослойные Перцептрон или "атом" ИНС Обычный перцептрон состоит из 1-го нейрона (Первый тип - однослойный), у которого n входов и пороговая функция активации. Поскольку выходами сети является +1 или -1. То перцептрон эффективен для решение задачи классификации 2-х классов. Если выход +1, то поданный на вход вектор принадлежит к I-классу, если -1 — II классу. Вначале на 0-шаге обучения, веса входа перцептрона задаются случайным образом. Суть обучения состоит в изменение весов. Для осуществления процедуры обучения для всякой нейронной сети в том числе и для простого перцептрона до начала формируется обучающая выборка состоящая из векторов, которые называются обучающими векторами, причем каждый обучающий вектор состоит их 2х частей: 1) Те значения, которые подаются на вход 2) То, что должно быть с нашей точки зрения на выходе сети когда на вход сети поданы компоненты из 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 случая: — обучающей выборки мало для обучения сети — обучение завершилось гораздо раньше, чем конец выборки. Доказательство. В силу использовании функции sign в определении нейрона мы можем считать ||W*||=1. Введем в рассмотрение косинус угла между текущим значением набора весов и W*. Поскольку W* является точным решением, то |(W*, X)|>=delta>0. Коль скоро происходит процедура обучения, то текущий набор векторов W(t) неправильно осуществляет классификацию для текущего вектора X, а значит величина d(x)*(x, W*) = |(X, W*)|, а потому имеем (1) >= (W(t), W*)+delta. В силу той же логики, коль скоро происходит обучение, то знаки d(x)*(X, W(T))<0 < W2+M2. Где М — радиус n-мерного шара, внутри которого располагаются все вектора обучающей выборки. Их конечное число, следовательно такой шар существует. После t-шагов, имеем неравенство. Следовательно cos угла -> +inf. Полученное противоречие доказывает, что существует некая tmax после которой веса уже не меняются, что означает сходимость алгоритма обучения за конечное число шагов. Доказано. Классический пример задачи, которую не сможет решить простой перцептрон является XOR. Нейронная сеть на PHP1) Для начала создадим класс перцептрона. Там мы зададим веса, размерности и пороги. Так-же реализуем функцию активации, которая в цикле будет разберать "веса". PHP: <?php /** * простой перцептрон. * */ class Perceptron { private $W; // веса private $size; // размерность private $porog; // порог /** * Спрашиваем перцетрон. * Иначе говоря функция активации * * @param array $vector * @return int */ public function ask($vector) { $sum = 0; for($i=0;$i<count($vector);$i++) { $sum += $vector[$i]*$this->W[$i]; } if($sum > $this->porog) return 1; return -1; } 2) Теперь зададим функцию "порогов". PHP: /** * Конструктор * Аргумент - размерность перцептрона * * @param int $n */ public function __construct($n) { $this->size = $n; $this->porog = 100; $this->init_weight(); } 3) Опять займёмся весами. Будем тыкать пальцем в небо и используем рандом PHP: /** * Инициализация начальных весов. * Рандом * */ public function init_weight() { for($i=0;$i<$this->size;$i++) $this->W[] = rand(0, 10); } /** * Сохраняем в файл * Если файл есть - перезапишет * * @param string $filename */ public function weight_save($filename) { $serialize = serialize($this->W); fwrite( fopen($filename,"w"), $serialize); } 4) Теперь загружаем ранее сгенерированый результат. PHP: /** * Грузим весы из файла * * * @param string $filename */ public function weight_load($filename) { $this->W = unserialize(file_get_contents($filename)); } public function teach($vector, $d) { if($d!=$this->ask($vector)) { // teach for($i=0;$i<$this->size;$i++) { $this->W[$i] += $d*$vector[$i]; } } } } 5) Теперь перейдём к самому вкусному =) Тут Мы зададим матрицу для распознавания линий и квадраток. Как Вы понимаете 1 - это "обозначенные" пиксели, а 0 - "пустые". В нашем случае - черное и белое. Тут мы зададим обучение в видео матриц 8х8 пикселей. PHP: /** * Example */ $filename = 'w1.txt'; /** * Наш перцептрон будет говорить что дали на вход, квадрат или прямую. * Следует учесть, что в этом примере перцептрона спрашивают * о том, чего небыло в учении. */ $neural = new Perceptron(64); // матрица будет 8х8, размерность 64. 6) Обучаем перцептрон распознавать квадраты. PHP: 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) Тут обучим распознавать разного рода прямые PHP: /** * Теперь учим прямые. */ $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) Теперь запишем выученый материал в файл PHP: /** * Выучили небольшой выборкой. * Запишем веса в файл. */ $neural->weight_save("w1.txt"); } else { // Чтобы каждый раз не учится, грузим. $neural->weight_load($filename);; } 9) Теперь проверим нашу ИНС =) PHP: // Даем на вход квадрат, которого нету в выборке $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"; ?> Скачать архив с PHP скриптом! Материал взят from google Изложил более-менее подробно. Как-раз решил занятся написанием нейронки для распознавания текстов Всем спасибо за внимание! Надеюсь Вам понравилось =)
Я очень люблю эту тему, но код ты нагло спиздил. Я не помню откуда, но я 100% работал с этим кодом, структуру этого класса, имена функций и даже текстовых файлов я очень хорошо запомнил. Не хорошо это. пс. на пхп писать подобное смысла нет. Чему-то серьёзному обучать эту сеть ты будешь до второго пришествия. UPD: Ага, а вот и источник: http://habrahabr.ru/blogs/artificial_intelligence/40659/ да и саму статью ты скопировал. Я думаю, тут не катит выдавать статью за свою просто переписывая пару предложений своими словами и тупо копируя остальное. пс. требую показательную казнь!
>>пс. на пхп писать подобное смысла нет. Чему-то серьёзному обучать эту сеть ты будешь до второго пришествия. это точно. лучше уже в матлабе обучить или в SNN
Все равно очень и очень много частных случаев, поэтому нельзя всё это рассматривать как одно целое...
тут расматривается частный случай. тоесть разгадка квадратиков 8х8 =) Если поработать можна написать многослойку что будет работать с более сложными задачами, но для представления что это - думаю нормик. Статья дейвствительно не моя. НО я работал над созданием этого кода =) Совместно с моим другом с никос Null (Это его статья)
не важно взял ты с другово сайта или сделал сам главное что ты знаеш тему о которой пишеш и можешь обяснить если тебя кто то спросит п.с. народ все свои знания а сетит.д. програмирование и да и ваобще большую часть знаний вы не сами изобрели, познали и придумали, а взяли от уже наработаных знаний других людей и активно этими знаниями пользуетесь, так что не надо на ТС гнать если он тему понил то это равносильно таму что сам статью написал, а если бы и переписал то смысл? зечем велосипед как говариться пересобирать? ))
Просто выше-представленный код на пыхе был написан мною и моим другом еще давненько. Я перечитал уйму книг по нейронкам, а друг хорошо знал пыху. Обьяснил ему логику действий и чуть сам зная пыху помог написать нейронку. Если статья ранее публиковалась на другом ресурсе, почему сразу считают что она ворованая? Я ведь соавтор кода :-\
На других языках как раз делают нейронки. На PHP - это садо-мазо, просто пыха - мой профиль и както давно решили написать нейронку. По сути это стандартный пример перцептрона и его обучения на однослойке. Многослойки используются на антикапче.
Решил написать многослойную нейронку для распознавания черно-белых фотографий. Кто может дать совет по строительству нейронки на PHP?
Мне более простая помощь через нейронные сети нужна, ребята! Отзовитесь кто спец, кому за минуту определить cut off - значение, после которого нет смысла дальше проводить определение показателей. Я бы цифры в столбик скинула. Думаю, специалисту дело на минуту.