Список форумов Форум Форум
Форум
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   medals.phpНаграды   РегистрацияРегистрация 
 ПрофильПрофиль   СудокуСудоку   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Однослойный персептрон на PHP (10 нейронов). Работает :)))
На страницу 1, 2, 3  След.
 
Начать новую тему   Ответить на тему    Список форумов Форум -> Наука и технологии
Предыдущая тема :: Следующая тема  
Автор Сообщение
xcont
Пользователь 1ого уровня
Пользователь 1ого уровня


Репутация: +2    

Зарегистрирован: 11.01.2012
Сообщения: 119
Откуда: Аккаунт изъят администрацией форума
Награды: Нет

СообщениеДобавлено: Вт Июн 12, 2012 3:07 pm    Заголовок сообщения: Однослойный персептрон на PHP (10 нейронов). Работает :))) Ответить с цитатой

Какаю бабочками :)))

Для тех, кому по, как работает, можете попробовать его обучить распознавать все цифры:
http://xcont.com/perc/newperceptron/ очень интересное занятие :)))))

Каждая новая цифра сбивает нейрон с толку, и некоторые цифры приходится учить повторно :)))

Ну а работает оно так:

Spoiler:

Код:
<?php
   class Perceptron{
      public $mul; //отмасштабированные сигналы
      public $weight; //коэфициенты связей
      public $sinaps; //синапсы
      public $sizeX;
      public $sizeY;
      public $filename;
      public $sum; //сумма сигналов
      public $limit; //порог
      
      public function __construct($filename){
         $this->sizeX=3;
         $this->sizeY=5;
         $this->limit=100;
         $this->filenameW="wp/w".$filename.".txt";
      }
      public function set_filenameP($filename){
         $this->filenameP="wp/p".$filename.".png";
      }
      public function save_weight_file(){
         $serialize = serialize($this->weight);
         fwrite( fopen($this->filenameW,"w"), $serialize);
      }
      public function load_weight_file(){
         if(file_exists($this->filenameW)){
            $this->weight = unserialize(file_get_contents($this->filenameW));
         }else{
            for($x=0;$x<$this->sizeX;$x++){
               for($y=0;$y<$this->sizeY;$y++){
                  $this->weight[$x][$y]="0";
               }
            }
         }
      }
      public function load_file(){
         $im = imagecreatefrompng($this->filenameP);
         for($x=0;$x<$this->sizeX;$x++){
            for($y=0;$y<$this->sizeY;$y++){
               $rgb = imagecolorat($im, $x, $y);
               $color=imagecolorsforindex($im, $rgb);
               if($color['red']>127){
                  $color=0;
               }else{
                  $color=1;
               }
               $this->sinaps[$x][$y]=$color;
            }
         }
         imagedestroy($im);
      }
      public function mul_weights(){
         for($x=0;$x<$this->sizeX;$x++){
            for($y=0;$y<$this->sizeY;$y++){
               $this->mul[$x][$y]=$this->sinaps[$x][$y]*$this->weight[$x][$y];
            }
         }
      }
      public function sum_muls(){
         $this->sum=0;
         for($x=0;$x<$this->sizeX;$x++){
            for($y=0;$y<$this->sizeY;$y++){
               $this->sum+=$this->mul[$x][$y];
            }
         }
      }
      public function porog(){
         if($this->sum >= $this->limit){
            return true; //true - отнимаем
         }else{
            return false; //false - прибавляем
         }
      }
      public function teach_plus(){
         for($x=0;$x<$this->sizeX;$x++){
            for($y=0;$y<$this->sizeY;$y++){
               $this->weight[$x][$y]+=$this->sinaps[$x][$y];
            }
         }
      }
      public function teach_minus(){
         for($x=0;$x<$this->sizeX;$x++){
            for($y=0;$y<$this->sizeY;$y++){
               $this->weight[$x][$y]-=$this->sinaps[$x][$y];
            }
         }
      }
   }
   for($i=0;$i<10;$i++){
      echo "<img style=\"border:1px solid #000000;\" src=\"wp/p".$i.".png\" width=\"30\" height=\"50\" /> ";
   }
   echo "<form style=\"padding-bottom:10px;\" action=\"".$_SERVER['PHP_SELF']."\" method=\"get\">\n";
   echo "Изучить выбранную картинку <input type=\"text\" name=\"n\" value=\"";
   echo (int)$_GET['n'];
   echo "\" /><br>\n";
   echo "Очистить коэффициенты связей <input type=checkbox Name=\"del\"/><br>";
   echo "<input type=\"submit\" value=\"Поехали!\" /><br>\n";
   echo "</form>\n";
   
   if(isset($_GET['del'])){
      for($i=0;$i<10;$i++){
         $fp="wp/w".$i.".txt";
         if(file_exists($fp)){
            unlink($fp);
         }
      }
      echo "Коэффициенты связей очищены. Можете заново обучить нашуй нейронную сеть :)<br>\n";
   }else{
      if((isset($_GET['n']))&&($_GET['n']>=0)&&($_GET['n']<=9)){
         $n=(int)$_GET['n'];
         echo "Грузим картинку ".$n.".<br>\n<br>\n";
         echo "<img src=\"wp/p".$n.".png\" width=\"30\" height=\"50\" /><br>\n<br>\n";
         do{
         $errors=0;
            for($i=0;$i<10;$i++){
               $perc[$i]=new Perceptron($i);
               $perc[$i]->set_filenameP($n);
               $perc[$i]->load_weight_file();
               $perc[$i]->load_file();
               $perc[$i]->mul_weights();
               $perc[$i]->sum_muls();
               $porog[$i]=$perc[$i]->porog();
               $say="false";
               if($porog[$i]){
                  $say="true";
               }
               echo "Нейрон ".$i." сказал ".$say;
               if($i==$n){
                  if($porog[$i]==true){
                     /*$perc[$i]->teach_minus();*/
                  }else{
                     $perc[$i]->teach_plus();
                     echo ", учим нейрон ".$i." не говорить чепуху (плюсуем веса).";
                     $errors++;
                  }
               }else{
                  if($porog[$i]==true){
                     $perc[$i]->teach_minus();
                     echo ", учим нейрон ".$i." не говорить чепуху (минусуем веса).";
                     $errors++;
                  }else{
                     /*$perc[$i]->teach_plus();*/
                  }
               }
               echo "<br>\n";
               $perc[$i]->save_weight_file();
            }
            echo "Наша нейронная сеть ошиблася ".$errors." раз.";
            if($errors>0){
               echo " Продолжаем обучаться<br>\n<br>\n";
            }else{
               $finded=array_search('true', $porog);
               echo "<br>\nНейронная сеть определила на картинке: <span style=\"font-weight: bold; font-size:18px;\">".$finded."</span> <br>\n";
            }
         }while($errors!=0);
      }
   }
?>



15 входов, слой на 10 нейронов, 10 выходов.


Последний раз редактировалось: xcont (Вт Июн 12, 2012 3:14 pm), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
xcont
Пользователь 1ого уровня
Пользователь 1ого уровня


Репутация: +2    

Зарегистрирован: 11.01.2012
Сообщения: 119
Откуда: Аккаунт изъят администрацией форума
Награды: Нет

СообщениеДобавлено: Вт Июн 12, 2012 3:14 pm    Заголовок сообщения: Ответить с цитатой

Прежде, чем его обучать - поставьте галочку, чтобы очистить предыдущее обучение. Или можете не ставить :)))
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
xcont
Пользователь 1ого уровня
Пользователь 1ого уровня


Репутация: +2    

Зарегистрирован: 11.01.2012
Сообщения: 119
Откуда: Аккаунт изъят администрацией форума
Награды: Нет

СообщениеДобавлено: Вт Июн 12, 2012 3:15 pm    Заголовок сообщения: Ответить с цитатой

Надо будет потом сделать, чтобы ему можно было некорректные картинки скармливать
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
xcont
Пользователь 1ого уровня
Пользователь 1ого уровня


Репутация: +2    

Зарегистрирован: 11.01.2012
Сообщения: 119
Откуда: Аккаунт изъят администрацией форума
Награды: Нет

СообщениеДобавлено: Вт Июн 12, 2012 3:30 pm    Заголовок сообщения: Ответить с цитатой

По поводу обучения. Если вы обучите сеть распознавать 0 (надо ввести "0" и нажать на кнопочку "Поехали!"), сеть потом безошибочно будет угадывать 0. Но если потом обучите сеть распознавать 1 - она временно забудет 0. Поочередно обучая 0 и 1 - сеть научится их безошибочно распознавать. Но потом если обучить 2 - она опять будет тормозить на 0 и 1. Но в этот раз 0 и 1 она вспоминать будет значительно быстрее.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Вт Июн 12, 2012 3:32 pm    Заголовок сообщения: Ответить с цитатой

а границы цифер лучше четкие (т е black-white), или с градиентным переходом?
_________________
-=- infinity-=-
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
xcont
Пользователь 1ого уровня
Пользователь 1ого уровня


Репутация: +2    

Зарегистрирован: 11.01.2012
Сообщения: 119
Откуда: Аккаунт изъят администрацией форума
Награды: Нет

СообщениеДобавлено: Вт Июн 12, 2012 3:36 pm    Заголовок сообщения: Ответить с цитатой

Границы цифер - четкие. размеры 3х5. Но растянуты до 30х50 пикселей в браузере, чтобы их было видно. Нечеткость добавляет сам браузер.
Для самой же нейронной сети до пизды градиент - там жесткое стоит правило:
Код:
               $rgb = imagecolorat($im, $x, $y);
               $color=imagecolorsforindex($im, $rgb);
               if($color['red']>127){
                  $color=0;
               }else{
                  $color=1;
               }


то-есть, любые оттенки округляет до 0 или 1

В принципе, можно и разноцветные картинки скармливать, но как я уже писал где-то, с такой пороговой функцией она много не выучит. Поэтому для тестов выбрал цвета черный или белый. Когда разберусь, как туда сигмоиду влепить и убрать этот порог - сделаю с разноцветными картинками.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
xcont
Пользователь 1ого уровня
Пользователь 1ого уровня


Репутация: +2    

Зарегистрирован: 11.01.2012
Сообщения: 119
Откуда: Аккаунт изъят администрацией форума
Награды: Нет

СообщениеДобавлено: Вт Июн 12, 2012 3:41 pm    Заголовок сообщения: Ответить с цитатой

xcont писал(а):
Прежде, чем его обучать - поставьте галочку, чтобы очистить предыдущее обучение. Или можете не ставить :)))

Надо наверное как-то с cookie еще прохоботиться, чтобы друг-другу не очищали.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
xcont
Пользователь 1ого уровня
Пользователь 1ого уровня


Репутация: +2    

Зарегистрирован: 11.01.2012
Сообщения: 119
Откуда: Аккаунт изъят администрацией форума
Награды: Нет

СообщениеДобавлено: Вт Июн 12, 2012 4:00 pm    Заголовок сообщения: Ответить с цитатой

PS. Чем выше порог активации - тем умнее сеть, и тем дольше ее обучать.
Это-же касается и весов, которые мы отнимаем (прибавляем) на каждом этапе обучения. Чем больше отнимем (прибавим) - тем глупее становится сеть. Если отнимать (прибавлять) входные сигналы - сеть получается довольно глупой. Чтобы сеть поумнела, надо перед корректировкой весов умножать входные сигналы на какой-то положительный дробный коэффициент (чем меньше - тем умнее сеть)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
xcont
Пользователь 1ого уровня
Пользователь 1ого уровня


Репутация: +2    

Зарегистрирован: 11.01.2012
Сообщения: 119
Откуда: Аккаунт изъят администрацией форума
Награды: Нет

СообщениеДобавлено: Вт Июн 12, 2012 4:04 pm    Заголовок сообщения: Ответить с цитатой

Самые проблемные цифры - 8 и 9, иногда 4 и 5 шалят. 1 2 и 0 узнает безошибочно.
Если повысить порог активации до 1000 - сеть становится умнее. Но повышать не буду, чтобы мне сайт не угробили.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Rasty
Crackpot


Репутация: +88/–10    

Зарегистрирован: 23.05.2006
Сообщения: 22183

Награды: Нет

СообщениеДобавлено: Вт Июн 12, 2012 6:01 pm    Заголовок сообщения: Ответить с цитатой

Кстати, можно какой-то примитивный генетический алгоритм попробовать на этом персептроне соорудить.
На поверхности клеточного автомата
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
xcont
Пользователь 1ого уровня
Пользователь 1ого уровня


Репутация: +2    

Зарегистрирован: 11.01.2012
Сообщения: 119
Откуда: Аккаунт изъят администрацией форума
Награды: Нет

СообщениеДобавлено: Ср Июн 13, 2012 4:09 pm    Заголовок сообщения: Ответить с цитатой

Мяу писал(а):
примитивный генетический алгоритм

Не совсем ГА, но что-то интересное должно получится.

Скажем, есть у нас черные и красные "бактерии", черные у нас агрессивные и пытаются слопать красные. Все это происходит на поверхности (скажем 500х500) клеточного автомата с периодическими граничными условиями (без них не интересно). Каждая бактерия видит вокруг область диаметром 3-4 клетки. Бактериями управляет свой персептрон с 8 нейронами (каждый из которых определяет, куда бактерия переместится в следующий момент времени). Если это красные бактерии - они ищут вокруг себя черные бактерии и пытаются от них съебаться. Чем ближе черные и чем их больше - тем больше опасность. Если бактерия неправильно съебалась - уменьшаем веса нейрона, который сказал ей неправильно съебаться. (черные делают то-же самое, только с точностью да наоборот) Ну и в какой-то рандомный момент времени бактерия может размножиться передав нейронам потомков свои весовые коэффициенты.
Можно попробовать два варианта:
1. каждой бактерией управляет свой персептрон. Если бактерий 1000 - то и персептронов соответственно не меньше
2. Бактериями управляют только два персептрона, один черными, другой - красными.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
xcont
Пользователь 1ого уровня
Пользователь 1ого уровня


Репутация: +2    

Зарегистрирован: 11.01.2012
Сообщения: 119
Откуда: Аккаунт изъят администрацией форума
Награды: Нет

СообщениеДобавлено: Ср Июн 13, 2012 4:15 pm    Заголовок сообщения: Ответить с цитатой

Область, которую видит каждая бактерия:
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
стало быть, у каждого из 8 нейронов должен быть 81 вход.

8 нейронов, который выдал на входе больше порог - тот и определяет, куда сдвинется бактерия:
1 1 1
1 0 1
1 1 1

Если опасность увеличилась - нейрон ошибся и мы его наказываем (понижая коэффициенты)

Ну а если он так и не обучился - его слопают. Да и с ним - лучше учиться надо было.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
xcont
Пользователь 1ого уровня
Пользователь 1ого уровня


Репутация: +2    

Зарегистрирован: 11.01.2012
Сообщения: 119
Откуда: Аккаунт изъят администрацией форума
Награды: Нет

СообщениеДобавлено: Ср Июн 13, 2012 4:20 pm    Заголовок сообщения: Ответить с цитатой

xcont писал(а):
81 вход.

72
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Ср Июн 13, 2012 7:32 pm    Заголовок сообщения: Ответить с цитатой

Цитата:
Если бактерия неправильно съебалась - уменьшаем веса нейрона, который сказал ей неправильно съебаться


ну ты и пишешь... читать очень даже интересно


Последний раз редактировалось: Gruz (Ср Июн 13, 2012 10:58 pm), всего редактировалось 3 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
кроль да кефир
уши
уши


Репутация: +104/–11    

Зарегистрирован: 03.06.2009
Сообщения: 10467
Откуда: пришел пиздец?
Награды: Нет

СообщениеДобавлено: Ср Июн 13, 2012 8:56 pm    Заголовок сообщения: Ответить с цитатой

Круто сижу подрачиваю

Цитата:
Но повышать не буду, чтобы мне сайт не угробили.


Gruz
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Форум -> Наука и технологии Часовой пояс: GMT
На страницу 1, 2, 3  След.
Страница 1 из 3

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB