Нейронные сети для чайников. Сеть Кохонена

В статье Нейросети для чайников. Начало автор Paul_Smith доступно показал насколько просто создать нейронную сеть для распознования картинок. Но есть одно но — то что он описал нейронной сетью не является. Перед его следующей статьей хочу рассказать вам как решить ту же задачу, но с использованием нейронной сети Кохонена.

Итак, распознавать мы будем цифры, написанные белым по черному, такие как эти:
image image image image image image

Картинки 45 на 45 пикселей, а значит входов в нашу нейронную сеть будет 45 * 45.
Для простоты, распознаем только цифры от 0 до 5, поэтому нейронов у нас будет 6 — по одному на каждый ответ.

Cтруктура нашей нейросети:
image

Каждая связь входа сети с нейроном имеет свой вес. Импульс, проходя через связь, меняется: импульс = импульс * вес_связи.
Нейрон получает импульсы от всех входов и просто суммирует их. Нейрон набравший больший суммарный импульс побеждает. Все просто, реализуем!

Классы для представления элементов сети (C#):
// Вход
public class Input
{
     // Связи с нейронами
     public Link[] OutgoingLinks;
}

// Связь входа с нейроном
public class Link
{
     // Нейрон
     public Neuron Neuron;
     // Вес связи
     public double Weight;
}

public class Neuron
{
     //Все входы нейрона
     public Link[] IncomingLinks;
     // Накопленный нейроном заряд
     public double Power { get; set; }
}

Создание и инициализация сети дело скучное, кому интересно — смотрите приложенный исходник. Остановлюсь лишь на том, что цвет пикселя это число от 0 до 255, причем 0 — это черный, 255 — белый, цвета между ними — градации серого.

Состояние класса KohonenNetwork это массив Input[] и массив Neuron[]:
public class KohonenNetwork
{
     private readonly Input[] _inputs;
     private readonly Neuron[] _neurons;
...
}

Предположим, что наша сеть уже обучена. Тогда, чтобы узнать что изображено на картинке мы вызовем метод Handle, там все перемножится, сложится и найдется максимум:
// Пропустить вектор через нейронную сеть
public int Handle(int[] input)
{
     for (var i = 0; i < _inputs.Length; i++)
     {
          var inputNeuron = _inputs[i];
          foreach (var outgoingLink in inputNeuron.OutgoingLinks)
          {
               outgoingLink.Neuron.Power += outgoingLink.Weight * input[i];
          }
     }
     var maxIndex = 0;
     for (var i = 1; i < _neurons.Length; i++)
     {
          if (_neurons[i].Power > _neurons[maxIndex].Power)
               maxIndex = i;
     }
     //снять импульс со всех нейронов:
     foreach (var outputNeuron in _neurons)
     {
          outputNeuron.Power = 0;
     }
     return maxIndex;
}

Но перед тем как спрашивать у сети что-либо, её надо обучить. Для обучения предъявляем картинки и указываем что на них нарисовано:
image
Обучение — это изменение весов связей:
public void Study(int[] input, int correctAnswer)
{
     var neuron = _neurons[correctAnswer];
     for (var i = 0; i < neuron.IncomingLinks.Length; i++)
     {
          var incomingLink = neuron.IncomingLinks[i];
          incomingLink.Weight = incomingLink.Weight + 0.5 * (input[i] - incomingLink.Weight);
     }
}

После обучения на двух шрифтах, нейронная сеть различает цифры и из других шрифтов. В том числе будет пройден контрольный тест на таких вот цифрах:
image image image image image image
Конечно, для расспознавания капчей такая поделка не годится — все перестает работать, стоит только сдвинуть, растянуть или повернуть изображение.
Однако всем становится понятно, что использовать нейронные сети не так уж и сложно, если начинать с простых примеров.
Исходник поделки
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 61

    +4
    Прям неделя нейронных сетей на хабре :)
      +15
      и это хорошо
        +9
        Астрологи уже делали соответствующее объявление?
          +4
          Скоро астрологов можно будет заменить нейронными сетями.
            +2
            Зачем? Можно заменить их игральными костями.
              0
              По сути, «астрологи» о которых мы говорим — и есть рандомный алгоритм. Страшное зрелище, когда кости буду кидать кости.
          0
          Вообще прекрасная неделя, особенно если учитывать, что мне диплом по обработке изображений при помощи нейронных сетей, вот вот сдавать.
            +2
            Казалось бы, если диплом уже сдавать, то это как раз вы нам должны много интересного рассказывать =)
              –2
              Я обычный российский студент, все будет готово за неделю до. А пока только инфу обрабатываю. Но обещаю будет топик!)
          +1
          Уже вторая статья про распознавание шрифтов.
          Почитал, заинтересовало. Но возникает много вопросов — например, какие еще есть применения у нейронных сетей, где они показывают себя хорошо?
            +1
            не шрифтов, а образов.
            для начала начните отсюда: ru.wikipedia.org/wiki/%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C
            когда поймете, для чего был разработан этот аппарат, то прочтите это: www.amazon.com/Fundamentals-Neural-Networks-Architectures-Applications/dp/0133341860/ref=pd_sim_b_1
              0
              оу, а про википедию я как то и забыл :)
              да, конец года — не лучшее время для студента, увы…

              но, так или иначе, спасибо за ответ!
                0
                да, конец года — не лучшее время для студента, увы…

                Более того, конец года сейчас только у студентов, у всех остальных всего лишь пятый месяц.
            • UFO just landed and posted this here
                0
                интересно, а какие параметры вы использовали на входе?
                • UFO just landed and posted this here
                    0
                    спасибо, просто интерес работы с реальным данными.
                +1
                Взгляните на то, чем занимается ТАСО в Тюмени.
                Искусственные когнитивные системы; новый класс стратегических информационных технологий
                С их помощью управляют нефте- и газопроводами.
                  0
                  Искуственные нейронные сети(ИНС) хорошо справляются с задачими кластеризации, классификации данных. Данные, как вы понимаете, могут иметь абсолютно любую природу, в дальнейшем они все равно представляются в виде векторов (= Другое дело: выбор ИНС для конкретной задачи: распознавание образов, прогнозирование, кластеризация… На сегодняшний день ИНС различных архитектур довольно много, и несмотря на общие принципы построения, у каждой ИНС есть свои плюс и минусы при решении определенных задач. Насколько я знаю, на сегодняшний день нет четко сформулированных шаблонов использования ИНС для решения определенных задач.
                  +4
                  импульс = импульс * вес_связи

                  Математик во мне делает вывод: «вес_связи всегда равен единице»
                    +6
                    расскажи своему математику, про оператор присваивания )
                      +4
                      Простите, действительно запутался. Нужно было дать на это посмотреть программисту во мне. Он сразу понял.
                      +8
                      Еще возможно импульс равен нулю.
                      +1
                      На самом деле статья хорошая, но немного сбивают с толку необъяснённые термины. Что в этой сфере называется «вектором»? Что «импульсом»? Конечно можно стараться воспринять содержимое статьи на интуитивном уровне, но хотелось бы хотя бы ссылки на определения.
                        +2
                        Если заинтересовала тема, то рекомендую вам прочитать книгу Introduction to Neural Networks for C#, 2nd Edition. За короткое время узнаете очень много.
                          0
                          А что на русском из книг хорошего есть?
                          +9
                          Очень мило, но это не сеть Кохонена =)
                          Сеть Кохонена не обучается по «правильным ответам», это самоорганизующаяся сеть. Вы сделали просто однослойный персептрон.
                            0
                            Википедия говорит, что среди сетей Кохонена есть такие, которые обучаются, а есть и самоорганизующиеся.

                            Нейронные сети Кохонена — класс нейронных сетей, основным элементом которых является слой Кохонена. Слой Кохонена состоит из адаптивных линейных сумматоров («линейных формальных нейронов»)
                              0
                              Вопрос действительно спорный. От нейронной сети Кохонена здесь то, что 1) эта сеть прямого распространения, 2) каждый элемент входного слоя связан с каждым элементом скрытого слоя и 3) использован принцип «Победитель забирает все».
                                0
                                Едва ли тут может быть спор, поскольку первоисточники и определения, к счастью, общедоступны. Если по пунктам, то 1) м.к. сеть однослойная, не имеет смысла говорить о том, прямое ли у неё распространение, 2) полносвязность присуща, кажется, вообще всем современным нейросетям, кроме совсем экзотических 3) да, я действительно впервые вижу использование принципа «победитель получает всё» при обучении однослойного персептрона =).
                                Я думаю, что основная особенность сетей Кохонена (кроме самоорганизации), это то, что нейроны буквально лежат в пространстве данных. Там нет никаких сумматоров, энергий потенциации — только расстояние от нейрона до наблюдения. В сети Кохонена, например, вы могли бы интерпретировать нейрон, как ещё один рисунок, похожий на усреднённое изображение всех тех векторов, которым этот нейрон обучился. Необычное и поучительное зрелище, чудесно дополнило бы статью.
                                  0
                                  Во втором абзаце вы описали Self-organizing Maps.
                                    0
                                    Исправьте меня.
                                0
                                Вероятно, вы имели в виду сети векторного квантования (LVQ), которые русская википедия считает «сетями Кохонена, обучающимся с учителем». Однако их архитектура весьма отличается от представленной. Например, у них всегда есть скрытый слой, а ещё некоторые странные особенности, типа необходимости подавать процентное соотношение размеров кластеров вместе с обучающей выборкой. Едва ли мы говорим о них.
                                Сам Кохонен начинает свою статью в сколарпедии так: «The Self-Organizing Map (SOM), commonly also known as Kohonen network». Возможно, из скромности, конечно, однако правило «говорим Кохонен, подразумеваем SOM», по моим наблюдениям повсеместно даже в академической среде.
                                  0
                                  По-моему, в литературе в последнее время четко разделяют сеть Кохонена(Kohonen network) и самоорганизующиеся карты Кохонена(SOM). Особенно в англоязычной заметно.
                                    0
                                    Я бы сказал, что именно в последнее время разделения нет вообще. Карта отличается от сети только упорядоченностью нейронов. Упорядоченность нейронов важна только при определении соседей при использовании подхода «победитель получает больше». В сетях Кохонена нейроны считаются неупорядоченными, для нахождения нейронов, нуждающихся в дообучении, используется функция соседства (обычно совпадающая с функцией принадлежности, что очень удобно, если работать с нечёткой логикой). Разница между результатами первого и второго подхода настолько мизерная, что я, пожалуй, вообще ни разу не встречал в статьях уточнения, что именно использовалось (и очень редко встречал людей, знающих разницу, даже среди тех, кто работает с SOM непосредственно), хотя занимаюсь этой темой уже года четыре.
                                    Ну и я всё же повторюсь, фраза «The Self-Organizing Map (SOM), commonly also known as Kohonen network» исходит лично от Кохонена.
                                +16
                                Отлично! Я начинаю любить нейронные сети =)

                                Первый топик: делаем нейронную сеть.
                                Комменты: всё отлично, но это не нейронная сеть.

                                Второй топик: делаем нейронную сеть Кохонена.
                                Комменты: всё отлично, но это не нейронная сеть Кохонена.

                                Подозреваю, к десятому топику выяснится, что нейронных сетей не существует. С нетерпением ожидаю развития событий…
                                0
                                Что-же, не совсем для чайников, но замечательно, прочитал на одном дыхании)
                                  +1
                                  Только по-моему это обычный однослойный перцептрон — именно о нем и хотел рассказать я в следующей статье, так что даже не знаю теперь, учитывая, что рассказывать хотел тоже на С#, как бы не наплодить статей-клонов… Делфи продолжить, что-ли =)
                                    +2
                                    Можно написать статью с настоящей сетью Кохонена :)
                                      +4
                                      Всё хорошо, но это не настоящий комментарий
                                      0
                                      Предлагаю сказки не рассказывать, а если желаете поболее разжевать для народа Перцептрон Розенблатта, код то я дал, но надо бы на задачьке показать его действие. Думаю заодно и сами поучитесь ;)

                                      Предлагаемые мной задачки для решения, там же можно найти несколько частных решений (но более менее законченое одно)
                                        0
                                        Нет это не однослойный перцептрон, его отличает фраза «Нейрон набравший больший суммарный импульс побеждает». Классически перцептрон дает ответ Да/Нет — т.е. точный ответ, но принцип «победитель забирает все» — очень часто используют дополнительно во многих сетях. Но изначально именно слой Кохонена это делал впервые, этим он и отличается. Второе отличие то, что обучается только один победивший нейрон (а вот это достаточно редко применяется в перцептронах)
                                          +1
                                          Точнее в статье предложенно то, что называется «простейшая форма слоя Кохонена»
                                      0
                                      Самое интересное в нейронный сетях — обучение. Жаль, что вы не осветили этот процесс.
                                        0
                                        Ну если обучение тут кое-как приведено, то о самоорганизации не слова. А вот о ней бы хотелось отдельно почитать. Придется ждать следующий семестр, в институте проходить будем.
                                        +1
                                        И, честно говоря, хотелось бы видеть на хабре что-то отличное от простых книжных примеров (=
                                          0
                                          А никто не знает как решается проблема последовательных действий с помощью нейросетей? Например ход в шахматах/шашках, нам нужно выбрать фигуру, передвинуть. И еще интересно как например в игре го не дать поставить фишку в уже занятую позицию. Такие задачи в принципе решаемы с помощью нс?
                                          +4
                                          — Вся фишка в том, дорогой Ватсон, что человек не вычисляет образы, а просто сравнивает их с имеющимися у него в памяти и таким образом их сразу распознает. Например, мы очень легко отличаем кошку от собаки, а нейронные сети или всякие перцептроны от Розенблата и Кохоненна — нет.
                                          — Почему, Холмс?
                                          — Ну, начнем с того, что так назыаемые кибернетические и математические «нейронные сети» даже отдаленно не напоминают своих биологических однофамильцев.
                                          — А что же это тогда?
                                          — Просто это такой наукообразный микс из математическиой статистики и теории логических схем на триггерных элементах, разбавленной булевой алгеброй.
                                          — А если бы напоминали? Вдруг кто-то создаст подобие сознания?
                                          — Не создаст. Понимаешь Ватсон, даже если бы аборигены океанического острова смогли бы сделать точную копию транзисторного приемника, выброшенного волнами на берег, нужна ведь ещё и радиостанция, чтобы этот приемник начал работать, то есть, передавать музыку и речь.
                                          — Выходит, что перцептронщики, как эти аборигены с острова, занимаются бесполезным занятием, не ведая о главном, о станции передатчике.
                                          — Точно, Ватсон.
                                          — Так это значит, что сознание наше… это, как бы вне…
                                          — Совершенно верно, Ватсон. Оно это самое, что Вы думаете.

                                            0
                                            Есть ряд задач, которые отлично решаются с помощью ИНС. И да, есть ряд задач, которые не решаются с помощью ИНС, но являются простейшими для человека.
                                              +1
                                              Kn4av13 мая 2012, 11:54#↑

                                              Согласен с Вами. Арифмометр помогает человеку лучше считать, поскольку человек, в принципе, не может считать. Другие устройства помогают людям лучше прыгать, летать и плавать. То есть, они помогают усилить все их слабые качества. А вот, усилить человеческое сознание, пока такого никакие кибер-математические устройства типа НС или даже ИНС не могут даже в теории.
                                                0
                                                ИНС конечно далеки от совершенства, но смотреть и видеть — разные глаголы. Три маленьких вопроса.

                                                1) Издалека. Поисковые машины активно используют ИНС для ранжирования. К примеру матркиснет Яндекса судя по описанию — просто ИНС (точнее их совокупность). Гугл вполне может использовать нечто похожее. Как думаете, математически это сильно сложно?

                                                2) Сравнивая двух людей использующих бумажную библиотеку и Интернет для поиска новый знаний кому Вы отдадите предпочтение? И что предпочитаете сами?

                                                3) Эксперимент. Наберите любой вопрос в гугле. Представьте, что результат видит Тьюринг. Вы полагаете он бы не принял Google за искусственный интеллект? И это предложенное, и довольно простое применение ИНС, никак не усиливает человеческое сознание?

                                                На мой взгляд мышление — поиск истины. Любое ускорение поиска уже усиление, и еще какое.
                                                  +1
                                                  //Поисковые машины активно используют ИНС для ранжирования.//

                                                  Чтобы более менее компетентно и доходчиво разъяснить Вам свою позицию, начну с дефиниций:
                                                  Иску́сственные нейро́нные се́ти, — если Вы именно это имеете ввиду под термином ИНС, — это «математические модели, а также их программные или аппаратные реализации, построенные по принципу организации и функционирования биологических нейронных сетей (БНС) — сетей нервных клеток живого организма». Так говорит Википедия.

                                                  Если с организацией БНС более или менее ясно, то с их функционированием картина совершенно тёмная. Ситуация примерно такая, как в известном случае с транзисторным приемником, выброшенным на берег океанического острова и подобранного местными аборигенами. Вот они его изучают и так и этак, могут даже его устройство как-то изучить, даже понять из каких элементов он состоит, но выяснить его общую функциональную нагрузку – ловить передачи радиостанций – не смогут до тех пор, пока не узнают про теорию
                                                  распространения радиоволн.

                                                  Сегодня мы, практически, ничего не знаем про технологии функционирования БНС. Мы лишь предполагаем, исходя из своих кибернетических знаний и известных физических закономерностей, что БНС может быть каким-то аналогом электронного устройства с логическими функциями. Но даже если это и так, то мы не знаем, является ли БНС приемником с внешней связью или же она сугубо внутрипользовательская система.

                                                  Далее. То, что мы сейчас называем ИНС, раньше (в мою бытность студентом) называлось просто схема алгоритмов для Алгола (или Кобола). Сейчас это приняло наукообразную форму, хотя суть осталась та же самая. Если смотреть на ИНС с позиций системного анализа, то любые логические рассуждения всегда можно представить в виде сети или сетки внутренних взаимосвязей и взаимоотношений (это называется «конрелейты» от connection&relation) и спокойно обозвать эти установленные конрелейты «нейронной сетью», хотя ничего нейронного там нет и в помине. Так же поступают и лингвисты при анализе предложений текста. Они устанавливают конрелейты между словами и называют это «синтаксическим графом». В последнее время языковеды так сильно продвинулись, что стали устанавливать между словами еще и «семантические связи и отношения», а наиболее продвинутые из них вкупе с кибернетиками даже заявляют о создании «нейросемантических сетей», забывая о том, что мышление первично, а текст вторичен, как продукт деятельности этого процесса.

                                                  Поэтому, отвечая на Ваш вопрос про ИНС, скажу, что нет никаких ИНС (это химера), а есть номальные, широко известные статистико-математические лингвистические наработки. Есть тезаурусы, есть конкордансы, есть другие ухищрения, наконец, чтобы улучшить поиск.

                                                  Далее
                                                  //Сравнивая двух людей использующих бумажную библиотеку и Интернет для поиска новый знаний кому Вы отдадите предпочтение?//

                                                  Любой Усилитель или устройство, претендующее на эту роль, должны работать по принципу «Ужимайся во времени и расширяйся в пространстве». Интернет и поисковые машины призваны реализовывать этот принцип и хвала им за это. Они ускоряют поиск нужного документа. Однако, на повестке дня стоит вопрос об ускорении самого Процесса Мышления, который мог бы подвергать смысловой обработке тексты в сотни и тысячи раз больше документов электронного формата, нежели один человек с мощностью в один продвинутый мозг. Этого мы не сможем добиться ни с помощью ИНС или их заменителей, да и лингвистические выкрутасы нам не помогут.

                                                  Следующее.
                                                  //Наберите любой вопрос в гугле. Представьте, что результат видит Тьюринг. Вы полагаете он бы не принял Google за искусственный интеллект? //

                                                  Нет, конечно! Гугл, ведь, не умеет, думать. А машина Тьюринга претендует на таковую. Чтобы ИИ удовлетворял тесту Тьюринга, необходимо иметь в составе компьютера (хотя бы в эмулированном виде) «эвристический процессор», который не считает, а занимается распознаванием, ассоциированием и извлечением из памяти распознанных образов. То есть, «машина тьюринга» должна функционировать по технологии эвристико-смысловой обработки текста (речи). Ни Гугл, ни какая-либо иная поисковая машина пока даже и не претендует на это. Нет в них интеллекта, как нет его в простом арифмометре, который, как и Гугл, даёт ответ на выставленные рычажки (ключевые слова). Какие выставил, на такие и получил ответ, провернув рукоятку, то бишь, кликнув в современном понятии.

                                            0
                                            Можно улучшать не качество сознания, а его производительность. Так, можно обучить ИНС решать какую-то конкретную задачу, и делать она будет это очень быстро.
                                              0
                                              Ох чувствую надо будет и мне написать статью по своему диплому про каскад нейронных сетей, чем я хуже других!
                                                0
                                                Каскад? Вы имеете ввиду иерархическую архитектуру?
                                              • UFO just landed and posted this here
                                                  0
                                                  Надо бы перезалить все картинки и исходник…
                                                    0
                                                    да, исходники бы

                                                    Only users with full accounts can post comments. Log in, please.