Нейросети для чайников. Начало



    Так получилось, что в университете тема нейросетей успешно прошла мимо моей специальности, несмотря на огромный интерес с моей стороны. Попытки самообразования несколько раз разбивались невежественным челом о несокрушимые стены цитадели науки в облике непонятных «с наскока» терминов и путанных объяснений сухим языком вузовских учебников.

    В данной статье (цикле статей?) я попытаюсь осветить тему нейросетей с точки зрения человека непосвященного, простым языком, на простых примерах, раскладывая все по полочкам, а не «массив нейронов образует перцептрон, работающий по известной, зарекомендовавшей себя схеме».

    Заинтересовавшихся прошу под кат.

    Цели

    Для чего же нужны нейросети?
    Нейросеть – это обучаемая система. Она действует не только в соответствии с заданным алгоритмом и формулами, но и на основании прошлого опыта. Этакий ребенок, который с каждым разом складывает пазл, делая все меньше ошибок.

    И, как принято писать у модных авторов – нейросеть состоит из нейронов.
    Тут нужно сделать остановку и разобраться.


    Договоримся, что нейрон – это просто некая воображаемая чёрная коробка, у которой кучка входных отверстий и одно выходное.
    Причем как входящая, так и исходящая информация может быть аналоговой (чаще всего так и будет).

    Как выходной сигнал формируется из кучи входных – определяет внутренний алгоритм нейрона.

    Для примера напишем небольшую программу, которая будет распознавать простые изображения, скажем, буквы русского языка на растровых изображениях.
    Условимся, что в исходном состоянии наша система будет иметь «пустую» память, т.е. этакий новорожденный мозг, готовый к бою.
    Для того чтобы заставить его корректно работать, нам нужно будет потратить время на обучение.

    Уворачиваясь от летящих в меня помидоров, скажу, что писать будем на Delphi (на момент написания статьи была под рукой). Если возникнет необходимость – помогу перевести пример на другие языки.

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

    Итак, исходя из поставленной задачи — сколько вариантов выхода может быть? Правильно, столько, сколько букв мы будем уметь определять. В алфавите их пока только 33, на том и остановимся.

    Далее, определимся со входными данными.Чтобы слишком не заморачиватсья – будем подавать на вход битовый массив 30х30 в виде растрового изображения:


    В итоге – нужно создать 33 нейрона, у каждого из которых будет 30х30=900 входов.
    Создадим класс для нашего нейрона:

    type
      Neuron = class
        name: string; // Тут название нейрона – буква, с которой он ассоциируется
        input: array[0..29,0..29] of integer; // Тут входной массив 30х30
        output:integer; // Сюда он будет говорить, что решил 
        memory:array[0..29,0..29] of integer; // Тут он будет хранить опыт о предыдущем опыте
      end;
    
    


    Создадим массив нейронов, по количеству букв:

    For i:=0 to 32 do begin
    neuro_web[i]:=Neuron.Create;
    neuro_web[i].output:=0; //  Пусть пока молчит
     neuro_web[i].name:=chr(Ord('A')+i); // Буквы от А до Я
    end;
    


    Теперь вопрос – где мы будем хранить «память» нейросети, когда программа не работает?
    Чтобы не углубляться в INI или, не дай бог, базы данных, я решил хранить их в тех же растровых изображениях 30х30.
    Вот например, память нейрона «К» после прогона программы по разным шрифтам:



    Как видно, самые насыщенные области соответствуют наиболее часто встречаемым пикселям.
    Будем загружать «память» в каждый нейрон при его создании:
    p:=TBitmap.Create;
         p.LoadFromFile(ExtractFilePath(Application.ExeName)+'\res\'+ neuro_web[i].name+'.bmp')
    


    В начале работы необученной программы, память каждого нейрона будет белым пятном 30х30.

    Распознавать нейрон будет так:

    — Берем 1й пиксель
    — Сравниваем его с 1м пикселем в памяти (там лежит значение 0..255)
    — Сравниваем разницу с неким порогом
    — Если разница меньше порога – считаем, что в данной точке буква похожа на лежащую в памяти, добавляем +1 к весу нейрона.

    И так по всем пикселям.

    Вес нейрона – это некоторое число (в теории до 900), которое определяется степенью сходства обработанной информации с хранимой в памяти.
    В конце распознавания у нас будет набор нейронов, каждый из которых считает, что он прав на сколько-то процентов. Эти проценты – и есть вес нейрона. Чем больше вес, тем вероятнее, что именно этот нейрон прав.

    Теперь будем скармливать программе произвольное изображение и пробегать каждым нейроном по нему:

    for x:=0 to 29 do
                 for y:=0 to 29 do begin
                     n:=neuro_web[i].memory[x,y]; 
                     m:=neuro_web[i].input[x,y];
    
                     if ((abs(m-n)<120)) then // Порог разницы цвета
                    if m<250 then  neuro_web[i].weight:=neuro_web[i].weight+1; // Кроме того, не будем учитывать белые пиксели, чтобы не получать лишних баллов в весах
                    if m<>0 then   begin
                      if m<250 then   n:=round((n+(n+m)/2)/2);
                          neuro_web[i].memory[x,y]:=n;   end
                    else if n<>0 then
                      if m<250 then    n:=round((n+(n+m)/2)/2);
                   neuro_web[i].memory[x,y]:=n;
    
                 end;
    
    


    Как только закончится цикл для последнего нейрона – будем выбирать из всех тот, у которого вес больше:

    if neuro_web[i].weight>max then  begin
             max:=neuro_web[i].weight;
             max_n:=i;
             end;
    


    Именно по вот этому значению max_n, программа и скажет нам, что, по её мнению, мы ей подсунули.
    По началу это будет не всегда верно, поэтому нужно сделать алгоритм обучения.

    
    s:=InputBox('Enter the letter', ‘программа считает, что это буква ’+neuro_web[max_n].name, neuro_web[max_n].name);
         for i:=0 to 32 do     begin //Пробегаем по нейронам
         if neuro_web[i].name=s then begin //В нужном нейроне обновляем память
    for x:=0 to 29 do   begin
        for y:=0 to 29 do        begin
         p.Canvas.Pixels[x,y]:=RGB(neuro_web[i].memory[x,y],neuro_web[i].memory[x,y], neuro_web[i].memory[x,y]); //Записываем новое значение пикселя памяти
         end;
          end;
           p.SaveToFile(ExtractFilePath(Application.ExeName)+'\res\'+ neuro_web[i].name+'.bmp');
    


    Само обновление памяти будем делать так:

    n:=round(n+(n+m)/2);    
    


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

    Вот несколько итераций для буквы Г:



    На этом наша программа готова.

    Обучение

    Начнем обучение.
    Открываем изображения букв и терпеливо указываем программе на её ошибки:



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



    Заключение

    Программа представляет собой один сплошной недостаток – наша нейросеть очень глупа, она не защищена от ошибок пользователя при обучении и алгоритмы распознавания просты как палка.
    Зато она дает базовые знания о функционировании нейросетей.

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

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

    За сим откланяюсь, спасибо за чтение.

    UPD: У нас получилась заготовка для нейросети. Пока что это ещё ей не является, но в следующей статье мы постараемся сделать из неё полноценную нейросеть.
    Спасибо Shultc за замечание.
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну, и что?
    Реклама
    Комментарии 91
    • +5
      Просто и понятно, как и обещали. Спасибо :)
      • +24
        «Программа представляет собой один сплошной недостаток – наша нейросеть очень глупа»
        — более того, это вообще не нейронная сеть.
        • 0
          Я соглашусь, пожалуй. Это что-то промежуточное, между обычным алгоритмом и алгоритмом с опытом. Я хотел на пальцах объяснить смысл функционирования обучаемых программ, в качестве стартовой статьи.
          • +1
            обоснуйте почему, пожалуйста
            • +6
              Дак а что тут обосновывать? )
              Искусственный нейрон понятие формальное, у него есть мат. модель. Класс из топика в эту модель не вписывается )
              • +2
                Для каждого входа нейрона должен быть свой весовой коэффициент, а судя потому, что написал автор у него веса соответсвуют нейронам.
                • +2
                  Тут вы правы. Но я посчитал, что модель будет слишком сложной для начала.
                  • 0
                    Ничего, что в этом суть нейронной сети? Между нейроны передают сигнал другому нейрону, каждый из которых влияет на результат с заданным весом, кто-то сильнее, кто-то почти никак.
                    • +9
                      Всему свое время.
                      Вы разбираетесь в теме, вам это ясно.Статья для новичков.
                      Не хочу сразу усложнять тему и отпугивать читателя — получится очередная громоздкая статья, коих миллион в интернете.
                      • +5
                        Ничего не знаю о нейросетях, кроме того, что прочёл в вашей статье. Но, как я понял из комментариев выше, вам к статье стоит дописать что-то такое: «Вот у нас получилась заготовка для нейросети. Пока что это ещё ей не является, но в следующей статье мы постараемся сделать из неё полноценную нейросеть
              • +1
                Потому что нейронная сеть начинается когда есть нелинейность элементов (нейронов).
                Пока нет нелинейности — это просто набор матриц.
            • +8
              обязательно продолжайте.
              • +1
                Есть же те же многослойные перцептроны, простые и понятные, в то же время являюищиеся классическими искусственными нейронными сетями, почему вы не использовали такую архитектуру?
                Ведь ваше решение с виду не дает преимуществ и настоящей ИНС не является.
                • +1
                  В части преимуществ не все так однозначно. Как минимум одно преимущество налицо — простота.
                  Вообще, все зависит от задачи, выбор типа ИНС для решения конкретной задачи отдельная наука. А в некоторых случаях наивный Байес показывает результаты как минимум не хуже, чем ИНС.
                  • +2
                    Как я и написал в конце статьи — это вводная для непосвященных.
                    Перцептроны с ходу — убийство мозга начинающего нейросетевика =)
                    • +3
                      Не могу согласиться, перцептрон вполне внятно объясняется за полчаса.
                      Другое дело что процесс получения именно знаний, а не простых рецептов, мало кого привлекает — но заинтересованному человеку это объяснить очень легко.
                  • +6
                    Это, скорее, классификатор, но не ИНС. Он не сможет классифицировать изображение, которому его не обучали. Например, подсуньте ему горизонтальную линию — только такие он и сможет классифицировать, вертикальные уже нет.
                    Но вообще все доходчиво, если планируете усложняться и таки дойти до ИНС, то с удовольствием почитаю.
                    • 0
                      Очень понравилось! Хочется продолжения! Про обучения, распознавание, а ещё лучше реализацию алгоритма particle filters.
                      • +4
                        Здорово, побольше бы таких статей!
                        Продолжайте конечно))
                        • 0
                          Совет: не пользоваться одиночным переводом строки для текста — или двойной (параграфы) или никакого. Иначе рваный текст получается, который и читать сложнее и смотрится неприятно.
                        • +2
                          Интересная статья. Жду продолжения!
                          • 0
                            Вить, присоединяюсь. Как раз начал разбор данной темы. Будет полезно почитать… =)
                          • +8
                            У нас к сожалению тоже не было отдельного курса по нейросетям (в отличии от соседней специальности), но все же мне довелось делать по ним курсовик.

                            У меня сложилась примерно следующая модель, возможно кому-то так будет понятнее:
                            Введем пару понятий, чтобы проще было объяснить: вход нейрона назовем синапсом, у нейрона их много; выход нейрона назовем аксоном — он в нашей модели один. Названия собственно примерно отражают биологический смысл.

                            Так вот, представим n-мерное пространство, где n — количество синапсов у нейрона. В рассмотренном выше примере n = 900. Входная информация, таким образом, представляет собой вектор в этом самом пространстве. Ну для простоты можете представить 3-х мерное пространство и 3-х мерные вектора. Правда сеть довольно тупая будет :).

                            Дык вот, память нейрона после обучения также представляется таким вектором, а вся сеть — эдаким облаком векторов в 900-мерном пространстве.

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

                            Собственно вся сложность в таком случае в адекватном обучении нейросети. Я делал довольно примитивную самообучающуюся сеть, уж не знаю насколько каноничная реализация получилась. В принципе наверное смогу накатать подобную этой статью.
                            • 0
                              Да, забыл сказать. Значение на «аксоне» и будет значением скалярного произведения.
                              • 0
                                Чтож, спасибо за дополнение!
                                Планирую рассказать в следующей статье о простейшем перцептроне, о распределении и способах коррекции весов — ваш комментарий натолкнул меня на мысль, с чего начать.
                                Благодарю )
                                • –4
                                  возможно кому-то так будет понятнее

                                  Понятнее не получилось. Извините.

                                  >>отражают биологический смысл
                                  Прекрасно, но биологов тут не много, я думаю.

                                  >>представим n-мерное пространство,
                                  Это напоминает анекдот:
                                  Профессор: А теперь представьте сферу в 9-ти мерном пространстве…
                                  Студент: ??? Как можно представить сферу в 9-ти мерном пространстве???
                                  Профессор: О, это очень просто: представьте сферу в n-мерном пространстве и положите n равное 9.

                                  >> задача классификации
                                  Что это за задача?
                                  • +2
                                    Ну я потому и написал, сначала попробуйте в 2-3-х измерениях. Нарисуйте, сразустанет понятнее. Есть некоторое количество векторов и есть вектор входных данных. Чем меньше угол между ними, тем более «родственны» эти данные, тем больше скалярное произведение. Задача распознавания букв и есть задача классификации входного сигнала — определим к какому классу он относится.
                                    Биологические термины чисто для сокращения. Значения гуглятся элементарно. Мы же все-таки биологическую систему пытаемся эмулировать.
                                    • 0
                                      А вот мне, наоборот, стало понятнее )
                                    • +1
                                      Доходчиво, да не совсем. С обработкой bitmap-картинки вроде понятно — вот есть точки 0 или 1, и им соответствуют вектора. А как обстоит дело с обработкой звука? Как, например, на фоне шума волн распознать крик чайки? Человеческий мозг как-то уверенно это делает, причем соотношение сигнал/шум может меняться в очень широких пределах. Как выбирать эти вектора, и как их систематизировать, чтобы получилась такая же система распознавания?
                                      • 0
                                        По идее абсолютно без разницы что представляет собой входной сигнал. В битмапе это набор точек, причем, хочу заметить, не обязательно 0 и 1, можно использовать более широкий диапазон. Со звуком это может быть сэмпл фиксированной длительности, тогда уровнями на синапсах (и числами в векторах) будут, например, амплитуды на каждом шаге дискретизации. Распознавание ничем отличаться не будет, все тоже самое. Основная проблема тут, на мой взгляд, именно в адекватном обучении нейросети. Кстати, почти все, что я видел из институтских заданий и реализаций занималось именно обучением на зашумленных образах и распознаванием зашумленных образов.

                                        Кстати, не стоит забывать, что тут рассматривается простейшая однослойная нейросеть. Есть гораздо более сложные вещи, у меня, в свое время, не хватило познаний матана чтобы в них разобраться :).
                                        • 0
                                          Нет, все равно непонятно. Уровни на каждом шаге дискретизации нельзя подставлять в качестве синапса (входа в нейрон), поскольку к примеру -100 и +100 может означать на выходе АЦП один и тот же сигнал, просто в противофазе. Наверное, в качестве входных синапсов должны быть какие-то свертки сигнала по амплитуде, спектру, времени. Вопрос как раз и был в том, какие именно должны быть эти синапсы, как их выбрать и как получить, чтобы добиться уверенного распознавания полезного звукового сигнала.
                                          • 0
                                            Тут я к сожалению не подскажу, так как обработкой звука никогда не занимался. Я про то, что задача классификации от этого не меняется. А вот задача адекватного задания входного сигнала и обучения нейросети — остается.

                                            Нейросети ведь сначала показывается некая серия эталонов, в результате чего у нейрона формируется некий обобщенный образ, соответствующий классу, им распознаваемому. А потом уже мы показываем произвольный образ, и какой нейрон наибольшим образом возбудился (максимум на аксоне), к таком классу этот образ и принадлежит.
                                    • +1
                                      Присоединюсь к предыдущим ораторам. При отсутствии весовых коэффициентов как таковых, это сложно назвать нейронной сетью.
                                      • +2
                                        Немного нескромно, но возможно кому-то покажется интересной моя простая реализация NN, при условии отсутствия аллергии на LISP.
                                    • +2
                                      Ну, конечно, на нейросеть это дело похоже очень отдаленно, но простота изложения подкупает. Так что реквестирую продолжение, самому интересно почитать хоть раз «простым» языком. Только дополнительно все-таки реквестирую несколько большую строгость. Перефразируя известную поговорку, определениями математику не испортишь.
                                      • +1
                                        Ах да, и все-таки может лучше на более подходящем языке излагать примеры, делфи несколько неуклюж, да и думается мне си-подобные языки большинству привычней. Или даже питон, а то и хаскель лучше подойдут.
                                        • 0
                                          Абсолютно согласен, как и говорил — Делфи просто под рукой была.
                                          • –2
                                            Но как Вы тогда писали на Хабр? Или заблокировано всё, кроме него? Кто мешал скачать какой-нибудь Wing или Code::Blocks?
                                            • 0
                                              На Хабр писал из браузера.
                                              В тот момент для меня важно было реализовать идею, пока мысль не ушла, а на свежеустановленной системе была только Дэлфи.
                                              Не зря я приготовился к помидорам =)

                                              Обещаю исправиться и следующую статью написать на чем-нибудь Си-подобном.
                                              • +1
                                                Чего это вы набросились на Delphi? Сам пишу на нем. И мне нравится.
                                                Впрочем, можете и на Си перейти. Тут важен сам алгоритм.
                                            • +3
                                              Может вообще попробовать обойтись без кода? Есть и другие методы показать алгоритм.
                                        • +2
                                          Я так понял, код на паскале написан? Думаю это полезно было-бы указать в топике, для таких дундуков как я. Кстати, а почему паскаль?
                                          • +3
                                            My bad, не прочитал комментарии. В следующих статьях (надеюсь, они будут) пожалуйста отставьте паскаль в сторону, C++/Python/Ruby большинству будут понятней :)
                                            • 0
                                              Не надо говорить за большинство. Не оставляйте Паскаль, у него простой и понятный синтаксис, известный многим со школы.
                                              • 0
                                                Я извиняюсь, но так оставлять или нет? Написано «Не оставляйте», а аргументы вроде за «Оставляйте».
                                                • 0
                                                  Извиняюсь, о
                                                  Описка. Я за то, чтобы оставить код на Паскале.
                                                  • +4
                                                    Блять. :(
                                                  • 0
                                                    Насчет простоты соглашусь, но все же большинство просит перейти на Си-подобный язык.
                                                    Так что я пока в смятении…
                                                    • 0
                                                      Я думаю, это зависит от того, чего конкретно вы хотите.
                                                      Если хотите показать именно пример реализации нейронной сети — то лучше перейти на какой-нибудь более популярный язык.
                                                      Если же хотите передать сами знания — то какая разница, на чем примеры написаны? Можно вобще без кода, только картинки с результатами навставлять.
                                                      В конце-концов, примеров реализации нейронных сетей на каком-либо языке программирования полно.
                                                      • 0
                                                        Несмотря на все просьбы никто непонимания кода не обозначал. Паскаль тем и хорошо что близок к естественным языкам. Легко читается.

                                                        PS: если все-таки будете писать на Delphi — нейроны можно удобно сериализовать в файл при помощи TStream.Read/WriteComponent
                                            • 0
                                              Спасибо, очень интересно. Продолжайте! Только пожалуйста более читабельный язык. Си подошел бы прекрасно.
                                              • –1
                                                Вы бы еще попросили Haskell, Erlang и др.
                                              • 0
                                                Тут многие писали о том, что это не нейросеть. Меня, опять же, как знающего о нейросетях только из этой статьи, интересует: а как сделать из этого примера нейросеть?

                                                Если я правильно понимаю, то нужно сделать нейроны, которые будут отвечать за определение слов, и в которое будет приходить информация, из нейронов распознавания букв. Так? На каждое слово будет свой нейрон. А потом можно сделать ещё нейроны, которые будут распознавать предложения, беря на входе слова из предыдущих нейронов. Я прав?
                                                Тоесть, будет именно сеть, и она сможет, как было написано выше, иметь у нейронов вес на вход и на выход…

                                                Камнями в меня не кидайте, писал это основываясь лишь на информации из статьи и из комментариев.
                                                • 0
                                                  Нет, вы обобщаете задачу, а не модель сети. Не стоит думать, что нейронная сеть сама все распознает. Обычно схема работает так:
                                                  Есть n-мерный СКВ( сферический конь в вакууме ). В этом n-мерном пространстве у нас нет четкого правила определения (или оно слишком сложное), к какому типу коней он пренадлежит. Мы проганяем его через нейронную сеть — получаем образ СКВ в k-мерном пространстве, для которого такое правило очевидно / проще.

                                                  Например, мы хотим получить либо да (выход == 1) либо нет (выход == 0). Тогда вместо решения задачи классификации n-мертного вектора нам надо всего лишь решить задачу «выход = x ближе к 0 или к 1?».
                                                  • +2
                                                    Практически ничего не понял из того, что вы написали. Наверное по этой причине статья автора и пользуется такой популярностью — может там и неправильно, но там понятно. =)
                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                  • 0
                                                    Я ранее не читал о нейронных сетях, но узнал слишком мало, что бы автор сомневался, писать ему цикл статей или нет.
                                                    Теперь Вы просто обязаны продолжить :)
                                                    • 0
                                                      Присоединюсь к вышесказанному: пишите, Паша, пишите. Теперь читателям будет обидно не увидеть продолжение =)
                                                      • –5
                                                        Присоединюсь к ранее высказавшимся в топике, что расмотренная модель в примере — это нисколько не нейронная сеть. Не хочу показаться ханжой, но использовать Delphi даже в учебных целях, это издевательство. Java или C#, чтобы сразу прививать хороший тон новичкам, ну на крайняк C++ =)
                                                        • 0
                                                          Пардон, но и Pascal и Delphi вполне себе хорошие языки, тем более для академической задачи.
                                                          • 0
                                                            Видимо джависты с питонщиками обиделись :)
                                                            • +1
                                                              Питон вообще-то паскалеподобный синтаксис имеет, если что
                                                              • 0

                                                                И что же в нем паскалеподобного? Я серьезно.

                                                        • +1
                                                          На мой взгляд, для начинающих — неплохо. Хотя и с оговорками.
                                                          У меня другой совет: не надо примеров с распознаванием букв — завязните с предварительной обработкой( тут написано почему). Поскольку нейронная сеть в конце-концов не классифицирует, а аппроксимирует — возьмите пример аппроксимации. Например, по заданным 10 значениям увидеть sin( x ). Пример же простым должен быть.
                                                          • 0
                                                            Спасибо, я рассмотрю такой вариант.
                                                          • +1
                                                            Несколько пугает тенденция — все чаще и чаще на хабре начали появляться статьи, описывающие основы нейросетей для начинающих. Впечатление, что скоро это станет эдаким стартом: не знаешь с чего начать — пиши про нейросети.
                                                            ПМСМ и эта статья тоже не достигает заявленных целей — полный чайник врядли вынесет из нее какие-то новые знания, а не полный чайник и так уже знает все это (не исключено, что прочел в одной из многочисленных предыдущих статей по нейросетям на хабре).

                                                            Нападки на язык программирования выглядят странными — в конце концов паскаль является вполне себе рабочим языком, пожалуй даже еще без явно различимых признаков трупного окоченения. То, что он не является более мэйнстримовым, нисколько не уменьшает его а) тьюринг-полноты и б) читабельности.
                                                            • 0
                                                              Хоть это и не сеть (нейроны не связаны между собой) но на пальцах очень хорошо объясняется. Спасибо
                                                              • +1
                                                                Переписал исходник на C# и отправил автору предложение по обновлению статьи и размещению здесь варианта на Шарпе, если вдруг кому-то не терпится стучите поделюсь.
                                                                • 0
                                                                  Одобряю, даже интересно. Если общественность одобрит — обязательно посмотрю в сторону Си-подобных языков в следующей статье.
                                                                  • +1
                                                                    Нашел свой курсовик, тема там «Самоорганизующаяся карта Кохонена» (обучение без учителя). Если у автора нет запланированной статьи на эту тему, могу попробовать изложить вкупе с реализацией.
                                                                    • 0
                                                                      Правда не уверен, что у меня реализация каноничная вышла :)
                                                                  • +1
                                                                    Выложите ссылочку на исходный код на C# — пожалуйста!
                                                                  • 0
                                                                    Вопрос ко всем заинтересовавшимяс:

                                                                    На каком языке вы бы хотели увидеть код в следующей статье?
                                                                    Просьба просто написать название языка, без лишних слов.
                                                                    Составлю статистику и сделаю выбор из того, чем владею.
                                                                    • +1
                                                                      C или C# самое оно.
                                                                      • 0
                                                                        На алгоритмическом ;)
                                                                        • –3
                                                                          haskell.
                                                                          • 0
                                                                            Вашу шутку скорее всего не оценят.
                                                                        • +1
                                                                          C/C++
                                                                          • 0
                                                                            Псевдокод. Или Ruby/Python. Или же C++, но только если это необходимо (если нужны специальне либы там, формат сигнала особый на входе итп).
                                                                            • 0
                                                                              Python/Ruby
                                                                              • 0
                                                                                Javascript
                                                                              • 0
                                                                                Я вроде начал понимать как работают нейронные сети. Знал бы мой препод по искуссственному интеллекту — плакал бы от радости. С нетерпением жду продолжения.
                                                                                • 0
                                                                                  Минут 15 смотрел на код. Что то до боли знакомое, но непонятное. Только в каментах прочитал что это Делфи озарило. Не писал лет 10 уже на нем, забыл как выглядит О_О
                                                                                  • 0
                                                                                    теперь нужно также понятно написать, но для неокогнитрона :)
                                                                                    • 0
                                                                                      Просто оставлю это тут, может кому поможет

                                                                                      Запрограммируем перцептрон Розенблатта?
                                                                                      • 0
                                                                                        Исключительно полезная статья. Надеюсь на продолжение.

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

                                                                                        Самое читаемое