Использование имитационной модели нейронной сети для оценки ее эффективности при поиске заданного объекта на изображении

Разработать программный пакет, выполняющий поиск заданного фрагмента на изображении. Оценить эффективность использования имитационной модели нейронной сети в задачах распознавания образов.

2015-04-18

926.18 KB

18 чел.


Поделитесь работой в социальных сетях

Если эта работа Вам не подошла внизу страницы есть список похожих работ. Так же Вы можете воспользоваться кнопкой поиск


     Использование имитационной модели нейронной сети для оценки ее эффективности при поиске заданного объекта на изображении.


Реферат

Тема:

Использование имитационной модели нейронной сети для оценки ее эффективности при поиске заданного объекта на изображении.

Цели:

Разработать программный пакет, выполняющий поиск заданного фрагмента на изображении. Оценить эффективность использования имитационной модели нейронной сети в задачах распознавания образов.

Задачи:

  1.  Создание математической модели, описывающей решение задачи поиска заданного фрагмента изображения.
  2.  Разработка алгоритма распознавания выбранных фрагментов на изображении.
  3.  Программная реализация построенного алгоритма.
  4.  Экспериментальная проверка адекватности выбранной модели.

Типы используемых вычислительных средств

При написании дипломного проекта использовался персональный компьютер с микропроцессором  Pentium(R) 4 с тактовой частотой  3.0 ГГц, 4 ГБ оперативной памяти, 250 Гб жесткий диск.

Полученные результаты:

  1.  Создана математическая модель, реализующая распознавание фрагментов на изображении. 
  2.  Разработан алгоритм распознавания.
  3.  Создана программная реализация построенного алгоритма.
  4.  Произведена экспериментальная проверка адекватности выбранной модели.

Программа написана на языке программирования C#, с    использованием интегрированной среды разработки приложений Microsoft Visual Studio Team System 2008, работающей под управлением операционной системы Microsoft Windows Seven Ultimate Edition (x32).


Оглавление
        

Введение                   5

Глава 1. Аналитический обзор                7

 1.1 Искусственный интеллект – новая информационная революция       7

  1.1.1 Основы теории нейроподобных сетей                                             10

1.2 Нейрон как элементарное звено                                                        11

  1.2.1 Нейроподобный элемент                                                               13

  1.2.2 Нейроподобные сети (НПС)                                                         15

1.3 Однослойные сети. Персептрон                                                        18

  1.3.1 Многослойные сети                                                                      20

  1.3.2 Сети Хопфилда                                                                             21

1.4 Обучение нейроподобной сети                                                          23

  1.4.1 Использование обучающего набора примеров                              23

  1.4.2 Использование обобщенной модели объекта                                25

          1.4.3 Полнота использования информации изображения                     25

Глава 2. Содержательная и формальная постановка задачи                     27

2.1 Содержательная постановка задачи                                         27

2.2 Формальная постановка задачи              27

2.3 Описание алгоритма                28

2.4 Пример решения алгоритма              29

Глава 3. Выбор и обоснование программной реализации                         32

3.1 История создания языка                                                                    32

3.2 Особенности языка                                                                            34

3.3 Причины возникновения языка C#                                                    35

3.4 Простота C#                                                                                       36

3.5 Управляющие конструкции C#                                                         37

3.6 Инструкция по эксплуатации                                                            41

       Глава 4. Экспериментальная часть.              42

 4.1 Эксперимент                 42

  Заключение                                    46

Список литературы                47

Приложение 1. Листинг программы                                                         49

Приложение 2. Интерфейс программного комплекса                              69

   


   Введение

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

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

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

        

   Глава 1. Аналитический обзор.

1.1 Искусственный интеллект – новая информационная революция.

Для создания ИИ уже достаточно вычислительной мощности современных компьютеров. Но необходима особая структура оперативной памяти, отличная от ёмкостной. Оперативная память должна быть токовой.

Что собой представляет, привычная для пользователя компьютера, оперативная память? Это микросхемы, чипы, построенные из ёмкостных ячеек. Каждая ячейка имеет свой адрес (координаты). Заполненная ячейка – заряженная ёмкость (1), пустая – разряженная (0). На обработку каждой ячейки, запись, стирание, считывание процессор выделяет отдельные циклы. То есть так он (компьютер) и работает: считывает, считает, записывает результат.

      Вычислительная мощность процессора, то есть работа мозга, направленная на обработку внешних воздействий, и поиск информации в статичной (сохранённой) памяти при этом проблем с ресурсами не имеют. Единицы в нашей оперативной памяти не подвергаются вычислительному процессу. Они видоизменяются под воздействием внешних факторов напрямую: «проехала красная машина», «заболела спина», «надо ответить на письмо от друга». В машинном коде эти мысли занимают разное битное пространство памяти, в человеческом – один блок. В таком же блочном виде они сохраняются в статичной памяти. Разный уровень интеллектуальных способностей у людей, видимо, связан с размерами этого блока. Больше блок – легче осмысление крупного массива информации, быстрее поиск в сохранённой памяти.

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

В настоящее время различают два основных подхода к моделированию искусственного интеллекта (AI – artificial intelligence): машинный интеллект, заключающийся в строгом задании результата функционирования, и искусственный разум, направленный на моделирование внутренней структуры системы.  Разделение работ по искусственному интеллекту на два направления связано с существованием двух точек зрения на вопрос, каким образом строить системы искусственного интеллекта. Сторонники одной точки зрения убеждены, что «важнее всего результат», т.е. хорошее совпадение поведения искусственно созданных и естественных интеллектуальных систем, а что касается внутренних механизмов формирования поведения, то разработчик искусственного интеллекта вовсе не должен копировать или даже учитывать особенности естественных, живых аналогов. Другая точка зрения состоит в том, что именно изучение механизмов естественного мышления и анализ данных о способах формирования разумного поведения человека могут создать основу для построения систем искусственного интеллекта, причем построение это должно осуществляться, прежде всего, как моделирование, воспроизведение техническими средствами принципов и конкретных особенностей функционирования биологических объектов.

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

Второе направление искусственного интеллекта рассматривает данные о нейрофизиологических и психологических механизмах интеллектуальной деятельности и, в более широком плане, разумного поведения человека. Оно стремится воспроизвести эти механизмы с помощью тех или иных технических устройств, с тем чтобы «поведение» таких устройств хорошо совпадало с поведением человека в определенных, заранее задаваемых пределах. Развитие этого направления связано с успехами наук о человеке. Для него характерно стремление к воспроизведению более широкого, чем в машинном интеллекте, спектра проявлений разумной деятельности человека. Системы искусственного разума базируются на математической интерпретации деятельности нервной системы во главе с мозгом человека и реализуются в виде нейроподобных сетей на базе нейроподобного элемента – аналога нейрона.

Нейроподобные сети в последнее время являются одним из самых перспективных направлений в области искусственного интеллекта и постепенно входят в бытность людей в широком спектре деятельности.

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

Сети второй группы используются как системы управления в реальном времени несложными объектами, например: управление популярными в последнее время интеллектуальными агентами, исполняющими роль виртуальных секретарей. Особенностями данной группы является появление некоторых внутренних стимулов, возможность к самообучению и функционированию в реальном времени.

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

Сейчас в Интернете повсеместно можно встретить признаки зарождения подобных проектов, призывы объединиться всем научным потенциалом способного думать человечества в целях очеловечивания Интернета, преобразования его в разумную систему или среду обитания разумных систем. Раз существуют подобные предпосылки, значит, не что не остановит полет человеческой мысли на пути достижения поставленной цели.

На основании вышеизложенного можно сделать вывод о том, что основные направления искусственного интеллекта связаны с моделированием, но в случае машинного интеллекта мы имеем дело с моделированием феноменологическим, имитационным, а в случае искусственного разума – с моделированием структурным.


   

 1.1.1 Основы теории нейроподобных сетей.

В терминологии нейрогенетики введено ключевое понятие – нейросеть. Именно совокупность нейросетей образует отделы нервной системы человека, которые в свою очередь определяют всю деятельность, придают существу разум, интеллект.

Мозг является, пожалуй, самой сложной из известных нам систем переработки информации. Достаточно сказать, что в нем содержится около 100 миллиардов нейронов, каждый из которых имеет в среднем 10 000 связей. При этом мозг чрезвычайно надежен: ежедневно погибает большое количество нейронов, а мозг продолжает функционировать. Обработка огромных объемов информации осуществляется мозгом очень быстро, за доли секунды, несмотря на то, что нейрон является медленнодействующим элементом со временем реакции не менее нескольких миллисекунд.

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

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

      1.2  Нейрон как элементарное звено.

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

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

Нейроны можно разбить на три большие группы: рецепторные, промежуточные и эффекторные. Рецепторные нейроны обеспечивают ввод в мозг сенсорной информации. Они трансформируют сигналы, поступающие на органы чувств (оптические сигналы в сетчатке глаза, акустические в ушной улитке или обонятельные в хеморецепторах носа), в электрическую импульсацию своих аксонов. Эффекторные нейроны передают приходящие на них сигналы исполнительным органам. На конце их аксонов имеются специальные синаптические соединения с исполнительными органами, например мышцами, где возбуждение нейронов трансформируется в сокращения мышц. Промежуточные нейроны осуществляют обработку информации, получаемой от рецепторов, и формируют управляющие сигналы для эффекторов. Они образуют центральную нервную систему.

1.2.1  Нейроподобный элемент. 

Рис. . Схема строения нейроподобного элемента.

Нейроподобный элемент, который обычно используется при моделировании нейронных сетей, приведен на рисунке1.

На нейроподобный элемент поступает набор входных сигналов x1...хn (или входной вектор ), представляющий собой выходные сигналы других нейроподобных элементов. Этот входной вектор соответствует сигналам, поступающим в синапсы биологических нейронов. Каждый входной сигнал умножается  на θсоответствующий вес связи w1…wn – аналог эффективности синапса. Вес связи является скалярной величиной, положительной для возбуждающих  и отрицательной для тормозящих связей. Взвешенные весами связей входные сигналы поступают на блок суммации, соответствующий телу клетки, где осуществляется их алгебраическая суммация и определяется уровень возбуждения нейроподобного элемента S:

 

Выходной сигнал нейрона у определяется путем пропускания уровня возбуждения S через нелинейную функцию f:

,

где θ — некоторое постоянное смещение (аналог порога нейрона). Обычно используются простейшие нелинейные функции:

  •  бинарная                                      

                                                                                                                   

  •  сигмоидная:                              1 

                              0,5

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

   1.2.2 Нейроподобные сети (НПС)

Что же такое нейроподобная сеть? Это искусственный аналог биологической сети, по своим параметрам максимально приближающийся к оригиналу. Нейроподобные сети прошли длинный путь становления и развития, от полного отрицания возможности их применения до воплощения во многих сферах деятельности человека.

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

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

Приведенные выше преимущества нейросетевой обработки данных определяют области применения НПС:

  •  обработка и анализ изображений;
  •  распознавание речи независимо от диктора, перевод;
  •  обработка высокоскоростных цифровых потоков;
  •  автоматизированная система быстрого поиска информации;
  •  классификация информации в реальном масштабе времени;
  •  планирование применения сил и средств в больших масштабах;
  •  решение трудоемких задач оптимизации;

Основные положения теории деятельности головного мозга и математическая модель нейрона были разработаны У. Маккалоком и Ч. Питтсом в 1943 году и опубликованы в статье «Логическое исчисление идей, относящихся к нервной деятельности», которая была издана на русском языке в сборнике «Автоматы» только спустя 13 лет. Согласно предложенной модели мозг представляет собой ансамбль нейронов, имеющих одинаковую структуру. Каждый нейрон реализует некоторую функцию, называемую пороговой, над входными значениями. Если значение функции превышает определенную величину – порог (что характеризует суммарную значимость полученной нейроном информации), нейрон возбуждается и формирует выходной сигнал для передачи его другим нейронам. Пройдя путь от рецепторов (слуховых, зрительных и других) через нейронные структуры мозга до исполнительных органов, входная информация преобразуется в набор управляющих воздействий, адекватных ситуации.

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

  •  группа нейронов;
  •  нейронная сеть;
  •  нервная система;
  •  мыслительная деятельность;
  •  мозг.

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

В настоящее время основными направлениями реализации НПС являются:

программная реализация на цифровых ЭВМ традиционной архитектуры;

программно-аппаратная реализация в виде сопроцессоров к ЭВМ общего назначения;

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

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

На сегодняшний день известно уже более 200 различных парадигм нейронных сетей (не только детерминированных, но и вероятностных), десятки НПС реализованы в специализированных кристаллах и платах, на их основе созданы мощные рабочие станции и даже суперкомпьютеры. Современные технологии достигли того рубежа, когда стало возможным изготовление технической системы из 3…4 млрд. нейронов (именно такое количество их в мозгу человека). Однако их соединение продолжает оставаться проблемой.

1.3 Однослойные сети. Персептрон.

В соответствии персептрон представляет собой модель обучаемой распознающей системы. Он содержит матрицу светочувствительных элементов (S-элементы), ассоциативные элементы (А-элементы) и реагирующие элементы (R-элементы).  По сути персептрон состоит из одного слоя искусственных нейронов, соединенных с помощью весовых коэффициентов с множеством входов.

    В 60е годы персептроны вызвали большой интерес. Розенблатт  доказал теорему об обучении  персептрона и тем самым  показал, что персептрон способен научиться всему, что он способен представлять.  Уидроу дал ряд убедительных  демонстраций  систем персептронного типа.  Исследования возможности этих систем показали, что персептроны не способны обучиться ряду простых задач. Минский  строго проанализировал эту проблему и показал, что имеются жесткие ограничения на то, что могут выполнять однослойные персептроны, и, следовательно, на то, чему они могут обучаться.

    Один из самых пессимистических результатов Минского показывает, что однослойный персептрон не может воспроизвести такую простую функцию как  исключающее или. Это - функция от двух аргументов, каждый из которых может быть нулем или единицей. Она принимает значение единицы, когда один из аргументов равен единице  (но не оба). Если проблему представить с помощью однослойной однонейронной системы, то легко видеть, что при любых значениях весов и порогов невозможно расположить прямую линию, разделяющую плоскость (пространство образов) так, чтобы реализовывалась функция исключающее или. Имеется обширный класс функций (наряду с функцией исключающее или), не реализуемых однослойной сетью. Об этих функциях говорят,  что они являются линейно неразделимыми, и они накладывают определенные ограничения на возможности однослойных сетей. Линейная разделимость ограничивает однослойные сети задачами классификации, в которых множества точек (соответствующих входным значениям) могут быть разделены геометрически. В случае двух входов разделитель является прямой линией. В случае трех входов разделение осуществляется плоскостью, рассекающей трехмерное пространство. Для четырех или более входов визуализация невозможна и необходимо мысленно представить n-мерное пространство, рассекаемое ‘‘гиперплоскостью’’ - геометрическим объектом, который рассекает пространство четырех или большего числа измерений. Как показано  вероятность того, что случайно выбранная функция окажется линейно разделимой, весьма мала. Так как линейная разделимость ограничивает возможности персептронного представления, то однослойные персептроны на практике ограничены простыми задачами.

     Чтобы сеть представляла практическую ценность, нужен       систематический метод (алгоритм) для вычисления значений весов и порогов. Процедуру подстройки весов обычно называют обучением. Цель обучения состоит в том, чтобы для некоторого множества входов давать желаемое множество выходов. Алгоритм обучения персептрона был предложен в и имеет множество модификаций. В настоящей работе реализованна модель одного из вариантов.

 1.3.1  Многослойные сети.

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

Многослойные сети способны выполнять общие классификации, отделяя те точки, которые содержаться в выпуклых ограниченных или неограниченных областях.  Если рассмотреть простую двухслойную сеть с двумя нейронами в первом слое, соединенными с единственным нейроном во втором слое, то каждый нейрон первого слоя разбивает плоскость  на две полуплоскости, образуя в пространстве образов V-образную область, а нейрон второго слоя реализует различные функции при подходящем выборе весов и порога. Аналогично во втором слое может быть использовано три нейрона с дальнейшим разбиением плоскости и созданием области треугольной формы. Включением достаточного числа нейронов во входной слой может быть образован выпуклый многоугольник любой желаемой формы. Точки, не составляющие выпуклой области, не могут быть отделены о других точек плоскости двухслойной сетью.

  Трехслойная сеть является более общей. Ее классифицирующие возможности ограничены лишь числом искусственных нейронов и весов. Ограничения на выпуклость отсутствуют. Теперь нейрон третьего слоя принимает в качестве входа набор выпуклых многоугольников, и их логическая комбинация может быть невыпуклой. При добавлении нейронов и весов число сторон многоугольника может неограниченно возрастать. Это позволяет аппроксимировать область любой формы с любой точностью. В добавок не все выходные области второго слоя должны пересекаться. Возможно, следовательно, объединять различные области, выпуклые и невыпуклые, выдавая на выходе единицу всякий раз, когда входной вектор принадлежит одной из них.

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

  1.3.2 Сети Хопфилда.

Сети, рассмотренные выше, не имели обратных связей, т.е. связей, идущих от выходов сети к их входам. Отсутствие обратных связей гарантирует безусловную устойчивость сетей. Так как сети с обратными связями имеют пути от выходов к входам, то отклик таких сетей является динамическим, т.е. после приложения нового входа вычисляется выход и, передаваясь по сети обратной связи, модифицирует вход. Затем выход повторно вычисляется и процесс повторяется снова и снова. Для устойчивой сети последовательные итерации приводят к все меньшим изменениям выхода, пока в конце концов выход не становится постоянным. Для многих сетей процесс никогда не заканчивается, такие сети называются неустойчивыми.  Проблема устойчивости ставила в тупик первых исследователей. Никто не был в состоянии предсказать, какие из сетей будут устойчивыми, а какие будут находится в постоянном изменении. К счастью, в работе была получена теорема, описавшая подмножество сетей с обратными связями, выходы которых в конце концов достигают устойчивого состояния. Это замечательное достижение открыло дорогу дальнейшим исследованиям.

Дж. Хопфилд сделал важный вклад как в теорию, так и в применение систем с обратными связями. В его работе  при имитации поведения  ансамбля нейронов использовались переменные, описывающие состояния нейронов (вектор состояния ), и переменные, описывающие связи между нейронами (оператор памяти W),а также два уравнения , определяющие изменение со временем. Одно из этих уравнений представляет изменение под действием оператора W (выработка реакции на стимул), а второе - изменение матрицы W, квадратичное по (запоминание).При этом вектор состояния ансамбля  нейронов представляет собой вектор в фазовом пространстве динамической системы , а ‘‘память’’ реализована как  система аттракторов. Запоминание новой информации осуществляется путем  усложнения по определенному алгоритму структуры аттракторов. Такой подход допускает простую механическую аналогию, если представить себе вектор состояния как положение частицы, движущейся под действием силы тяжести и трения по некоторому рельефу. При скатывании с ‘‘горы’’ в одну  из  ‘‘низин’’ потенциальная энергия системы уменьшается, и в конце концов материальная точка останавливается из-за трения. Положение частицы в конечном состоянии (т.е. та из низин,  в  которой она останавливается) зависит как от формы рельефа, так и от начального состояния, с которого началось скатывание. Функционирование  сети легко визуализируется геометрически. В случае двух бинарных нейронов в выходном слое  каждой вершине квадрата соответствует одно из четырех состояний системы (00,01,10,11). В случае трехнейронной системы пространство образов представлено кубом (в трехмерном пространстве), имеющим 8 вершин, каждая из которых помечена трехбитовым бинарным числом. В общем случае система с  n нейронами имеет 2n различных сосояний и представляется  n - мерным гиперкубом. Когда подается новый входной вектор, сеть переходит из вершины в вершину, пока не стабилизируется. Устойчивая вершина определяется сетевыми весами, текущими входами и величиной порога. Если входной вектор частично неправилен или неполон, то сеть стабилизируется к вершине, ближайшей к желаемой.

В данной работе представлена программная реализация сети Хопфилда и проиллюстрираваны ряд ее свойств.

           1.4 Обучение нейроподобной сети.

Одно из важнейших свойств нейроподобной сети — способность к самоорганизации, самоадаптации с целью улучшения качества функционирования. Это достигается обучением сети, алгоритм которого задается набором обучающих правил. Обучающие правила определяют, каким образом изменяются связи в ответ на входное воздействие. Многие из них являются развитием высказанной Д.О. Хеббом идеи о том, что обучение основано на увеличении силы связи (синаптического веса) между одновременно активными нейронами. Таким образом, часто используемые в сети связи усиливаются, что объясняет феномен обучения путем повторения и привыкания. Математически это правило можно записать следующим образом:

,

где wij(t) и wij(t+1) – значение веса связи от i-го к j-му нейрону соответственно до и после его изменения, α — скорость обучения, yi и yj –выходные сигналы i-го и j-го нейронов. В настоящее время существует множество разнообразных обучающих правил (алгоритмов обучения).

 1.4.1 Использование обучающего набора примеров

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

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

Одни из самых совершенных методов, в которых извлечение признаков и построение системы их взаимоотношений происходит в процессе обучения – это скрытые Марковские модели и нейронные сети.

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

  1.4.2  Использование обобщенной модели объекта

Методы делятся на два класса по способу сравнения неизвестного изображения с тренировочным набором (или базой изображений).

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

Второй класс методов непосредственно сравнивает неизвестное изображение с каждым изображением из тренировочной выборки. Это метод сравнения эталонов, методы сравнения эластичных графов, анализ оптического потока.

             1.4.3 Полнота использования информации изображения.

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

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

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

Глава 2. Содержательная и формальная постановка задачи

2.1 Содержательная постановка задачи

Целевая функция осуществляет поиск минимального евклидова расстояния между i-м признаком    вектора из входного видеопотока   и i-м   признаком  j-го вектора, хранящегося в базе данных, при ограничении на максимально допустимое отклонение  элементов векторов друг от друга.

2.2 Формальная постановка задачи

Обозначения:

n – количество признаков, характеризующих изображение;

        m –количество изображений в базе;

         –  -ый признак -го изображения в базе;

  –  -ый нормированный признак -го изображения в базе;

          –  -ый признак входного изображения;

          –  -ый нормированный признак входного изображения;

        

         –  некоторая малая величина;

 2.3 Описание алгоритма

  1.  На вход поступает изображение, из которого выделяются ключевые точки, совпадающие с ключевыми точками изображения искомого объекта.
  2.  На базе найденных точек строится неориентированный граф.
  3.  Вычисляются длины отрезков, соединяющих полученные точки. Если длина отрезка больше 50 пикселей, отрезок не рассматривается.
  4.  Сформированный вектор признаков поэлементно сравнивается с векторами признаков, хранящимися в БД.  Вычисляется сумма отклонений входного вектора признаков от вектора признаков из БД.
  5.  Переход к шагу 4, если в БД имеется следующий вектор признаков. Иначе, переход на шаг 6.
  6.  Из всех вычисленных сумм отклонений выбирается минимальная.
  7.  Вывод на терминал вектора признаков с наименьшей суммой отклонений от входного вектора признаков.
  8.  Конец алгоритма.                 

 2.4 Пример решения алгоритма

На вход поступило изображение (рис. 2.1), в котором выделены следующие координаты:

A= {246; 100};

B= {293; 97};

C= {249; 137};

D= {285; 125};

 F= {275; 72};

Находим расстояния, формирующие вектор признаков:

AB=47;               AC=37,12;             AF=40,31;

BA=47;               BD=29,12;             BF=30,8;

DC=37,94;          DB=29,12;             CA=37,12;

CD=37,94;          FA=40,31;              FB=30,8;

Рис 2.1 Массив ключевых точек №1

           Пусть в базе данных хранятся 3 вектора признаков:

v1 (рис. 2.1):

AB=45,54;               AC=35,11;             AF=24,69;

BA=45,54;               BD=27,89;             BF=27,85;

DC=39,2;                 DB=27,89;             CA=35,11;

CD=39,2;                 FA=24,69;              FB=27,85;

v2 (рис. 2.2):

AB=54,12;               AC=48,1;               AF=39,05;

BA=54,12;               BD=46,6;               BF=26,9;

DC=64,4;                 DB=46,6;               CA=48,1;

CD=64,4;                 FA=39,05;              FB=26,9;

Рис 2.2 Массив ключевых точек №2

v3 (рис. 2.3):

AB=82,4;                 AC=30,6;               AF=55,1;

BA=82,4;                 BD=53,7;               BF=51,33;

DC=110,65;             DB=53,7;               CA=30,6;

CD=110,65;             FA=55,1;               FB=51,33;

Рис 2.3 Массив ключевых точек №3

Найдем суммы поэлементных отклонений входного вектора признаков от векторов:

Для векторов v1:

Δ AB=1,46;               Δ AC=2,01;              Δ AF=15,62;

Δ BA=1,46;               Δ BD=1,23;              Δ BF=2,95;

Δ DC=1,26;               Δ DB=1,23;              Δ CA=2,01;

Δ CD=1,26;               Δ FA=15,62;            Δ FB=2,95;

Сумма отклонений:49,06

Для векторов v2:

Δ AB=7,12;               Δ AC=10,98;            Δ AF=1,26;

Δ BA=7,12;               Δ BD=17,48;            Δ BF=3,9;

Δ DC=26,46;             Δ DB=17,48;            Δ CA=10,98;

Δ CD=26,46;             Δ FA=1,26;               Δ FB=3,9;

Сумма отклонений:179,94

Для векторов v3:

Δ AB=35,4;               Δ AC=6,52;              Δ AF=14,79;

Δ BA=35,4;               Δ BD=24,58;            Δ BF=20,53;

Δ DC=72,71;             Δ DB=24,58;            Δ CA=6,52;

Δ CD=72,71;             Δ FA=14,79;            Δ FB=20,53;

Сумма отклонений:349,06

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

Входной вектор признаков, соответствует вектору v1 в базе данных.

Глава 3. Выбор и обоснование программной реализации.

 3.1 История создания языка

Язык C# появился на свет в июне 2000 г. в результате кропотливой работы большой группы разработчиков компании Microsoft, возглавляемой Андерсом Хейлсбергом (AndersHejlsberg). Этот человек известен как автор одного из первых компилируемых языков программирования для персональных компьютеров IBM -- TurboPascal. Наверное, на территории бывшего Советского Союза многие разработчики со стажем, да и просто люди, обучавшиеся в той или иной форме программированию в вузах, испытали на себе очарование и удобство использования этого продукта. Кроме того, во время работы в корпорации Borland Андерс Хейлсберг прославился созданием интегрированной среды Delphi (он руководил этим проектом вплоть до выхода версии 4.0).

Появление языка C# и инициативы .NET отнюдь не случайно пришлось на начало лета 2000 г. Именно к этому моменту компания Microsoft подготовила промышленные версии новых компонентных технологий и решений в области обмена сообщениями и данными, а также создания Internet-приложений (COM+, ASP+, ADO+, SOAP, BiztalkFramework). Несомненно, лучшим способом продвижения этих новинок является создание инструментария для разработчиков с их полноценной поддержкой. В этом и заключается одна из главных задач нового языка C#. Кроме того Microsoft не могла больше расширять все те же инструменты и языки разработки, делая их все более и более сложными для удовлетворения конфликтующих между собой требований поддержки современного оборудования и обеспечения обратной совместимости с теми продуктами, которые были созданы в начале 1990-х гг. во время первого появления Windows. Наступает момент, когда необходимо начать с чистого листа для того, чтобы создать простой, но имеющий сложную структуру набор языков, сред и средств разработки, которые позволят разработчику легко создавать современные программные продукты.

С# и .NET являются той самой отправной точкой. Если говорить упрощенно, то .NET представляет собой новую платформу, новый API для программирования в Windows, а С# е новый язык, созданный с нуля, для работы с этой платформой, а также для извлечения всех выгод из прогресса сред разработки и нашего понимания принципов объектно-ориентированного программирования в течение последних 20 лет.

Необходимо отметить, что обратная совместимость не потеряна. Существующие программы будут выполняться, а платформа .NET была спроектирована таким образом, чтобы она могла работать с имеющимся программным обеспечением. Связь между компонентами в Windows сейчас почти целиком осуществляется при помощи СОМ. С учетом этого .NET обладает способностью (а) создавать оболочки (wrappers) вокруг существующих компонентов СОМ, так что компоненты .NET могут общаться с ними, и (б) создавать оболочки вокруг компонентов .NET, что позволяет им выглядеть как обычные СОМ-компоненты.

Авторы C# стремились создать язык, сочетающий простоту и выразительность современных объектно-ориентированных языков (вроде Java) c богатством возможностей и мощью C++. По словам Андерса Хейлсберга, C# позаимствовал большинство своих синтаксических конструкций из C++. В частности, в нем присутствуют такие удобные типы данных, как структуры и перечисления (другой потомок C++ -- Java -- лишен этих элементов, что создает определенные неудобства при программировании). Синтаксические конструкции С# унаследованы не только от C++, но и от VisualBasic. Например, в С#, как и в VisualBasic, используются свойства классов. Как C++, С# позволяет производить перегрузку операторов для созданных вами типов Java не поддерживает ни ту, ни другую возможность). С# — это фактически гибрид разных языков. При этом С# синтаксически не менее (если не более) чист, чем Java, так же прост, как VisualBasic, и обладает практически той же мощью и гибкостью, что и C++.

   3.2 Особенности языка

Полный и хорошо определенный набор основных типов.

Встроенная поддержка автоматической генерации XML-документации. Автоматическое освобождение динамически распределенной памяти.

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

Полный доступ к библиотеке базовых классов .NET, а также легкий доступ к Windows API (если это действительно необходимо).

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

Поддержка свойств и событий в стиле VB.

Простое изменение ключей компиляции. Позволяет получать исполняемые файлы или библиотеки компонентов .NET, которые могут быть вызваны другим кодом так же, как элементы управления ActiveX (компоненты СОМ).

Возможность использования С# для написания динамических web-страниц ASP.NET.

     Одной из областей, для которых не предназначен этот язык, являются критичные по времени и высокопроизводительные программы, когда имеет значение, занимать исполнение цикла 1000 или 1050 машинных циклов, и освобождать ресурсы требуется немедленно. C++ остается в этой области наилучшим из языков низкого уровня. ВС# отсутствуют некоторые ключевые моменты, необходимые для создания высокопроизводительных приложений, в частности подставляемые функции и деструкторы, выполнение которых гарантируется в определенных точках кода.

 3.3 Причины возникновения языка C#

Главной особенностью языка C# является его ориентированность на платформу Microsoft .NET — создатели C# ставили своей целью предоставление разработчикам естественных средств доступа ко всем возможностям платформы .NET. Видимо, это решение можно считать более или менее вынужденным, так как платформа .NET изначально предлагала значительно большую функциональность, чем любой из существовавших на тот момент языков программирования.

Кроме того, создатели С# хотели скрыть от разработчика как можно больше незначительных технических деталей, включая операции по упаковке/распаковке типов, инициализации переменных и сборке мусора. Благодаря этому программист, пишущий на C#, может лучше сконцентрироваться на содержательной части задачи. В процессе решения этой задачи проектировщики C# пытались учесть уроки реализации VisualBasic'а, который достаточно успешен в скрытии деталей реализации, но недостаточно эффективен для написания крупных промышленных систем: создатели C# декларируют, что новый язык обладает мощностью С++ и в то же время простотой VisualBasic'а. Еще одно преимущество создания нового языка программирования по сравнению с расширением существующих заключается в том, что при создании нового языка нет необходимости заботиться о проблемах обратной совместимости, которые обычно заметно затрудняют исправление застарелых проблем и даже внесение новых свойств в стандарт языка (подробное описание трудностей, возникающих при расширении старого языка программирования, можно прочитать в книге Б. Страуструпа "Дизайн и эволюция языка С++", М.: ДМК, 2000).

Таким образом, C# представляет собой новый язык программирования, ориентированный на разработку для платформы .NET и пригодный как для быстрого прототипирования приложений, так и для разработки крупномасштабных приложений.

   3.4 Простота C#

Многие существующие языки программирования обладают весьма запутанным синтаксисом и конструкциями с неочевидной семантикой.

C# занимает некоторую промежуточную позицию: из стандарта языка убраны наиболее неприятные и неоднозначные особенности С++, но в то же время язык сохранил мощные выразительные возможности, присущие для таких языков, как С++, Java или VB.

Укажем некоторые особенности языка С++, которые не поддерживаются C#:

По умолчанию, С# запрещает прямое манипулирование памятью, предоставляя взамен богатую систему типов и сборку мусора. Непосредственная работа с памятью по-прежнему доступна в специальном режиме "опасного" кода (об этом см. ниже), но требует явного декларирования. Как следствие, в C# активно используется всего один оператор доступа ".".

Преобразования типов в C# значительно строже, чем в С++, в частности, большинство преобразований может быть совершено только явным образом. Кроме того, все приведения должны быть безопасными (т.е. запрещены неявные преобразования с переполнением, использование целых переменных как указателей и т.п.). Естественно,  это заметно упрощает анализ типов при компиляции.

Одной из типичных ошибок в С++ было отсутствие оператора break при обработке одной из веток оператора switch. Проблема "провала" (fall-through) в C# решена кардинальным образом: компилятор требует наличия явного оператора перехода (break или gotocase<name>) в любой ветке

В C#, как и в Java, нет множественного наследования, вместо него предлагается использовать реализацию нескольких интерфейсов. Несмотря на то, что мнения по поводу множественного наследования сильно разнятся, отсутствие этого механизма в C# должно по крайней мере облегчить разработку компилятора

   3.5 Управляющие конструкции C#

• C# содержит традиционный набор императивных конструкций:

– Присваивания

– Операторы ветвления (if-then-else, switch)

– Циклы (do-while, for, foreach)

– Исключения (try-catch-finally, throw)

Большинство современных языков программирования содержит приблизительно одинаковый набор конструкций управления и C# не предлагает в этой области ничего радикально нового.

ВС# используются обычные присваивания для простых переменных; структурные или массовые присваивания не поддерживаются.

Операторы ветвления тоже достаточно традиционны (if, switch), но обладают двумя особенностями. Во-первых, условие в операторе if должно вырабатывать именно булевское значение (т.е. целого значения, вырабатываемого при присваивании недостаточно), а во-вторых, каждая ветка case внутри оператора switch должна содержать явное указание о дальнейшем потоке управления (т.е. либо break, либо goto на какую-то переменную, например, на метку другой ветки).

Что касается циклов, то С# поддерживает вполне традиционные циклы, такие как dowhile, while-do и циклы с итерацией for, но помимо этого, поддерживает перебор массивов и коллекций с помощью оператора foreach.

Наконец, C# поддерживает структурную обработку исключений с помощью конструкций try, catch и finally. Исключения можно генерировать и явным образом с помощью конструкции throw.

Типы-значения в C#

• Типы данных в C# разделяются на ссылочные типы и типы-значения

• К типам-значениям относятся:

– Простые

• целочисленные (int - 32 бита, long - 64 бита)

• char (16 бит, Unicode)

• типы с плавающей точкой (могут выдавать обычные значения, +0, -0, +∞, -∞, NaN)

• decimal (128-бит, с точностью до 28 знаков)

– Структурные

– Перечислимые: enumDays{ Mon=1, Tue … }, по умолчанию типа int

Типы данных

Система типов C# полностью отражает систему типов .NET и в целом достаточно типична для современных языков. Важная особенность этой системы типов заключается в явном разделении всех типов на типы-значения и ссылочные типы.

К типам-значениям относится широкий набор примитивных типов данных, включая целые числа различной разрядности, типы с плавающей запятой различной точности, специальный тип decimal с фиксированной точностью, предназначенный для финансовых вычислений, а также символьный тип char, способный хранить символы в формате Unicode и потому удобный при разработке интернациональных приложений. Все целочисленные типы существуют в двух вариантах: знаковом и беззнаковом. Важной

особенностью переменных с плавающей запятой является то, что операции над ними никогда не производят исключений, но зато результатом работы с ними могут быть значения ±∞ (как результат деления на ноль) или нечисловым значением, NaN (Not-ANumber, как результат деления 0 на 0 или операций, в котором один из операндов уже равняется NaN).

Отметим, что C# содержит также специальный тип для булевских значений; переменные булевского типа могут содержать значения true или false, но в отличие от большинства современных языков программирования этим значениям не соответствует никаких численных эквивалентов (в отличие, скажем, от VB, где False соответствует 0, а True

почему-то соответствует значение -1).

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

Ссылочные типы

• Тип object (для упаковки значений)

• Тип class

• Интерфейсы

• Представители (delegates)

• Тип string

• Массивы

Все ссылочные типы произведены от базового типа object, являющегося точным эквивалентом класса System.Object. Сам по себе тип object в основном используется для упаковки значений, подробно обсуждавшейся выше. Другая, более важная роль типа object заключается в том, что он является корнем для всей иерархии объектов в .NET и по умолчанию все классы унаследованы именно от System.Object. Классы могут иметь свои поля, методы, реализовывать интерфейсы и т.п. Так как классы представляют собой

основной механизм организации программ и данных в C#.

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

Представители (delegates) являются относительно безопасной версией указателей на функции: окружение .NET гарантирует, что представители указывают именно на допустимый объект, а не просто на некоторый адрес в памяти. Основные области применения представителей — это методы обратного вызова и асинхронные обработчики событий.

Строки в C# являются полноценным ссылочным типом, но при этом обладают

семантикой сравнений, характерной для типов-значений (т.е. строки равны, если равны их значения). Это можно проиллюстрировать следующим примером:

stringstr1 = "Hello World"; stringstr2 = "Hello " + "World";

if (str1 == str2)

System.Console.WriteLine ("Strings are equal"); // will be executed

Массивы в С# бывают двух типов: многомерные (например, int [,,] определяет

трехмерный массив) и невыровненные (они же массивы массивов, используемые в С++; например, int [] [] определяет двухмерный массив). Несмотря на простой внешний вид, массивы являются полноценными объектами, представляющими класс System.Array.

Классы

• Модификаторы доступа

• Конструкторы/деструкторы

• Методы объектов и их параметры

• Свойства (properties) и доступ к ним

• Индексаторы

• События (events) и представители (delegates)

             

3.6 Инструкция по эксплуатации.

Программный комплекс работает в 2 этапа следующим образом:

  1.  Обучение системы распознавания (приложение 2, рис. 1, рис. 2).
  •  При нажатии кнопки “Загрузить изображение” (приложение 2, рис. 2), выбирается изображение которому будет обучаться система.
  •  Затем выбирается фрагмент на всем изображении, которому система будет обучаться для дальнейшего поиска. Нажимается кнопка Обучение (приложение 2, рис. 2).
  •  После обучения системы выдается сообщение, о том что “Обучение завершено”.
  •  Систему можно сохранить, нажав при этом кнопку “Сохранить”.
  1.  Поиск фрагментов на изображении.
  •  На полном изображении выбирается нужный нам фрагмент.
  •   Кнопка “Распознавание” (приложение 2, рис. 4) позволяет получить вероятность того, что выбран фрагмент нужный нам (вероятность от -1 до +1).
  •  Кнопка “Погрешность” (приложение 2, рис. 4) заставляет выделять участки, в которых сеть не уверенна на 100%.
  •  Кнопка “Поиск” (приложение 2, рис. 4) последовательно перебирает всё изображение и выделяет те участки, которые сеть опознала на 100% (их может быть несколько).
  •  При завершении поиска, программа показывает, все фрагменты найденные на изображении с учетом погрешности.

Глава 4. Экспериментальная часть.

  4.1 Эксперимент.

Для проведения сравнительного анализа, проверки адекватности выбранной математической  модели и эффективности разработанного программного комплекса была проведена серия экспериментов.

Для эксперимента использовался ПК со следующими характеристиками:

Pentium(R) 4 3.0 Ггц, NVIDIA GeForce 210 1024Мб, ОЗУ 4 Гб, ОС Windows 7 – 32 bit.

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

В первой подсерии экспериметов происходил поиск количества объектов в зависимости от качества изображения начиная с 25 до 100 пикселей.

Кач-во изображения

Кол-во найденных объектов

25

111

30

167

35

535

40

643

45

876

50

264

60

3933

80

1392

100

1360

Рис.3.1Зависимость количества найденных объектов от                        размера изображения.

Во второй подсерии экспериментов подсчитывалось время поиска объектов в зависимости от качества изображения начиная с 25 до 100 пикселей.

Кач-во изображения

Время поиска объектов

25

338

30

288

35

402

40

247

45

342

50

542

60

497

80

796

100

1143

  Рис. 3.2 Зависимость времени поиска от размера изображения.

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

Кач-во изображения

Время обучения системы

25

1066

30

889

35

1528

40

1083

45

1086

50

1247

60

1635

80

2946

100

3497

Рис. 3.3 Зависимость времени обучения от размера изображения.


Заключение

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

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

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

Список литературы

  1.  Гроппен В.О. Принципы оценки качества многокритериальных оптимизационных задач с помощью эталонов //Устойчивое развитие горных территорий: проблемы и перспективы интеграции науки и образования. Материалы V международной конференции. Владикавказ: Издательство «Терек», 2011. С. 572-580.
  2.  Гроппен В.О. «Таксонометрия». //электронный учебник.
  3.  Jadhav S.D., Barbadekar A.B., prof.(Dr.) Patil S.P. Euclidean Distance Based Fingerprint Matching. (Из материалов конференции WSEAS. pp. 148-153).
  4.  Dr. Gary Rost Bradski, Adrian Kaehler. Learning OpenCV. O'Reilly Media, Inc. 2008.
  5.  Елкина В. Н., Загоруйко Н. Г., Тимеркаев В. С. Алгоритмы таксономии в информатике //Информатика и ее проблемы. – Новосибирск: Наука, 2012. - №4 – с. 31—37.
  6.  Загоруйко Н.Г. Гипотеза компактности и l-компактности в методах анализа данных //Сибирский журнал индустриальной математики. Изд. ИМ СО РАН. Том 1, N1, 1998. С.114–126.
  7.  Головко В.А. Нейроинтеллект: Теория и применения. Книга 1. Организация и обучение нейронных сетей с прямыми и обратными связями - Брест:БПИ, 2009, - 260с.
  8.  Belhumeur P. N., Hespanha J. P. and Kriegman D. J. Eigenfaces vs Fisherfaces: Recognition Using Class Specific Linear Projection. IEEE Transactions on Pattern Analysis and Machine Intelligence 1997, Vol. 19, pp. 711-720.
  9.  Wiskott L., Fellous J.-M., Krueger N and Malsburg C. Face Recognition by Elastic Bunch Graph Matching. IEEE Transactions on Pattern Analysis and Machine Intelligence 1997, Vol. 19, pp. 775-779.
  10.  Rabiner L. R. A tutorial on Hidden Markov Models and selected applications in speech recognition // Proceedings of the IEEE, 1989. – Vol. 77(2). – P. 257-285.
  11.  Ежов А.А., Шумский С.А. – Нейрокомпьютинг и его применения в экономике и бизнесе. – Москва, 2008.
  12.  Вороновский Г.К., Махотило К.В., Петрашев С.Н., Сергеев С.А. – Генетические алгоритмы, искусственные нейронные сети и проблемы виртуальной реальности. – Харьков:Основа, 2012.
  13.  Нейроинформатика / А.Н. Горбань, В.Л. Дунин-Барковский, А.Н. Кирдин и др. – Новосибирск: Наука. Сибирское предприятие РАН, 1998.
  14.  Moghaddam B. and Pentland A. Probabilistic Visual Learning for Object Representation. IEEE Transactions on Pattern Analysis and Machine Intelligence 1997, Vol. 19, pp. 696-710.
  15.  Brunelli R., Poggio T. Face recognition: features versus templates // IEEE Transactions on Pattern Analysis and Machine Intelligence, 2009. – Vol. 15. – No 10. – P. 235-241.
  16.  Ноткин Л.И. Искусственный интеллект и проблемы обучения.
  17.  Чернухин Ю. В. Нейропроцессоры – Таганрог, 2011.
  18.  Эндрю А. Искусственный интеллект – М.: Мир, 2007.
  19.  Соколов Е. Н., Вайткявичус Г.Г. Нейроинтеллект: от нейрона к нейрокомпьютеру – М.: Наука, 2009

Приложение 1. Листинг программы

Листинг 1. Ядро программы

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace neuroProject

{

   

   public partial class Form1 : Form

   {

       public bool blockForm;//Блокирует форму во время поиска и обучения

       

       const int imgSize = 50;//Картинка 50х50

       Bitmap bmp;//Текущая картинка

       Bitmap templateBMP;//Образец для обучения

       Bitmap knownBMP;//Образец, на который обучена сеть

       int img_x, img_y;//Координаты верхнего угла картинки

       //***сеть***

       //слой сенсоров

       cSensorLayer sens;

       //слои нейронов

       cNeuronLayer neur1;

       cNeuronLayer neur2;

       cNeuronLayer neur3;

       cNeuronLayer neur4;

       cNeuronLayer lastNeur;

       public Form1()

       {

           InitializeComponent();

           blockForm = false;

       }

       private void button1_Click(object sender, EventArgs e)

       {

           if (blockForm) return; //Идёт работа, реагировать на кнопки нельзя

           

           //Загрузка изображения

           

           openFileDialog1.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif|All files (*.*)|*.*";

           if (openFileDialog1.ShowDialog() == DialogResult.OK)

           {

               pictureBox1.ImageLocation = openFileDialog1.FileName;

                   

           }

       }

       private void pictureBox1_MouseUp(object sender, MouseEventArgs e)

       {

           if (blockForm) return; //Идёт работа, реагировать на кнопки нельзя

           //Выделяем объект для обучения

           img_x = e.X;

           img_y = e.Y;

           pictureBox1.Refresh();

           bmp = new Bitmap( pictureBox1.Width,pictureBox1.Height);

           templateBMP = new Bitmap(imgSize, imgSize);

           pictureBox1.DrawToBitmap(bmp, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height));

           Graphics grph = Graphics.FromImage(templateBMP);

           grph.DrawImage(bmp, -img_x, -img_y);

           pictureBox2.Image = templateBMP;

           

       }

       private void pictureBox1_Paint(object sender, PaintEventArgs e)

       {

           //Рисуем рамку выделения

           Graphics graph = e.Graphics;

           graph.DrawRectangle(new Pen(Color.Black), img_x, img_y, imgSize, imgSize);

           graph.DrawRectangle(new Pen(Color.White), img_x - 1, img_y - 1, imgSize + 2, imgSize + 2);

       }

       //работа с нейронной сетью

       private void Form1_Load(object sender, EventArgs e)

       {

           //инициализация нейронной сети

           sens = new cSensorLayer(imgSize * imgSize);

           neur1 = new cNeuronLayer(sens, 100);

           neur2 = new cNeuronLayer(neur1, 2);//Два нейрона вместо одного. второй нужен для обучения, чтобы веса всей сети менялись более хаотично.

           lastNeur = neur2;//Это последний слой

           lastNeur.init();//Инициализация весов сети случайными небольшими величинами

       }

       

       private void button2_Click(object sender, EventArgs e)

       {

           if (blockForm) return; //Идёт работа, реагировать на кнопки нельзя

           DateTime dt = DateTime.Now;

           //Обучение

           labelProgress.Text = "Обучение";

           lastNeur.init();

           knownBMP = templateBMP;

           Random rnd = new Random();

           int x, y;

           double learnFactor;

           blockForm = true;

           progressBar1.Maximum = 20000;

           for (int i = 1; i < 20000; i++)

           {

               learnFactor = 3/(double)i;

               if (i % 100 == 0)

               {

                   progressBar1.Value = i;

                   Application.DoEvents();

               }

               if (rnd.Next(100) - rnd.Next(300) < 0)//В 2/3 случаев обучаем на отридцательных примерах

               {

                   do//выбор случайного образца для обучения(негативного)

                   {

                       x = rnd.Next(bmp.Size.Height-imgSize);

                       y = rnd.Next(bmp.Size.Width-imgSize);

                   }

                   while (Math.Abs(x - img_x) < imgSize && Math.Abs(y - img_y) < imgSize);

                   templateBMP = new Bitmap(imgSize, imgSize);

                   Graphics grph = Graphics.FromImage(templateBMP);

                   grph.DrawImage(bmp, -x, -y);

                   Look(templateBMP);

                   teach(false, learnFactor);

               }

               else

               {

                   Look(knownBMP);

                   teach(true, learnFactor);

               }

           }

           pictureBox3.Image = knownBMP;

           blockForm = false;

           MessageBox.Show("Обучение закончено.");

           DateTime td = DateTime.Now;

           MessageBox.Show((td - dt).TotalSeconds.ToString());

       }

       private void button3_Click(object sender, EventArgs e)

       {

           if (blockForm) return; //Идёт работа, реагировать на кнопки нельзя

           

           //Распознавание

           Look(templateBMP);

           MessageBox.Show(lastNeur.neurons[0].State.ToString(), "результат работы");

       }

       //передать изображение на сенсоры(нейросеть смотрит на картинку)

       private void Look(Bitmap lookingBMP)

       {

           int k = 0;//счётчик сенсоров

           for (int i = 0; imgSize > i; i++)

               for (int j = 0; imgSize > j; j++, k++)

                   sens.Outs[k].getPixel(lookingBMP.GetPixel(i, j));

       }

       private void teach(bool positive, double learnFactor)

       {

           double delta;

           if (positive)

               delta = 1;

           else

               delta = -1;

           double err = delta - lastNeur.Outs[0].State;

           lastNeur.startBackProp(err, learnFactor);

       }

       private void button4_Click(object sender, EventArgs e)

       {

           if (blockForm) return; //Идёт работа, реагировать на кнопки нельзя

           //Сохранение

           if (saveFileDialog1.ShowDialog() != DialogResult.OK)

               return;

           try

           {

               //Веса первого слоя

               using (var writer = new BinaryWriter(File.OpenWrite(saveFileDialog1.FileName)))

               {

                   for (int i = 0; i < neur1.Count; i++)

                       for (int j = 0; j < sens.Count; j++)

                           writer.Write(neur1.neurons[i].weights[j]);

                   for (int i = 0; i < neur2.Count; i++)

                       for (int j = 0; j < neur1.Count; j++)

                           writer.Write(neur2.neurons[i].weights[j]);

               }

               knownBMP.Save(saveFileDialog1.FileName + ".bmp");

           }

           catch (Exception)

           {

               MessageBox.Show("Ошибка сохранения файла");

           }

       }

       private void button5_Click(object sender, EventArgs e)

       {

           if (blockForm) return; //Идёт работа, реагировать на кнопки нельзя

           DateTime dt = DateTime.Now;

           double tolerance;//допустимая погрешность

           tolerance = Convert.ToDouble(comboBox1.Text)/100;

           //Поиск

           blockForm = true;

           labelProgress.Text = "Поиск";

           bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);

           Bitmap bmp2 = new Bitmap(pictureBox1.Width, pictureBox1.Height);

           pictureBox1.DrawToBitmap(bmp, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height));

           pictureBox1.DrawToBitmap(bmp2, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height));

           progressBar1.Maximum = (bmp.Size.Width-imgSize)*(bmp.Size.Height);

           Graphics graph2 = Graphics.FromHwnd(pictureBox1.Handle);

           Graphics graph = Graphics.FromImage(bmp2);

           int fragmentFound = 0;

           int y = 0;

           for (int x = 1; x < bmp.Size.Width - imgSize; x += 5)

           {

               progressBar1.Value = x * y;

               Application.DoEvents();

               for (y = 1; y < bmp.Size.Height - imgSize; y += 5)

               {

                   Bitmap tempBMP = new Bitmap(imgSize, imgSize);

                   Graphics grph = Graphics.FromImage(tempBMP);

                   grph.DrawImage(bmp, -x, -y);

                   Look(tempBMP);

                   if (lastNeur.neurons[0].State >= 1-tolerance)

                   {

                       //Рисуем рамку выделения

                       graph2.DrawRectangle(new Pen(Color.Red), x, y, imgSize, imgSize);

                       graph2.DrawRectangle(new Pen(Color.Blue), x - 1, y - 1, imgSize + 2, imgSize + 2);

                       graph.DrawRectangle(new Pen(Color.Red), x, y, imgSize, imgSize);

                       graph.DrawRectangle(new Pen(Color.Blue), x - 1, y - 1, imgSize + 2, imgSize + 2);

                       pictureBox2.Image = tempBMP;

                       fragmentFound++;

                   }

               }

           }

           progressBar1.Value = progressBar1.Maximum;

           Form2 frm = new Form2();

           frm.pictureBox3.Image = pictureBox3.Image;

           frm.pictureBox1.Image = bmp2;

           frm.label4.Text = comboBox1.Text + "%";

           frm.label5.Text = fragmentFound.ToString();

           frm.ShowDialog();            

           

           blockForm = false;

           DateTime td = DateTime.Now;

           MessageBox.Show((td - dt).TotalSeconds.ToString());

       }

       private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)

       {

       }

       private void button6_Click(object sender, EventArgs e)

       {

           //Загрузка

           if (blockForm) return; //Идёт работа, реагировать на кнопки нельзя

           openFileDialog1.Filter = "Saved net files (*.net)|*.net|All files (*.*)|*.*";

           if (openFileDialog1.ShowDialog() != DialogResult.OK)

               return;

           try

           {

               //Веса первого слоя

               using (var reader = new BinaryReader(File.OpenRead(openFileDialog1.FileName)))

               {

                   for (int i = 0; i < neur1.Count; i++)

                       for (int j = 0; j < sens.Count; j++)

                           neur1.neurons[i].weights[j] = reader.ReadDouble();

                   for (int i = 0; i < neur2.Count; i++)

                       for (int j = 0; j < neur1.Count; j++)

                           neur2.neurons[i].weights[j] = reader.ReadDouble();

               }

               knownBMP = new Bitmap(openFileDialog1.FileName + ".bmp");

               pictureBox3.Image = knownBMP;

           }

           catch (Exception)

           {

               MessageBox.Show("Ошибка чтения файла.");

           }

       }

   }

}

Листинг 2. Класс, описывающий слои модели нейронной сети

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace neuroProject

{

   //Интерфейс для слоев чтобы одинаково работать со слоями нейронов и сенсоров

   public interface iLayer

   {

       //выходы слоя

       cSensor[] Outs { get;}

       //Кол-во выходов слоя

       int Count { get; set; }

           

       //метод для обратного распространения ошибки

       void backProp(double learnFactor);

       //очистка весов

       void init();

   }

}

Листинг 3. Класс cSensor, описывающий слой нейронов, получающих сигнал

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing;

namespace neuroProject

{

   //Сенсор реагирует на изображение(яркость от 0 до 255)

   //Как только сенсор получает сигнал он посылает событие.

   public class cSensor

   {

       public delegate void outData(cSensor sensor);

       public event outData ChangeState;

       //Номер 

       private int number = 0;

       public int Number

       {

           get { return number; }

           set { number = value; }

       }

       //состояние

       private double state = 0;

       public double State

       {

           get { return state; }

           set

           {

               state = value;

               if (ChangeState != null)

               {

                   ChangeState(this);

               }

           }

       }

       public double Err { get; set; }//ошибка нейрона(Нужно здесь для передачи ошибки нейронам)

       //сенсор чувствует пиксель

       public void getPixel(Color color)

       {

           double res = (color.R + color.G + color.B);

           res = (127 - res/3) / 127;

           State = res;//состояние в диапазоне -1..+1

       }

       public cSensor(int number = 0)

       {

           this.number = number;

       }

   }

   //слой сенсоров

   public class cSensorLayer : iLayer

   {

       private cSensor[] sensors;

       public cSensor[] Outs

       {

           get { return sensors; }

       }

       public int Count { get; set; }

       public cSensorLayer(int Count = 1296)//Картинка 36х36 пикселей по умолчанию

       {

           this.Count = Count;

           sensors = new cSensor[Count];

           //Создание сенсоров и присвоение им номеров

           for (int i = 0; i < Count; i++)

               sensors[i] = new cSensor(i);

       }

       //Пустой метод, поскольку сенсорам не надо обучаться

       public void backProp(double learnFactor)

       {

       }

       //Пустой метод инициализации

       public void init()

       {

       }

   }

}

Листинг 4. Класс cNeuros, описывающие модели нейронов внутренних слоев

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace neuroProject

{

   //Нейрон это будет сенсор с расширенной функциональностью

   public class cNeuron: cSensor

   {

       //Здесь уже есть номер элемента и состояние элемента

       //(от предка сенсора)

       public double Sum { get; set; }//сумма входов

       public double[] weights;//веса

       

       public int dendriteCount;//кол-во подключенных дендритов(принимающих сигналы)

       int signalsCount;//Кол-во пришедших сигналов

       //конструктор

       public cNeuron(int number, int dendriteCount)

       {

           Number = number;

           this.dendriteCount = dendriteCount;

           signalsCount = 0;

           Sum = 0;

           Err = 0;

           Random RND = new Random();

           weights = new double[dendriteCount];

           for (int i = 0; i < dendriteCount; i++)

               weights[i] = (double)RND.Next() - (double)RND.Next();

       }

       //Принимает данные от предыдущего слоя нейронов

       public void getData(cSensor sensor)

       {

           signalsCount++;

           Sum += sensor.State * weights[sensor.Number];

           if (dendriteCount == signalsCount)//Пришли все сигналы

           {

               State = activateFunc(Sum);//Нормализация и отправка сигнала

               signalsCount = 0;

               Sum = 0;

           }

       }

       //Функция активации(чтобы сигнал был в пределах [1;-1])

       public double activateFunc(double summ)//функция активации - гиперболический тангенс(нужна для нормализации сигнала)

       {

           double res;

           if (summ > 200)

               res = 1;

           else if (summ < -200)

               res = -1;

           else

           {

               double a, b;

               a = Math.Exp(summ);

               b = Math.Exp(-summ);

               res = (a - b) / (a + b);

           }                 

           return res;

       }

   }

   //слой нейронов

   public class cNeuronLayer : iLayer

   {

       iLayer prevLayer;

       public cNeuron[] neurons;//нейроны этого слоя

       public cSensor[] Outs //предыдущий слой нейронов работает как сенсоры для этого слоя

       {

           get {return neurons; }

       }

       //Начало обратного распространения ошибки(должен вызываться только для последнего слоя)

       //learnFactor - коэффициент обучения

       public void startBackProp(double err, double learnFactor)

       {

           neurons[0].Err = err;

           Random rnd = new Random();

           for (int j = 0; j < Count; j++)

           {

               if (j != 0)

                   neurons[j].Err = (rnd.Next(200) - 100) / 100;//Шум на дополнительные выходные нейроны

               for (int i = 0; i < neurons[j].dendriteCount; i++)

               {

                   //отправка ошибки предыдущему слою

                   prevLayer.Outs[i].Err = neurons[j].Err * neurons[j].weights[i];

                   //корректировка всесов

                   neurons[j].weights[i] += neurons[j].Err * learnFactor * prevLayer.Outs[i].State;

               }

           }

           prevLayer.backProp(learnFactor);

       }

       //Продолжение обратного распространения

       public void backProp(double learnFactor)

       {

           //Обнуление ошибок предыдущего слоя

           for (int i = 0; i < prevLayer.Count; i++)

           {

               prevLayer.Outs[i].Err = 0;

           }

           

           //Все нейроны этого слоя

           for (int j = 0; j < Count; j++)

               for (int i = 0; i < neurons[j].dendriteCount; i++)

               {

                   //отправка ошибки предыдущему слою

                   prevLayer.Outs[i].Err = neurons[j].Err * neurons[j].weights[i];

                   //корректировка всесов

                   neurons[j].weights[i] += neurons[j].Err * learnFactor * prevLayer.Outs[i].State;

               }

           prevLayer.backProp(learnFactor);

       }

       //Количество нейронов

       public int Count { get; set; }

       //Инициализация

       public void init()

       {

           Random RND = new Random();

           //Присвоение номеров нейронам

           for (int i = 0; i < Count; i++)

           {

               for (int j = 0; j < prevLayer.Count; j++)

                   neurons[i].weights[j] = (double)RND.Next(100000) / 100000 - 0.5;

           }

           prevLayer.init();

       }

       //конструктор слоя

       public cNeuronLayer(iLayer prevLayer, int NeuronCount)

       {

           this.prevLayer = prevLayer;

           Count = NeuronCount;

           neurons = new cNeuron[Count];

           Random RND = new Random();

           //Присвоение номеров нейронам

           for (int i = 0; i < Count; i++)

           {

               neurons[i] = new cNeuron(i, prevLayer.Count);

               for (int j = 0; j < prevLayer.Count; j++)

               {

                   //подписываемся на события пердыдущего слоя

                   prevLayer.Outs[j].ChangeState += new cSensor.outData(neurons[i].getData);

               }

           }

       }

   }

}

Приложение 2. Интерфейс программного комплекса

Рис. 1. Интерфейс программного продукта

Рис. 2. Кнопки запуска обучения и загрузки изображения

Рис.3. Фрагменты изображения.

Рис.4. Кнопки запуска поиска и распознавания фрагмента

PAGE 71

Σ

 f

S

y

x1

x3

x2

.

.

.

xn

w1

w3

w2

.

.

.

wn

EMBED Equation.3  

 1

S

0

0

S



 

Другие похожие работы, которые могут вас заинтересовать.
7800. Использование данных мониторинга для прогнозирования показателей разработки при заводнении и оценки эффективности технологических мероприятий 968.65 KB
  Характеристика вытеснения – однофакторная линеаризованная зависимость накопленной добычи нефти от накопленной добычи жидкости или от накопленной добычи воды которая имеет границы применимости в определенном диапазоне промысловых параметров. Параметры характеристик вытеснения определяются по данным ретроспективного периода. Начало ретроспективного периода соответствует обводненности продукции скважин после прорыва фронта вытеснения и может определяться по функции БаклиЛеверетта для однородного пласта. Последний участок длится...
20569. Программа классификации психофизиологической двигательной активности человека, основанная на нейронной сети глубокого обучения 1.07 MB
  В качестве данных для классификации используется Motion History Imge построенный из силуэтов человека с датчика глубины сенсора Kinect. Deep lerning глубокое обучение – общее название для набора алгоритмов машинного обучения для моделирования сложных абстракций из входных данных. Kinect v2 он же Kinect for Xbox One – бесконтактный сенсорный игровой контроллер последней версии выпущенный для игровой приставки Xbox One. Для работы с персональным компьютером на операционной системе Windows дополнительно используется адаптер.
16054. Методика оценки эффективности инвестиционного проекта 863.06 KB
  Вложение инвестором собственного или заемного денежного капитала для достижения предпринимательских целей связанных с получение прибыли дохода называется инвестициями. Управление проектами не является изобретением новейшего времени.
12138. Методика оценки эффективности инвестиционных проектов 17.36 KB
  Система методологических и методических положений и практических рекомендаций позволяющая оценивать общественную коммерческую и бюджетную эффективность инвестиционных проектов в реальном секторе в условиях нестационарной российской экономики. Является результатом дальнейшего совершенствования ранее разработанных при участии авторов утвержденных двух редакций Методических рекомендаций по оценке эффективности инвестиционных проектов. Учитывает такие особенности проектов как множественность участников имеющих несовпадающие интересы систему...
18476. Методы оценки эффективности инвестиционных проектов 105.75 KB
  Разработка инвестиционного проекта. Принятие решений по инвестиционным проектам. Жизненный цикл инвестиционного проекта. Разработка инвестиционно-строительного проекта жилищно-коммерческого комплекса...
19886. ИСПОЛЬЗОВАНИЕ OLE-ТЕХНОЛОГИИ ПРИ СОЗДАНИИ GUI ИНТЕРФЕЙСА ПРИЛОЖЕНИЯ – МОДЕЛИ 138.1 KB
  Понятие OLE-технологии и ее использование. Целью курсовой работы является создание GUI интерфейса приложения – модели используя OLE-технологии. Исходя из указанной цели можно выделить задачи поставленные в курсовой работе: – разработка GUI интерфейса приложения; – изучение OLE-технологий; – разработка и запуск приложения – модели.
20620. Методы и инструменты оценки эффективности инвестиционных проектов 1.32 MB
  Инструменты для финансового моделирования и оценки эффективности.3 Расчет рыночного мультипликатора для отрасли. Другими словами в первую очередь не бывает инвестиций без затрат то есть чтобы для начала нужно средства вложить и только потом если все было сделано верно все расчеты корректны все вложенные средства окупятся. Цель исследования - моделирование развития инвестиционного проекта создания розничной сети пекарен и определение мультипликатора в заданной отрасли для оценки стоимости моделируемого проекта.
21587. Финансовые методы оценки эффективности инвестиционных проектов 97.97 KB
  Инвестиционная деятельность в той или иной степени присуща любому предприятию. Она представляет собой один из наиболее важных аспектов функционирования любой коммерческой организации. Поэтому значение экономического анализа для планирования и осуществления инвестиционной деятельности трудно переоценить. Особую важность имеет предварительный анализ, который проводится на стадии разработки инвестиционных проектов и способствует принятию разумных и обоснованных управленческих решений.
20984. ЗАРУБЕЖНЫЕ МОДЕЛИ МОТИВАЦИИ И СТИМУЛИРОВАНИЯ ПЕРСОНАЛА И ИХ ИСПОЛЬЗОВАНИЕ В РОССИИ 125.9 KB
  Сегодня предприятиям предоставлено право самостоятельно разрабатывать и внедрять мотивационные системы, эффективность функционирования которых во многом определяется принципами их построения. Повысить эффективность производства и добиться конкурентоспособности можно быстрее, если использовать богатый зарубежный опыт Японии, Европы, США. Решению данной проблемы призвана служить данная выпускная квалификационная работа.
16612. Использование дистанционного стресс-тестирования кредитных организаций для оценки системных эффектов от ужесточения пруденциального регулирования 13.1 KB
  Появление признаков проблемной ситуации в банковском секторе не могло не вызвать реакции органов надзора и денежно-кредитного регулирования. В течение последних двух лет Банк России и органы исполнительной власти разработали пакет нормативно-регулятивных и законодательных новаций, направленных на удержание банков от проведения рискованных активных операций, создание механизмов противодействия недобросовестному поведению собственников и снижение уязвимости системно-значимых банков
© "REFLEADER" http://refleader.ru/
Все права на сайт и размещенные работы
защищены законом об авторском праве.