Обсуждение:Возможности перцептрона Розенблатта

Содержимое страницы недоступно на других языках.
Материал из Викиверситета

О перцептроне[править]

Здесь в частности отвечу на все вопросы, касательно перцептрона. S.J. 11:34, 11 апреля 2010 (UTC)[ответить]


Выполнение заданий[править]

Архив[править]

  1. Обсуждение:Возможности перцептрона Розенблатта/Выполнение заданий/George
  2. Обсуждение:Возможности перцептрона Розенблатта/Выполнение заданий/Neomant

Текущие решения[править]

От Neomant - Задание №3[править]

  • Добрый день, думал вы пропали :) Ну, что же дальше у нас много всяких „вкусностей“ :) Думаю пора переходить к серьезному тесту. Существует стандартная задача: дано 60000 изображений 10 рукописных цифр от 0 до 9. И еще 10000 на тест. Нужно будет проверить способность перцептрона к обобщению, и прочие его характеристики. Эту задачу я в ближайшее время попробую изложить отдельным образом.
  • Пока вопрос Некоторые конфигурации персептрона не подлежат полному обучению, что, впрочем, очевидно. - прокомментируйте это подробнее, кажется тут что-то не так. S.J. 14:05, 25 ноября 2010 (UTC)[ответить]
    • Так как у нас SA связи строятся случайным образом, то существует вероятность, что некоторые критичные для данных классов образов связи не будут установлены. Таким образом некоторые классы распознать точно не удастся. Возможно заблуждаюсь, но вроде как должна существовать конфигурация SA связей (или некоторое множество конфигураций) оптимально подходящая для распознавания определённых классов образов. Да, на 60000 - это уже повеселее. Ок, жду постановки задачи. Neomant 14:37, 25 ноября 2010 (UTC)[ответить]
      • Задание №3 на главной странице. Только выполняйте по пунктам, и сообщайте результаты, чтобы я мог вмешаться в процесс. Спрашивайте если что неясно.
      • Я уже говорил, что SA связи строятся случайным образом совершенно ни на что не влияет, при правильной архитектуре перцептрона. Если грубо, то более 30 А- элементов - уже практически невозможно случайно (а не специально) выйти на "критичные связи". Что же касается "оптимально подходящая для распознавания определённых классов образов" - то это большой научный спор. Конечно, есть более оптимальные связи для каждого из набора образов. Но что нам нужно универсальность или оптимальность ? Перцептрон универсален. Что же касается оптимальности, то тут и находится точка спора. Я не знаю более оптимальных нейросетевых методов (не в смысле прогноза, а в смысле точности и скорости обучения). Дело в том, чтобы построить оптимальные связи, нужно затратить очень серьезный анализ предоставленной совокупности образов. И тогда да, действительно можно минимизировать количество связей. Кстати по этому вопросу у меня заброшенная работа, с конкретными результатами, но вот как-то забросил и не напечатался. Может как нибудь к этому вместе вернемся :) S.J. 15:03, 25 ноября 2010 (UTC)[ответить]
  • И еще вопрос: Вы можете ваши сделанные программы выложить для свободного доступа, скажем так на постоянной основе. Так чтобы кто прейдет после вас мог ими воспользоваться. Для этого предлагаю единое место тут +текущий список загрузок. Если согласны, то зарегистрируйтесь в той гугл группе, я дам вам права загружающего. И тогда все что будем делать - загружайте туда. Ок ? S.J. 15:19, 25 ноября 2010 (UTC)[ответить]
    • Да, я согласен, только не совсем понял как зарегистрироваться в группе. Надеюсь, что таки это у меня получилось. Скачал базу с изображениями, займусь их конвертированием, то есть пунктом 2. Пока я себе это вижу так: на каждый класс изображений свой bmp файл. А возможно получится уместить всё в два файла - обучение и тест. Neomant 19:21, 25 ноября 2010 (UTC)[ответить]
      • Мне нужен ваш адрес вида мой_ник@gmail.com S.J. 21:22, 25 ноября 2010 (UTC)[ответить]
      • Не обязательно клеить в одно изображение, хотя можете попробовать. bmp - займет много места, лучше png. Я вообще-то когда то делал что-то типа просмоторщика увеличивал каждую точку в несколько раз и создавал рисунок с отображением. Можно просто мелкие файлики. Это так чтобы вы могли их все увидеть. В принципе они у меня есть 20Мб в архиве. Но лучше вам потренироваться :) S.J. 21:32, 25 ноября 2010 (UTC)[ответить]
        • Попробую сначала с bmp, возможно поразбираюсь с png - да, хорошая тренировка, тем более что шарп для меня не родной. Neomant 21:52, 25 ноября 2010 (UTC)[ответить]
          • В С# нет принципиальной разницы в форматах (типа мелочь низшего порядка :) ). Пишите код вида:
Bitmap newBitmap = new Bitmap(21, 21);
...
newBitmap.SetPixel(x, y, Color.Black);
...
newBitmap.Save("MyFile.png", ImageFormat.Png);
          • Нет, нет, я уже обдумывал это. Во-первых это действительно расточительно по памяти. Так как картинка у нас монохромная, нужно делать её с глубиной цвета в 1 бит. Во-вторых сам метод SetPixel достаточно медленный и не работает с глубиной цвета в 1 бит. А вот что можно так просто сохранять в png даже не догадывался, меньше заморочек. В общем попробую покрутить - посмотрим что выйдет. Neomant 06:07, 26 ноября 2010 (UTC)[ответить]
          • Выходит довольно таки неплохо. Выяснилось, что png с данной глубиной цвета занимает поболее места. В bmp же файлики получаются совсем аккуратно - 146 байт на образ. Закончу с конвертером - отпишусь. А пока вот что получается. Neomant 11:59, 26 ноября 2010 (UTC)[ответить]
          • Доточил конвертер. Файлы конвертируются в архив определённой структуры. То есть перехожу к 3 пункту, вроде как всё понятно. Есть такой вопрос, сам толком не разбирался, не было времени: Могу ли я организовать хранилище на code.google.com и работать с ним через клиента контроля версий TortoiseSVN? Neomant 21:29, 4 декабря 2010 (UTC)[ответить]
            • Да, в той же группе я могу вам дать права и можете использовать SVN. Там есть ряд моих наработок, но сделаете отдельную директорию и качайте ее. S.J. 10:16, 5 декабря 2010 (UTC)[ответить]
            • Я дал вам права, начинайте отсюда [1]. И загрузите тогда, то что получилось. S.J. 10:20, 5 декабря 2010 (UTC)[ответить]
              • Изменил программу для работы с новым форматом файла образов. С четвёртым пунктом не совсем понятно. Что значит ВЫБРАТЬ ПРАВИЛЬНУЮ архитектуру перцептрона? Связи слоёв у нас формируются случайно. Параметры, которые мы выбираем - это количество S-элементов по входной матрице (21 x 21) и количество R-элементов по количеству классов образов (10). Всё, что имеется на данный момент, загрузил в хранилище. Займусь вынесением функций чтения файла образов и обучения в отдельные потоки и жду ваших комментариев. Neomant 08:26, 12 декабря 2010 (UTC)[ответить]

Параметры, которые мы выбираем и которые, собственно, и определяют архитектуру перцептрона:

  1. количество S-элементов
  2. количество A-элементов
  3. количество R-элементов
  4. количество возбуждающих и тормозящих связей от одного А-элемента с S-элементами

Загрузите сюда несколько получившихся изображений. Зачем вам отдельные потоки (threads ?) ? S.J. 13:22, 12 декабря 2010 (UTC)[ответить]

С количеством S- и R-элементов понятно - это количество пикселов в матрице и количество классов образов соответственно. Количество A-элементов оставил равным 50. Связи S-элементов с A-элементами, их количество и фактор(тормозящий/возбуждающий) выбираются случайно для каждого S-элемента. Изображения загрузил, можете опробовать. Собственно после опробования поймёте зачем нужны отдельные потоки. Neomant 15:14, 12 декабря 2010 (UTC)[ответить]

Количество A-элементов оставил равным 50. Связи S-элементов с A-элементами, их количество и фактор(тормозящий/возбуждающий) выбираются случайно для каждого S-элемента. - будут проблемы, но попробуйте "набить свои шишки" :) --S.J. 19:01, 17 декабря 2010 (UTC)[ответить]
    • Поменял алгоритм построения S-A связей. Сейчас это выглядит примерно так: для каждого A-элемента устанавливается связь со случайным весовым коэффициентом со случайным S-элементом; для S-элементов, которые не имеют ни одной связи, строится связь со случайным весовым коэффициентом со случайным A-элементом. Добавил статистику по распознаванию отдельных классов. Результаты статистики НИКАКИЕ. Похоже что ошибка в алгоритме обучения или в его реализации. Не могли бы вы посмотреть? Neomant 12:28, 7 января 2011 (UTC)[ответить]
      • Могу посмотреть на выходных. Но попробуйте вначале упростить - сделайте обучение на 10-30 изображениях, мне тогда будет проще ловить баги. --S.J. 14:20, 7 января 2011 (UTC)[ответить]
        • Хорошая мысль с уменьшением количества образов. Проще всего подготовить данные на 10-30 изображений - это отредактировать базу в текстовом виде и сконвертировать заново в ifn. Neomant 17:55, 7 января 2011 (UTC)[ответить]
          • Так Вы уже закинули версию, которую нужно посмотреть в SVN, или сами пока тестируете ? --S.J. 21:33, 8 января 2011 (UTC)[ответить]
            • Да, в SVN последняя версия. Сам тестировал, но ни к каким выводам не пришёл. Похоже действительно ошибки в алгоритме обучения, но найти их не смог, как бы всё красиво... Neomant 00:03, 9 января 2011 (UTC)[ответить]
              • Посмотрел внешне - а красиво, получается у вас :) ... подготовьте мне тогда файл на .ifn на 10 образов с 2 классами, и хорошо бы в интерфейс вытянуть установку количества A-элементов. S.J. 02:02, 9 января 2011 (UTC)[ответить]
              • Пока такое ощущение, что он не учится когда нужно ... но не вижу что. Надо смотреть на малом объеме, жду. S.J. 02:33, 9 января 2011 (UTC)[ответить]

Вот скажем добавляем в teachingBackgroundWorker_DoWork

                
// Обучение
                for (Int32 j = 0; j < imagesManager.Images.Count; ++j)
                {
                    Image img = imagesManager.Images[j] as Image;
                    ArrayList sample = new ArrayList();
                    sample.Add(img.Class.Id);
                    perceptron.teach(img, sample);
			  perceptron.recognize(img);
			  if (!perceptron.isRightRecognized(sample))
			  {
				  int a = 1;
			  }
		 }

В условие, где a=1 - он не должен ни разу заходить - а он заходит. Значит после обучения, он еще не обучен ! --S.J. 02:40, 9 января 2011 (UTC)[ответить]

  • Хотя я чего то стал сомневаться :(, может и должен туда заходить, но это как-то подозрительно. --S.J. 02:46, 9 января 2011 (UTC)[ответить]
  • Вот, понял в чем дело (как минимум)
                
        public void raiseLinks(Element e)
        {
            foreach (Link link in Links)
                if (link.getElement() == e) link.addWeight(1);
        }

Тут при обучении одного неправильного выхода R от A, увеличиваются/уменьшаются связи всех R которые связаны с тем А. В итоге таким обучением вы сразу портите, правильные выходы. Надо корректировать не все 10 связей А-R, а только одну текущею. --S.J. 03:00, 9 января 2011 (UTC)[ответить]

  • Ха, нет вроде не это, if ваш мудреный не приметил ... а зачем бегать по циклу, когда надо изменить только одну связь ? S.J. 03:06, 9 января 2011 (UTC)[ответить]

Что же Вы не сказали, что на 2000 образах и 2 классах у Вас все работает ! :) Короче, все у вас работает - только оптимизировать нужно по скорости, и добавить соответствующие число А-элементов. В теории сколько образов для запоминания, столько и А-элементов, т.е. 10000 А-элементов должно быть. Обычно можно делить на два. А тут слишком простая задача, поэтому достаточно хотя бы 1000. --S.J. 03:22, 9 января 2011 (UTC)[ответить]

    • Да, этот цикл не самый оптимальный метод поиска нужной связи. Для двух классов и относительно небольшого количества образов я не понял результата - по первому предлагаемому классу для обучения ошибки с каждой итерацией уменьшались до нуля, по второму - всегда были нулевыми(это и смущало), поэтому отнёс результат к ошибочному и не обратил на него внимания. Хорошо, тогда внесу необходимые изменения и попытаюсь оптимизировать. Neomant 10:59, 9 января 2011 (UTC)[ответить]
      • Вот еще где основное место для оптимизирования: Поменял алгоритм построения S-A связей. Сейчас это выглядит примерно так: для каждого A-элемента устанавливается связь со случайным весовым коэффициентом со случайным S-элементом; для S-элементов, которые не имеют ни одной связи, строится связь со случайным весовым коэффициентом со случайным A-элементом.
      • Тут надо эту часть : для S-элементов, которые не имеют ни одной связи, строится связь со случайным весовым коэффициентом со случайным A-элементом. - вообще убрать.
      • Эту часть для каждого A-элемента устанавливается связь со случайным весовым коэффициентом со случайным S-элементом главный вопрос сколько связей устанавливается для одного А-элемента ? Одна ? S.J. 14:03, 9 января 2011 (UTC)[ответить]
        • Как так не строить связь S-элемента с A-элементом? Тогда теоретически возможно наличие S-элементов никак не влияющих на результат. Так и есть, для каждого A-элемента строится одна связь с S-элементом. Neomant 15:20, 9 января 2011 (UTC)[ответить]
          • для каждого A-элемента строится одна связь с S-элементом - Это неверно. Вы практически этим уничтожили один слой перцептрона, поэтому-то он так плохо обучается, и будет требовать много А-элементов. Нужно как минимум иметь по две связи у каждого А-элемента - одну возбуждающею, другую тормозящую. А далее это число вывести в интерфейс (отдельно число тормозящих (x), и возбуждающих (y) ). Для данной задачи я рекомендовал бы попробовать соотношение x=5, y=5.
          • Тогда теоретически возможно наличие S-элементов никак не влияющих на результат - это не важно, если такие и будут (что маловероятно) - то значит они и не нужны. А регулируется вероятность числом x+y. --S.J. 15:35, 9 января 2011 (UTC)[ответить]
            • Внёс рекомендуемые вами изменения в конфигурацию перцептрона и на выборке из 5000 изображений 5 классов полное обучение прошло к 300 итерации. Смущает то, что по последнему классу в обучающей выборке всегда имеем ноль ошибок. Вынесу настраиваемые параметры в интерфейс и отпишусь. Neomant 15:33, 12 января 2011 (UTC)[ответить]
              • Ok, надо бы дотянуть до обучающей выборки в 60000 изображений и 10 классов (ориентировочно займет 10-20 минут обучения). С нулем ошибок в одном классе - согласен, подозрительно, надо смотреть что происходит. Я не очень понял, что означает комбо из выборов классов ? S.J. 20:18, 12 января 2011 (UTC)[ответить]