Критерии выбора признаков в задаче классификации изображений

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 06.06.2015
Размер файла 1,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Содержание

  • Введение
  • 1. Основные понятия и определения нейронных сетей и классификации изображений
  • 1.1 Методы классификации изображений
  • 1.2 Понятие нейронной сети
  • 1.3 Сверточныенейронные сети
  • 1.4 Слои свертки, субдискретизации и полносвязные слои. Полносвязный слой
  • 1.5 Существующие реализации нейронных сетей
  • 2. Методы оптимизации работы нейронной сети
  • 2.1 Стохастический подход, пакетный и подход мини-партий
  • 2.2 Методы обучения
  • 2.3 Предварительная подготовка данных для улучшения качества обучения нейронной сети
  • Горизонтальный поворот
  • Перемешивание обучающих примеров
  • Деформация изображения
  • 3. Описание интерфейса программной реализации решения задачи классификации изображений
  • 3.1 База изображений CIFAR - 10
  • 3.2 Интерфейс программы
  • Режим тренировки
  • 3.3 Топология сети
  • 4. Решение задачи распознания изображений реальных объектов базы CIFAR-10
  • Заключение
  • Список литературы

Введение

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

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

изображение нейронная сеть оптимизация

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

Цель моей дипломной работы: реализовать сверточную нейронную сеть, способную решить задачу о классификации изображений, а именно на предоставленной библиотеке изображений CIFAR-10, включающей в себя изображения, относящиеся к 10 классам, пройти обучение на 50 000 тренировочных картинок и на основании полученных знаний с некоторой точностью классифицировать оставшиеся 10 000.

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

Данный метод имеет некоторые ограничения связанные с топологией предоставляемых ему изображений, однако, предоставленная база CIFAR-10 имеет стандартизированный размер картинок - 32х32, что делает возможным его применение.

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

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

1. Основные понятия и определения нейронных сетей и классификации изображений

1.1 Методы классификации изображений

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

Классический алгоритм Хафа или преобразование Хафа - это численный метод обнаружения прямых и кривых линий на полутоновых или цветных изображениях. Используется в анализе изображений, цифровой обработке изображений и компьютерном зрении. Метод позволяет указать параметры семейства кривых и обеспечивает поиск на изображении множества кривых заданного семейства. В алгоритме преобразования Хафа используется аккумуляторный массив, размерность которого соответствует количеству неизвестных параметров в уравнении семейства искомых кривых. Этот массив используется для проверки каждого пиксела изображения и его окрестности. Определяется присутствует ли в данном пикселе выраженный край. Если присутствует, то вычисляются параметры искомой кривой, проходящей через данный пиксел. После оценки параметров прямой в данном пикселе они дискретизируются для получения соответствующих значений неизвестных параметров, и значение аккумулирующего массива увеличивается. После обработки всех пикселов выполняется поиск локальных максимумов в аккумуляторном массиве. Точки локальных максимумов соответствуют параметрам наиболее вероятных прямых на изображении. Подытожив можно сказать, что этот алгоритм позволяет находить некоторые фигурные контуры, и, пожалуй, весьма хорош для задач распознавания лиц, классификации частей лица. [3]

Признаки Хаара - это признаки цифровых изображений, используемые в задачах распознавания изображений. Хотя в этой сфере скорее правильно будет упомянуть метод Виолы-Джонса (Viola-Jones), т.к. именно Виола и Джонс адаптировали идею использования вейвлетов Хаара, и разработали эту методику, которую впоследствии назвали вовсе не в честь них. Итак, простейший прямоугольный признак Хаара можно определить как разность сумм пикселей двух смежный областей внутри прямоугольника, который может занимать различные положения и масштабы на изображении. Такой вид признаков называется 2-прямоугольным. Пол Виола и Майкл Джонс так же определили 3-прямоугольные и 4-прямоугольные признаки. Каждый признак может показать наличие (или отсутствие) какой-либо конкретной характеристики изображения, такой как границы или изменение текстур. Например, 2-прямоугольный признак может показать, где находится граница между темным и светлым регионами. Этот метод безусловно можно считать одним из ведущих для поиска объектов на изображении в реальном времени. [4]

Что касается программного обеспечения, то оба метода реализованы библиотеками OpenCV - компьютерного зрения. Данная библиотека, это фактически библия для людей, занимающихся анализом изображений. Мы еще рассмотрим ее чуть позже в качестве ознакомления, однако в самом решении она участвовать не будет. [8]

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

1.2 Понятие нейронной сети

Нейронные сети - математические модели, а также их программные или аппаратные реализации, построенные по принципу организации и функционирования биологических нейронных сетей - сетей нервных клеток живого организма. [6]

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

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

Построение нейронных сетей можно условно разделить на 2 больших этапа:

1. Выбор типа (архитектуры) нейронной сети.

2. Подбор весов (обучение) нейронной сети

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

Уже несколько раз упоминались слои нейронной сети, поэтому стоит сказать и о них пару слов. В 1981 году Дэвид Хьюбел и ТорстенВизел получили Нобелевскую премию по физиологии и медицине за то, что открыли механизм действия нейронов в зрительной зоне коры головного мозга. Они показали, что в скрытых нейронных слоях последовательно извлекаются наиболее информативные свойства визуальных сигналов (например, резкие смены яркости или цветов, свидетельствующие о границах объекта), а потом складывают их в единое целое (собственно, объекты). [7] И так как по своей сути искусственные нейронные сети - это попытка смоделировать настоящий физиологический процесс, то данное открытие послужило новому витку в развитии машинных нейросетей, и служит прекрасным примером для понимания слоев системы. Всегда существует, как минимум, два слоя: входной и выходной. Если попытаться описать их с точки зрения человеческих глаз, то входной слой - это сенсорная система (глазные яблоки) получающая сигналы из внешнего мира и кодирующая их в удобную для прочтения форму, а выходной слой - это эффекторная система, посылающая сигналы "устройствам вывода данных". Помимо них в сети могут быть скрытые (внутренние) слои, на которых находятся нейроны не получающие ни информации извне системы, ни выдающие ее, на этих слоях нейроны взаимодействующие только с другими нейронами (Рис.1).

Рис. 1 Пути синапсов от глазного яблока

Обучить нейронную сеть - значит, сообщить ей, чего мы от нее добиваемся. Этот процесс очень похож на обучение ребенка алфавиту. Показав ребенку изображение буквы "А", мы спрашиваем его: "Какая это буква?" Если ответ неверен, мы сообщаем ребенку тот ответ, который мы хотели бы от него получить: "Это буква А". Ребенок запоминает этот пример вместе с верным ответом, то есть в его памяти происходят некоторые изменения в нужном направлении. Мы будем повторять процесс предъявления букв снова и снова до тех пор, когда все 33 буквы будут твердо запомнены. Такой процесс называют "обучение с учителем".

При обучении нейронной сети мы действуем совершенно аналогично. У нас имеется некоторая база данных, содержащая примеры (например набор рукописных изображений букв). Предъявляя изображение буквы "А" на вход нейронной сети, мы получаем от нее некоторый ответ, не обязательно верный. Нам известен и верный (желаемый) ответ - в данном случае нам хотелось бы, чтобы на выходе нейронной сети с меткой "А" уровень сигнала был максимален. Обычно в качестве желаемого выхода в задаче классификации берут набор (1, 0, 0,.), где 1 стоит на выходе с меткой "А", а 0 - на всех остальных выходах. Вычисляя разность между желаемым ответом и реальным ответом сети, мы получаем 33 числа - вектор ошибки. Одну и ту же букву (а также различные изображения одной и той же буквы) мы можем предъявлять нейронной сети много раз. В этом смысле обучение скорее напоминает повторение упражнений в спорте - тренировку.

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

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

Конечным этапом является применение нейронной сети. После того, как нейронная сеть обучена, мы можем применять ее для решения полезных задач. Важнейшая особенность человеческого мозга состоит в том, что, однажды обучившись определенному процессу, он может верно действовать и в тех ситуациях, в которых он не бывал в процессе обучения. Например, мы можем читать почти любой почерк, даже если видим его первый раз в жизни. Так же и нейронная сеть, грамотным образом обученная, может с большой вероятностью правильно реагировать на новые, не предъявленные ей ранее данные. Например, мы можем нарисовать букву "А" другим почерком, а затем предложить нашей нейронной сети классифицировать новое изображение. Веса обученной нейронной сети хранят достаточно много информации о сходстве и различиях букв, поэтому можно рассчитывать на правильный ответ и для нового варианта изображения. [8]

1.3 Сверточные нейронные сети

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

Рис.2 Полносвязная нейронная сеть

Для удобства сразу перейдем на пространство изображений. Представив данные об изображении 32х32 в виде вектора, чтобы подать на вход получим 1024 входа. Беря во внимание, что представление изображения с точки зрения индикаторов процесс сложный, можно понять, что одним скрытым слоем дело не обойдется, а также зная одну из рекомендаций по построению нейронных сетей о том, что количество нейронов на внутреннем слое должно быть больше на порядок числа входов, получаем число порядка 80-90 миллионов связей в общем для сети. Для каждой из таких связей будет вычисляться ошибка, тут становится ясно, что это действительно затратно с точки зрения операций. Однако самое страшное не это, а то что преобразовывая изображение в байтовое представление мы теряем взаимосвязь между отдельными частями изображения, и если изначально на входе этих потерь по большому счету нет, то с каждым слоем связь теряется все существеннее.

Решение этой проблемы было найдено американским ученым французского происхождения Яном ЛеКуном, вдохновленным работами нобелевских лауреатов в области медицины TorstenNilsWiesel и David H. Hubel. Эти ученые исследовали зрительную кору головного мозга кошки и обнаружили, что существуют так называемые простые клетки, которые особо сильно реагируют на прямые линии под разными углами и сложные клетки, которые реагирую на движение линий в одном направлении. Ян ЛеКун предложил использовать так называемые сверточные нейронные сети [5,18, 19].

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

Рис.3 Топология сверточной нейронной сети

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

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

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

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

1.4 Слои свертки, субдискретизации и полносвязные слои. Полносвязный слой

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

где - вход нейрона, - вес, сопоставленный этому входу, - порог чувствительности нейрона. Значение Out после такой обработки подавать на выход. Наиболее результативными считаются:

логистическая функция,

гиперболический тангенс .

Сигнал в системе имеет прямое распространение, проходя от входа к выходу.

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

(1)

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

Слой свертки

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

Рис.4 Применение ядра свертывания

В разных картах наборы обучаемых весов разные и никак не зависят друг от друга.

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

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

Слой субдискретизации

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

Рис.5 Субдискретизация

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

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

1.5 Существующие реализации нейронных сетей

Encog

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

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

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

Написана довольно эффективно, и имеет свою адаптацию к различным популярным языкам программирования, как то: Java, C#, C++, а также имеет возможность поддержки параллельных вычислений для многоядерных процессоров, а также возможность распаралелевания не только на CPU, но и на GPU. Последнее является довольно эффективным в случае работы с нейронными сетями, так как объемы данных зачастую действительно огромны и даже хорошие процессоры при распараллеливании будут заполняться под завязку. Однако сама библиотека не имеет реализации сверточных сетей. [9] FANN Библиотека, разработанная на C++ для работы с нейронными сетями. Является основным конкурентом Encog, по субъективному мнению. В отличии от Encog, здесь основной упор на охват широкой аудитории за счет огромнейшего сред разработки, с которыми она может взаимодействовать. Однако спектр классов, методов, функций несколько меньше или попросту не весь представлен в официально документации. Также поддерживает возможность параллельного выполнения алгоритмов тренировки нейронных сетей. [10]

Однако искомой реализации сверточных сетей здесь также не было найдено.

CUDACNN

В сети была обнаружена библиотека CudaCNN (ConvolutionalNeuralNetwork) разработанная Михаилом Сиротенко. Основная направленность ее на Matlab и Cuda реализацию сверточных сетей. [11] Несмотря на то, что библиотека по всей видимости подошла бы и имеет реализацию сверточных, субдискретизационных слоев, а также всего прочего необходимого: функций активации, механизмов искажения и т.д., к сожалению библиотеку он с некоторого времени забросил обновлять и документации к C++ фактически никакой нет, что не позволяет воспользоваться ей в пределах данного дипломного проекта.

Таким образом, в результате поисков, решено было воспользоваться уже существующим опытом первооткрывателя в данной сфере Яна ЛеКуна, а также МайкаО'Нила, программиста дополнившего модель ЛеКуна в последствии.

2. Методы оптимизации работы нейронной сети

2.1 Стохастический подход, пакетный и подход мини-партий

Метод обратного распространения ошибки - это метод обучения многослойной нейронной сети, основной идеей которого является распространение сигналов ошибки от выхода ко входу сети, в направлении обратном прямому распространению сигналов. Пусть сеть имеет входы , а также не которое множество выходов out, а также большое количество внутренних узлов. Пронумеруем узлы числами от 1 до N. Функция ошибки, полученная методом наименьших квадратов

где - вес ребра между i-м и j-м узлами, - выход i-го узла, а - правильный ответ ().

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

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

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

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

Нам же подходит первый подход.

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

В связи с этим приведем наиболее известные функции активации [*]:

Жесткая ступенька

Область применения: используется в формальном классическом нейроне.

Достоинства: нейроны с такой нелинейностью требуют малых вычислительных затрат.

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

Логистическая функция

Область применения: применяется в многослойных персептронах.

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

Функция симметрична относительно точки (NET=0, OUT=1/2), это делает равноправными значения OUT=0 и OUT=1, что существенно в работе сети. Недостатки: диапазон выходных значений от 0 до 1 несимметричен, из - за этого обучение значительно замедляется.

Гиперболический тангенс

Область применения: сети с непрерывными сигналами.

Достоинства: функция симметрична относительно точки (0, 0). Это преимущество по сравнению с сигмоидой.

Производная также непрерывна и выражается через саму функцию.

SOFTMAX - функция

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

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

Это позволяет трактовать OUTi как вероятности событий, совокупность которых (все выходы слоя) образует полную группу.

Гауссова кривая

Применяется в случаях, когда реакция нейрона должна быть максимальной для некоторого определенного значения NET. [14] Все эти функции активации реализованы в решении поставленной задачи, однако наиболее удобной из них является гиперболический тангенс, так как эта функция имеет свойства , вторая производная достигает максимума при . В решении задачи данные подаваемые на вход будут нормализованы, то есть, приведены к интервалу [-1,1]. В связи с этим, чтобы, при использовании подобных входных данных, дисперсия выходов также была близка к 1, Ян ЛеКун подобрал к этой функции некоторый коэффициент

. [18]

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

2.2 Методы обучения

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

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

Вот два наиболее широко используемых метода:

Стохастический градиентный спуск (SGD).

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

Модифицируется веса следующим образом: движение происходит в сторону противоположную градиенту, для этого к каждому весу прибавляется

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

С точки зрения выхода имеет влияние только как часть суммы

,

где сумма берется по входам j-го нейрона. Откуда

Исходя из того, что в свою очередь влияет на общую ошибку только в рамках j-го нейрона:

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

. [18]

Если j-й нейрон не на последнем слое, то у него имеются выходы. Обозначим их child (j). Откуда:

и

Ну, а - такая же поправка, но вычисленная для узла следующего слоя. [13]

Градиентный алгоритм Левенберга - Марквардта.

Алгоритм считается одним из лучших для большинства нейронных сетей. По своей сути он сочетает в себе метод наискорейшего спуска и метод Гаусса-Ньютона. Метод аппроксимирует матрицу Гессиана следующим образом где - всегда положительный "коэффициент комбинаций" или параметр Левенберга-Марквардта, J - якобиан, аI - единичная матрица. Диагональные элементы этого аппроксимированного Гессиана всегда будут больше ноля.

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

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

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

Описанные два метода наиболее часто используются, привлекая предоставляемой высокой скоростью обучения нейронной сети. [14, 20]

2.3 Предварительная подготовка данных для улучшения качества обучения нейронной сети

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

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

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

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

Горизонтальный поворот

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

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

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

Перемешивание обучающих примеров

Что касается подачи данных, то нейросети в разы быстрее обучаются, если подаются наиболее непредсказуемые примеры из обучающей выборки. [18, 19] В связи с этим системе лучше всего подавать наименее знакомые примеры.

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

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

Деформация изображения

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

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

Линейные искажения обеспечиваются простыми операциями, такими как сдвиг, поворот, масштабирование.

Нелинейные искажения или, как принято их называть, эластичные формируются следующим образом [15]:

Сначала создается гауссово ядро посредством построения матрицы , значение элемента (x, y) которой вычисляется по формуле:

,

где - размер ядра. Чаще всего это ядро выбирают нечетным и пропорциональным радиусу так, чтобы в это ядро попадали значения функции Гаусса вплоть до уменьшения от максимального значения в пределах 0,1-0,3.

Далее генерируются две матрицы размером (по размеру входного изображения). Значения элементов матриц выбираются как случайные величины, равномерно распределенные на отрезке [-1, 1]. К этим матрицам применяется размытие изображения с использованием ранее сформированного ядра. Далее ищется новое значение для каждого пикселя входного изображения с применением билинейной интерполяции и сформированных матриц.

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

3. Описание интерфейса программной реализации решения задачи классификации изображений

3.1 База изображений CIFAR - 10

Существуют накопленные базы изображений, предназначенные специально для подобных задач, такие как MNIST - база изображений рукописных символов размером 32х32 пиксела, CIFAR - база изображений реальных объектов размером 32х32 пиксела. В условиях нашей задачи необходимо было работать с подвидом CIFAR - CIFAR - 10. В наличии у CIFAR есть и другие базы.

Эта база включает в себя 50 000 тренировочных образцов, распределенных по 10 классам: автомобили, самолеты, кошки, собаки, олени, лягушки, грузовики, корабли, птицы и лошади. Изображения распределены по классам поровну, по 5000 на класс. Также она предоставляет 10 000 изображений, которые необходимо классифицировать. Однако задача была взята с ресурса предоставляющего различного рода соревнования www.kaggle.com, где конечная тестируемая база включала не 10 000, а 300 000. Сделано это было для исключения такого вида хитростей, как проименование вручную. Однако в финальной части, из высылаемого им набора в 300 000 уже распознанных картинок, ими тестировались только 10 тысяч результатов, которые выбирались по неизвестному критерию.

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

Также несмотря на то, что соревновательный ресурс содержал базу изображений в формате png, база использовалась в преобразованном виде, рекомендуемом самими изготовителями. Рекомендовалось использовать бинарные файлы, в которых под каждое изображение выделяется 3073 байта. Первый байт для изображения - это пометка с классом к которому образец принадлежит, следующие 3072 - это значение пикселей в формате RGB (Red, Green, Blue), где под каждый из каналов отводится 1024 байта соответствующие размеро изображения 32х32.

3.2 Интерфейс программы

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

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

Интерфейс имеет два режима: режим тренировки и режим тестирования.

Рис 3.1 Интерфейс программы ConvolutionalNeuralNetwork

Режим тренировки

Режим тренировки нейронной сети позволяет следить за процессом прохождения обучения системой (Рис 3.2). Для запуска нужно выбрать количество логических ядер (для параллельного выполнения задачи) и одну из схем обучения: SGD (стохастического градиентного спуска) и SGDLevenbergMarkvardt. Эти схемы обучения были описаны в главе оптимизации. Далее пользователю необходимо нажать на старт и выбрать параметры настройки сети, как то (Рис 3.3):

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

Все эти настройки можно сохранять и загружать из файла.

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

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

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

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

Рис 3.2 Интерфейс режима тренировки

Рис 3.3 Настройки сети

Режим тестирования

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

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

Данный режим позволяет тестировать не только тестировочную базу CIFAR-10, но и обучающую. Это сделано исключительно как дополнительная возможность перепроверки.

После полного тестирования или по нажатию кнопки "Стоп", все принятые решения записываются в отдельный файл, который можно просмотреть и использовать (к примеру для отправки на сайт соревнования)

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

Рис.3.4 Интерфейс режима тестирования

3.3 Топология сети

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

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

Функция активации задается для каждого слоя в отдельности.

4. Решение задачи распознания изображений реальных объектов базы CIFAR-10

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

Первой слой - входной. Он принимает изображения, как следствие имеет 3072 нейрона, по 1024 нейрона (32х32 пиксела) каждого канала цвета RGB.

Второй слой - сверточный, применяющий для свертки 6 ядер. Каждый нейрон на каждой из карт соединен с областью 5x5 на входном изображении. Размер одной карты - 28x28. Количество задействованных нейронов 4704, количество вычисляемых весов 456.

Третий слой, как и полагается - слой субдискретизации с шестью картами признаков по 14х14 размерности. Рецептивные поля 2х2, что значит каждый нейрон соединяется с областью этой размерности находящейся в той же позиции. Значения нейронов в этих полях усредняется и подается на вход. Итого задействовано 1176 нейронов и число обучаемых параметров 12.

Четвертый слой - снова сверточный. Этот слой состоит из 16 карт признаков размером 10х10. Рецептивное поле 5х5. Данный слой соединяется со вторым слоем по прописанному в коде инициализации сети принципу:

Рис.4.1 Принцип соединения четвертого слоя

Суть выборочного соединения в том, чтобы избежать симметрии сети: различные карты признаков будут извлекать разные признаки из слоя субдискретизации, соединяясь с разными наборами карт, которых на предыдущем слое было 6. Итого только 6 слой будет соединен со всеми картами предыдущего слоя, остальные имеют связи с 3 и 4 картами признаков. Это не только позволяет эффективно обучать сеть, но и сокращает число связей, а их даже при такой архитектуре 156 000, при1600 активных нейронах и 1516 вычисляемых весах. [18]

Пятый слой - субдискретизации с 16 картами признаков размерностью 5х5. Рецептивное поле 2х2 на карте признаков четвертого слоя.400 нейронов, 2000 связей, 32 обучаемых веса.

Шестой слой - слой свертки, имеющий 120 карт признаков, представленных всего одним нейронов. По сути получается вектор и достигается полная связь с предыдущим слоем. 120 нейронов, 48 120 весов.

Седьмой слой - полносвязный. Это выходной слой, состоящий из 10 нейронов, сопоставляемых с одним из классов изображений. 1210 весов и столько же связей.

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

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

Полученный результат тренировки: 30,5170 % ошибок на обучающей базе. Учитывая тот факт, что это алгоритм Л-М и прошло всего 50 эпох, можно предположить, что минимизироваться ошибка еще могла, однако было принято решение, что на данном этапе полученная точность приемлема. Запуск программы довольно сильно загружает CPU, поэтому дальнейшее получение 1-2 процентов точности, не стоят расходуемых ресурсов (перегрева системы).

Рис 4.2 Результаты обучения сети.

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

Результат был сохранен в файл формата csv (по требованию создателей "соревнования") и отправлен как решение на сайт kaggle.com. Сайт принял данные и поместил полученное решение в таблицу лидеров.

Итог: 52 строчка LeaderBoard из 150 существующих зарегистрированных решений, с показателем точности в 60,87 %.

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

Заключение

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

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

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.