Пользователь
0,0
рейтинг
8 мая 2011 в 21:14

Нейронные сети и распознавание символов

В последнее время на Хабре появилось, а также существует много содержательных статей, описывающих работу и принцип понятия “нейронная сеть”, но, к сожалению, как всегда очень мало описания и разбора полученных практических результатов или их не получения. Я думаю, что многим, как и мне удобней, проще и понятней разбираться на реальном примере. Поэтому в данной статье постараюсь описать почти пошаговое решение задачи распознавания букв латинского алфавита + пример для самостоятельного исследования. Распознавание цифр с помощью однослойного персептрона уже сделано, теперь давайте еще разберёмся и научим компьютер распознавать буквы.

Наша проблема


В вкратце скажу, что нейронные сети вообще позволяют решать очень большой круг практических задач, в частности, задачи распознавания. В большинстве случаев последние имеют «шаблонный» характер. Например, система, которая «читает» банковские чеки, по эффективности, в несколько раз превосходит оператора. В задачах подобного плана применение нейронных сетей оправдано и в значительной степени экономит средства и ресурсы.
Определимся с тем, что мы должны разобрать, понять и сделать. Нам необходимо построить экспертную систему, которая сможет распознавать буквы латинского алфавита. Для этого требуется разобраться с возможностями нейронных сетей (НС) и построить такую систему, которая сможет распознавать буквы латинского алфавита. Детально с теорией нейронных сетей можно познакомиться по ссылкам, приведенным в конце статьи. В данной статье не найти описания теории (математики) работы НС или описания команд при работе с MATLAB (ну только если по ссылкам в конце статьи), это остается на вашей совести. Целью статьи ставится задача показать и рассказать применение нейронной сети для практической задачи, показать результаты, наткнутся на подводные камни, постараться показать, что возможно выжать из нейронной сети, не вдаваясь в подробности, как она реализована, для остального есть специализированная литература, от которой все равно не убежать.
Попробуем разобраться с возможностями при использовании нейронной сети с обратным распространением ошибки в целях распознавания букв латинского алфавита. Алгоритм будем реализовывать в программной среде инженерного математического пакета MATLAB, а именно понадобится мощь Neural Network Toolbox.

Что дано


Необходимо разобраться с входными данными. Все мы представляем, что собой представляют буквы, как они выглядят на мониторе в книге и т.п. (как, например, представлено на рисунке ниже).

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

Теперь вернемся к проблеме представления изображения, понятного для нейронной сети. Понятно, что каждая буква на изображение может быть представлена как матрица с определенными значениями элементов, которые четко могут определить букву. То есть представление символа латинского алфавита удобно формализовать матрицей из n строк и m столбцов. Каждый элемент такой матрицы может принимать значения в диапазоне [0, 1]. Так, символ A в таком формализованном виде будет выглядеть следующим образом (слева — без искажений, справа — с искажениями):

Не много представив происходящее в голове, приступим к реализации этого в MATLAB. В данном пакете уже предоставлен латинский алфавит, даже есть демо-пример работы с ним, но с него возьмем только алфавит. Поэтому можно воспользоваться их данными, а можно даже нарисовать все буквы самому, это по желанию.
MATLAB предлагает символы, формализуемые матрицей из 7 строк и 5 столбцов. Но такую матрицу нельзя просто так подать на вход нейронной сети, для этого необходимо еще собрать 35 — элементный вектор.
Для совместимости с различными версиями и удобства я сохранил матрицы символов в файл (а так можно использовать функцию prprob, она загрузит в рабочую область алфавит).
Из теории известно, что нам надо входные данные и выходные данные (targets, целевые данные) для обучения сети. Целевой вектор будет содержать 26 элементов, где один из элементов имеет значение 1, а все остальные элементы равны 0, номер элемента содержащего единицу кодирует соответствующую букву алфавита.
Подведя итог, на вход нейронной сети подается входной 35-элементный вектор, который сопоставляется с соответствующей буквой из 26-элементного выходного вектора. Выходом НС является 26-элементный вектор, в котором только один элемент, который кодирует соответствующую букву алфавита, равен 1. Разобравшись с созданием интерфейса для работы с НС приступим к её созданию.

Построение сети


Построим нейронную сеть, которая включает в себя 35 входов (потому что вектор состоит из 35 элементов) и 26 выходов (потому что букв 26). Данная НС является двухслойной сетью. Функцией активации поставим логарифмическую сигмоидную функцию, которую удобно использовать, потому что выходные векторы содержат элементы со значениями в диапазоне от 0 до 1, что потом удобно перевести в булеву алгебру. На скрытый уровень выделим 10 нейронов (потому что просто так, можно любое значение, дальше проверим, а сколько их надо). Если Вам, что-то не понятно из выше написанного про построение сети, прочитайте, пожалуйста, про это в литературе (нужные понятия, если собираетесь работать с НС). Схематически рассматриваемую сеть можно представить следующей схемой:

А если записать в синтаксисе скриптового языка MATLAB это все, то получим:
  1. S1 = 10; % количество нейронов на скрытом слое
  2. [S2,Q] = size(targets); % количество нейронов на втором слое (количество выходов сети)
  3. P = alphabet; % входная матрица, содержащая информацию о буквах
  4. % создаем новую сеть с использованием диалогового окна
  5. net = newff(minmax(P), % матрица минимальных и максимальных значений строк входной матрицы
  6.             [S1 S2], % количество нейронов на слоях
  7.             {’logsig’ ’logsig’}, % функция активации
  8.             ’traingdx’ % алгоритм подстройки весов и смещений (обучающий алгоритм)
  9.           );


Обучение сети


Теперь, когда НС создана, необходимо её обучить, потому что она как маленький ребенок ничего не знает, полностью чистый лист. Нейронная сеть обучается с помощью процедуры обратного распространения – распространение сигналов ошибки от выходов НС к ее входам, в направлении, обратном прямому распространению сигналов в обычном режиме работы (существуют еще способы обучения, данный считается самый основной, а все остальные как модификации).
Для создания нейронной сети, которая может работать с зашумленными входными данными, необходимо обучить сеть, подавая на вход данные, как с шумом, так и без. Для этого необходимо сначала обучить сеть, подавая данные без шумовой составляющей. Затем, когда сеть обучим на идеальных данных, произведем обучение на наборах идеальных и зашумленных входных данных (это как убедимся дальше, очень важно, потому что такое обучение повышает процент правильного распознавания букв).
Для всех тренировок используется функция traingdx – функция тренировки сети, которая модифицирует значения весов и смещений по методу градиентного спуска с учетом моментов и с применением адаптивного обучения.
Сначала необходимо обучить сеть на не зашумленных данных, то есть, начиная с простого. В принципе порядок обучения не особо важен, но часто меняя порядок, можно получить различное качество адекватности НС. Затем для возможности сделать нейронную систему, которая не будет чувствительна к шуму, обучим сеть двумя идеальными копиями и двумя копиями, содержащими шум (добавляется шум с дисперсией 0,1 и 0,2). Целевое значение, поэтому будет содержать 4 копии целевого вектора.
После завершения обучения с зашумленными входными данными, необходимо повторить обучение с идеальными входными данными, для того чтобы нейронная сеть успешно справлялась с идеальными входными данными. Куски кода не привожу, потому что они очень просты, используется одна функция train, которую легко применить.

Тестирование сети


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

Как видно, что сеть плохо справилась с задачей, можно конечно поиграться с параметрами обучения (что желательно сделать) и это даст лучший результат, но мы сделаем еще сравнение, создадим новую сеть и обучим её зашумленными данными, а потом сравним полученные НС.
А сейчас вернемся к вопросу, а сколько же нейронов в скрытом слое должно быть. Для этого построим зависимость, наглядно показывающую соотношение нейронов в скрытом слое и процент ошибочного распознавания.

Как видно, с увеличением количества нейронов, можно добиться 100 % распознавания входных данных. Так же повышением вероятности правильного распознавания будет повторное обучение ране обученной нейронной сети большим количеством данных. После такого этапа нетрудно заметить, что возрастает процент правильного распознавания букв. Правда все хорошо работает до определенного момента, потому что видно при количестве больше 25 нейронов сеть начинает допускать ошибки.

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

Как видно, что при не значительном шуме НС, которая была обучена искаженными данными, справляется гораздо лучше (процент ошибочного распознавания ниже).

Подведение итогов


Постарался не томить подробностями и мелочами, попытался организовать «мурзилку» (журнал с картинками), чтоб просто понять, что такое применение НС.
По поводу полученных результатов то они указывают, на то, что для увеличения количества правильного распознавания необходимо больше времени тренировать (обучать) нейронную сеть и увеличивать количество нейронов, находящихся в скрытом слое. Если есть возможность, то увеличить разрешение входных векторов, например, букву формализует матрица 10х14. Самое важное, то, что в процессе обучения необходимо использовать большее количество наборов входных данных, по возможности с большим зашумлением полезной информации.
Ниже приведен пример, в котором проделано, все что описано и приведено в статье (даже чуть больше). Пытался рассказать, что-то полезное и не грузить какими-то непонятными формулами. Планируются еще статьи, но все зависит от ваших пожеланий.

Пример и литература


CharacterRecognition.zip
Подборка статей по нейронным сетям
Описание нейросетевых алгоритмов
Фесенко Игорь @Ky7m
карма
17,0
рейтинг 0,0
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

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

Комментарии (57)

  • –13
    Только из-за такого материала еще не самоликвидировался отсюда.
    • +29
      Это материал обычной лабораторки второго курса университета.
      • –9
        Неужели большинство людей становятся способны осознать это только ко второму курсу? o_0
        • НЛО прилетело и опубликовало эту надпись здесь
      • –1
        У нас это на третьем было. И повлияло на тему моего диплома и вообще на то, чем я хочу заниматься в дальнейшем.
      • 0
        Да, помню фигачил в матлабе такие штуки. Клёвые времена!
  • +9
    Мне всегда казалось, что нейронные сети для распознавания — тупиковая ветвь.

    Т.е. поначалу прогресс хороший, но наступает момент — и сколько не бейся — результат лучше не станет, оставаясь хуже классических систем. Потому реквестирую сравнение качества распознавания с боевыми алгоритмами )
    • +1
      Какие, например, боевые алгоритмы? НС — вообще попытка копировать модель мозга человека, просто может она еще не так точно аппроксимирует наш потенциал и возможность на своем этапе развития.
      • +5
        Сейчас более модно использовать Condition Random Field их преимущество перед нейронными сетями в том что они сходятся к глобальному минимуму, и так же могу обучатся для предсказания любой структуры. НС редко успешно применяется на практике.
        • +9
          Реквестирую Прошу статью!
          • +3
            Присоединяюсь.
        • 0
          Существуют эвристические методы обучения сети (ГА, имитация отжига, напр.), которые также при правильной настройке дают схождение к глобальному экстремуму.
          • 0
            ГА — вообще ничего не гарантирует. имитация отжига — это метод, который в некоторых случаях избегает лок. минимумов, но тоже ничего не гарантирует.
            • 0
              Почему же не гарантирует? Если, к примеру, имеется 10 генов с 4-мя (опять же к примеру) возможными значениями, то можно с уверенностью сказать, что генотип в популяции из 10^4 (т.е. 10000) особей в любом случае будет содержать «правильные» значения всех генов, но разбросанные по разным особям.
              Написал на вскидку — где-то на Хабре было четкое с точки зрения комбинаторики обоснование. Суть в том, что зная количество значений каждого гена всегда можно всегда определить величину популяции, при которой мы обязательно попадем именно в глобальный экстремум (если он один; если не один, то ситуация еще проще).
              Другое дело, что с практической точки зрения получаемый таким образом размер популяции может быть неприемлем. В ту же степь и случай кодирования генной информации «флотАми». Там либо спускаемся до разрядности представления дробного числа, либо условимся о точности (о квантовании по уровню). Но суть остается та же.

              «Отжиг», думаю, тоже у каждого свой. Кто-то настраивается на «шоб работало», а кто-то хочет гарантии.
        • +1
          Согласен, попытки избежать локальных минимумов — это то еще удовольствие. У нас на мехмате к НС относились как к лженауке. Недавно в Науке 2.0 было обсуждение кризиса в разработке искуственного интелекта. Так что лучше заниматься какими-то более реальными вещами.
          • +2
            Я лично не считаю ИНС «не реальным» инструментом. Например, систему диффернциальных уравнений в Форме Коши (мат. модель динамической системы) можно представить в виде однослойной рекуррентной сети.
            • 0
              ок, почему не нравятся, старые добрые численные методы?
              • 0
                дабы прояснить мою точку зрения: я не против НС, и я абсолютно согласен, что с их помощью можно решать огромный класс прикладных задач. Вопрос в том, можно ли решать с их помощью задачи, для которых не разработаны классические алгоритмы решения?
                • +1
                  В качестве плюсов использования ИНС могу указать следующие:
                  1) унифицированный подход к решению широкого класса задач;
                  2) возможность построения системы управления со свойствами робастности (устойчивость к возмущениям) и избыточностью (информационной и функциональной).
                  3) из п. 1 и 2 получаем возможность унифицированным образом строить системы управления сложными объектами, устойчивую к возможным возмущениям (измерительному шуму), отказам и обладающую универсальными аппроксимирующими свойствами.

                  Там, где не нужно точное аналитическое решение (или его не существует вовсе), ИНС позволяют с заданными точностными характеристиками (достаточными) найти решение, пригодное для практического использования.
      • +2
        Например, Support Vector Machines, AdaBoost?!
      • +2
        Нейронные сети были разработаны 50 лет назад, из них всё выжали в то же время. И с тех пор не придумали ничего нового.
        Нейронные сети — это прошлый век, у них нет будущего.
        • +5
          У сетей 50 летней давности — очень может быть.

          Но есть массы модификаций. Например, люди пытаются сделать нижние слои фиксированными, имитируя в них операции реально происходящие в зрительных нейронах. Или строят сети, которые выдают характеристики более-менее инвариантные относительно разных аффинных преобразований. Полученные сети вполне конкурируют с наилучшими алгоритмами.
        • 0
          Это простите почему у них нет будущего?
    • +15
      Не говорите, иногда для распознавания капчи нейронная сеть в моей голове пасует. Наверное, нейронов мало :)
    • 0
      Ну мозг наш это гигантский кластер из нейронных систем разного типа, заточенных под определенные задачи (если учитывать только «электрическую» часть мозга). Так что я бы не сказал, что тупиковая ветвь. Просто мы еще не нашли более совершенных нейроалгоритмов.
    • +5
      да ладно, а как насчет лучшего результата на тестах MNIST у 6-слойной сети?
      yann.lecun.com/exdb/mnist/
  • +8
    Было бы интересно почитать не про использование готовых шаблонов матлаба, а про создание нейронной сети. Но автору все равно спасибо, что затронули тему
    • +1
      Давно еще делал НС на С#. До конца не довел из-за нехватки времени. Постараюсь сдуть пыль со своего проекта и осветить, что сейчас уже проделано в мире.
      • +17
        Вам 22 года, какой, нафиг, «давно», и какая, к черту, «пыль»?! -)
        • +1
          Ну я относительно своих 22 лет и оперирую временными понятиями.
        • +8
          Скорость оседания пыли возрастает по мере увеличения диаметра пылинок. Время оседания пылинки диаметром 0,05 с высоты 1 м, равняется 320 часам, а пылинка размером 1 u этот же путь проходит за 3 часа, а частички диаметром 100 u оседают в течение 3 секунд. Поэтому в воздухе, попадающим в дыхательные пути находится относительно мало частичек диаметром больше 10 u.
        • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      я бы сказал, что было бы интересно почитать, про методы оптимизации структуры самой нейронной сети. Потому что сейчас это просто тыкание пальцем в него.
      • +1
        На Хабре уже была статья про эволюционные метода настройки весов НС. Я сам этой идеей заразился (применительно к задачи решения переопределенных СЛАУ). Результаты уже есть — так что ГА + ИНС это работающая связка.
    • +4
      Могу попробовать написать статью о распознаванию устной речи с практической реализацией на нейросетях. Интересно?
      • 0
        Интересно!
      • 0
        Очень, а то буквы уже достали )
  • +4
    Я сейчас для диплома написал на C# движок для нейронок и для генетических алгоритмов(для обучения). Как будет время после сдачи диплома, обязательно попробую эту задачу. Выложу свои результаты и наверное сам пакет с движком. Вообще результаты показывает неплохие, но у меня кол-ко входов гораздо меньше.
  • +7
    Кое-что об ошибках. При обучении обычно полезно контролировать две ошибки
    1) ошибка обучения (это ошибка при распознавании образов из обучающей выборки)
    2) ошибка обобщения (это ошибка на незнакомых данных, т.н. тестовая выборка) — гораздо более важный параметр, который показывает чему же в конце концов мы научили сеть.

    Почти всегда рост числа нейронов снижает ошибку обучения, вплоть до переобучения (паралича сети), но одновременно с её снижением в определенный момент начинает расти ошибка обобщения — это и есть оптимальный размер сети. В вашем случае растет именно ошибка обучения, что противоречит теории — видимо дело в матлабе, неверном типе данных, или еще в чем то, сложно сказать, но это — аномалия техногенного характера. Точно.

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

    1) Экстенсивный, вместо одной сети использовать их комитет — чем он больше тем ниже будут обе ошибки.
    2) Интенсивный — использовать другую топологию, например сверточные нейросети.
    3) Если свойства объекта могут быть проанализированы аналитически использовать не нейросети, а подходящий под задачу более адекватный алгоритм: дерево решений, сингулярный анализ (или метод главных компонент), преобразование фурье (спектр) и т.д.
  • 0
    Глянул файл characters.mat. А почему размерность алфавита 48 на x? Судя по статье должно быть 35 на x.
    • 0
      Это файл сохранен с MATLAB 7.5, я в программе учитываю это.
      Например, в 2011 Matlab (7.12): ALPHABET — 35x26 matrix of 5x7 bit maps for each letter. TARGETS — 26x26 target vectors.
  • +3
    Поскольку занимаюсь с нейронными сетями обнаружил небольшую закономерность: в качестве примера их использования в подавляющем большинстве случаев(>97%) используют задачи распознавания и предсказания, которые имхо несколько оторваны от практики. Не кого не критикую, просто небольшое наблюдение.
    • 0
      а какие методы использования НС более практичны?
      • 0
        Хороший вопрос, на который, я думаю, ни у кого нет ответа. Лично пытаюсь их применить к задаче управления динамическими объектами.
      • +1
        Странно спрашивать об универсальном методе где он более практичен?
        Везде, но в разной конфигурации.
      • 0
        я бы предположил что управление действиями npc-персонажей в играх.
  • +1
    Прочитал краткую теорию нейросетей по ссылке в конце статьи. Если я правильно понял, то суть этих нейросетей в том, что у нас есть много однотипных устройств (нейронов) с простой логикой работы и вместо того, чтобы соединять эти устройства следуя логике (как это делают при обычном программировании), мы берём входные данные, требуемые выходные данные и настраиваем сеть так, чтобы на входных данных получалось что то похожее на нужные выходные данные. Здесь главное, чтобы этими нейронами можно было, в принципе, реализовать любую функцию.

    Почему бы не заменить нейрон устройством «nand-gate», известным в программировании FPGA (nand это булева функция: nand(a, b) = not(and(a, b)))? Сеть из nand-ов может реализовать любую функцию, потому что из композиций nand можно построить любую функцию. В этом случае получится FPGA (или ПЛИС, по нашему) — схема которую можно перепрограммировать самому. Почему тогда для программирования FPGA не используют подход нейросетей, а программируют как обычно? Наверно потому что подбирать параметры соединений FPGA слишком долго. Вот поэтому мне кажется, что решить какую либо задачу проще обычной программой, а не нейросетью.

    • 0
      При чем здесь вообще булевы функции? Конкретно нейронные сети могут применяться не только на задачах классификации, но и на численных задачах.
    • 0
      1. nand — не дифференцируемая функция.
      2. Практические булевы функции слишком сложны для нейронной сети. Изменяете один бит на входе — и на выходе совсем другое.
    • +1
      При желании функцию активации нейронов можно задать и такой, но результат скорее всего разочарует по указанным выше причинам.
    • 0
      Их суть в том, что у тебя есть уравнение со многими неизвестными и ты эти самые неизвестные изменяешь (определенным алгоритмом) до тех пор пока уравнение не станет равенством (громко сказано) хотя бы приблизительно.
      Дальше, работа нейронной сети — это просто аппроксимация данных этим самым уравнением.
  • +1
    Мое мнение, что приведенное применение нейросети — не самый показательный пример работы. Все же сложно не согласится с тем, что большинство задач нейросеть решает хуже(по-крайней мере по точности), чем классические алгоритмы. Одно из наиболее полезных свойство НС — возможность обучения в процессе эксплуатации. Например, на автомобилях с АКПП используют нейросети для адаптации параметров коробки к амортизации.
    Так же для конкретной задачи в статье мало затронута основная проблема работы с НС — приведение входов к инвариантности относительно шумовых типов(не значений). Например, попробуйте сделать то же самое для разных шрифтов — у вас ничего не выйдет, пока вы не приведете набор значений пикселей к типовому для буквы значению, независимо от шрифта. В данном случае можно было бы рассмотреть не тупо значения пикселей, а, например, центр масс буквы, кол-во отверстий в ней и т.д. — на что хватит фантазии.

    По поводу построения сети:
    Функция активации — вообще тема для отдельной статьи, но, хотя бы, привести несколько других можно было бы.
    Кол-во скрытых слоев — «возьмем один», а почему 1?
    Кол-во нейронов подберем в ручную…
    Я конечно дико извиняюсь, но я на вступительной работе в бауманку делал распознавание рукописного ввода с автоматическим определением параметров нейросети с самостоятельным написанием всего и вся на дельфи.
    А тут — человек просто нашел в матлабе модуль для работы с нейросетями, толком не разобрался с самими НС и сделал «проект» за 10 минут и решил это запостить.
    Либо рассказывайте почему вы делаете так, а не иначе(сравнительный обзор, например), либо приведите интересную реализацию. Распознавание печатного текста уже было неоднократно.
    • +1
      Присоединяюсь…
      Нейронные сети были разработаны 50 лет назад, из них всё выжали в то же время. И с тех пор не придумали ничего нового.

      50 лет на мой взгляд нормальный срок (это еще не давно). В науке все небыстро. А вот про «выжали» не согласен. Как раз нет твердой методологии по проектированию структуры сети. И здесь, на Хабре, требовать сухого теоретического обоснования не нужно. Но хоть какое-то обоснование хотелось бы увидеть.
      И ГА и ИНС еще недостаточно обоснованы с теоретической точки зрения, но они работают. А чего больше надо «практику»?
      • +1
        Забыл про «приведение входов». Да это очень важная тема. В цифровой обработке сигналов в этом плане легче — всегда есть максимум и минимум на выходе датчика. Нужно лишь поточнее их определить или взять с запасом. А вот в распознавании все посложнее. Если автор напишет свои соображения по этому поводу, будет хорошо.

        Про функцию активации — пробовал обучать ИНС с сигмоидом во входном слое (сетка для решения СЛАУ) и ничего толком не вышло. Заменил все на чисто линейную функцию и замечательно обучается, но ведь это уже не интересно. Что за сеть без нелинейных функций активации? Если по этой теме кто-то отпишется, тоже буду очень благодарен.
    • 0
      1) Почему один скрытый слой?
      Ну, начнем сначала, почему он вообще там есть. Из теории известно, что нейронная сеть, которая состоит всего из входного и выходного слоев без скрытых слоев, представляет собой линейный персептрон. Из названия уже понятно, что такие персептроны способны моделировать только линейные функции, поэтому используются очень редко. Хотя они обеспечивают универсальную линейную аппроксимацию, что часто и требуется для конкретной задачи, но явно не нашей. Но если проблема значительно нелинейная, имеет смысл попытаться решить ее с помощью линейного персептрона.
      Математики долго бьются над вопросом, сколько оптимально скрытых слоев должно быть, но в реальной сети использование большего количества слоев приводит к уменьшению суммарного количества элементов в скрытых слоях. Но анализ людей, работающей в этой области науки, считает, что для решения большинства практических задач достаточно одного, иногда двух скрытых слоев. Причина такого несоответствия теории и практики лежит, по-видимому, в том, что сложность реальных проблем намного меньше, чем это теоретически возможно. Поэтому решение задачи удобно начинать с такого рассуждения, да и в MATLAB удобно показывать на примере, рассматриваемом в статье.
      2) Количество нейронов в скрытом слое я потом изменял и проиллюстрировал результаты, в комментарии дали хороший развернутый ответ на полученную зависимость качества НС от количества нейронов в скрытом слое.
      3) Тут человек нашел в MATLAB модуль, не нашел такой статьи на Хабре, нашел желание и показал на примере практическое применение.
      4) К сожалению, потратил не 10 минут, а наверно 10 часов на всё.
      Спасибо за Ваш комментарий.

  • 0
    Из теории известно, что нейронная сеть, которая состоит всего из входного и выходного слоев без скрытых слоев, представляет собой линейный персептрон.

    Это если функция активации тоже линейная, так?
    • 0
      Да, можно это понимать как линейный классификатор (делим на два множества с помощью бесконечной линии)

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