Перейти к содержимому

Какие нейронные сети используются для классификации изображений

  • автор:

Классификация данных при помощи нейронных сетей

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

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

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

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

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

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

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

Особенности применения НС в качестве классификаторов

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

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

Тем не менее, можно выделить ряд преимуществ использования НС в качестве классификаторов:

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

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

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

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

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

Подготовка исходных данных

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

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

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

Например, в задаче классификации заёмщиков на «плохих» и «хороших» можно оставить всего два признака «Доход» и «Возраст». Тогда весьма вероятно, что два заёмщика с одним и тем же возрастом и доходом окажутся в разных классах. Чтобы сделать заёмщиков различимыми нужно добавить ещё один признак, например, число иждивенцев. Таким образом, отбор признаков для обучения классификатора на основе НС является поиском компромисса.

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

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

Кодирование выходных значений

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

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

При этом отношение объекта к классу определяется установкой в 1 соответствующего элемента выходного вектора ( i -го элемента для j -го класса), в то время, как остальные элементы устанавливаются в 0. Тогда, например, второму классу будет соответствовать единица на 2-м выходе сети и 0 на остальных (рис. 2).

Для кодирования могут использоваться и другие значения кроме 1. Но при интерпретации результата обычно считается, что класс определяется номером выхода сети, на котором появилось максимальное значение. Например, если на выходе сети был сформирован вектор выходных значений (0.2, 0.6, 0.4), то максимальное значение имеет второй компонент вектора. Следовательно, класс, к которому относится этот пример, будет 2.

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

Например, для рассмотренного выше примера уверенность сети в том, что пример относится ко второму классу, определится как разность между второй и третьей компонентой вектора и равна 0.6−0.4=0.2 . Соответственно чем выше уверенность, тем больше вероятность того, что сеть дала правильный ответ. Этот метод кодирования является самым простым, но не всегда самым эффективным способом представления классов на выходе сети.

Например, в другом способе представления, номер класса кодируется в двоичной форме в выходном векторе сети. Тогда если число классов равно 5, то для их представления будет достаточно трёх выходных нейронов, а код, соответствующий, скажем, 3-му классу будет 011. Недостатком подхода является отсутствие возможности использования показателя уверенности, поскольку разность между любыми элементами выходного вектора всегда равна 0 или 1. Следовательно изменение любого элемента выходного вектора неминуемо приведёт к ошибке. Поэтому для увеличения «расстояния» между классами удобно использовать код Хэммминга, который позволит точность классификации.

Ещё один подход заключается в разбиении задачи с k классами на k∗(k−1)/2 подзадач с двумя классами каждая (кодирование «2 на 2»). Подзадача в данном случае заключается в том, что сеть определяет наличие одной из компонент вектора. Т.е. исходный вектор разбивается на группы по два компонента в каждой таким образом, чтобы в них вошли все возможные комбинации компонент выходного вектора. Из комбинаторики известно, что число этих групп можно определить как количество неупорядоченных выборок без повторений по два из исходных компонент, то есть:

Тогда, например, для задачи с четырьмя классами мы имеем 6 выходов (подзадач) распределенных следующим образом:

№ подзадачи (выхода) Компоненты выхода
1 1-2
2 1-3
3 1-4
4 2-3
5 2-4
6 4-4

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

№ класса Компоненты выхода
1 1, 2, 3
2 1, 4, 5
3 2, 4, 6
4 3, 5, 6

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

Выбор размера сети

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

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

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

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

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

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

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

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

Выбор архитектуры сети

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

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

Алгоритм построения классификатора

Построение классификатора на основе нейронной сети содержит ряд шагов.

  1. Подготовка данных
    1. Составить базу данных из примеров, характерных для данной задачи
    2. Разбить всю совокупность данных на два множества: обучающее и тестовое (возможно разбиение на 3 множества: обучающее, тестовое и валидационное)
    1. Произвести отбор признаков, значимых с точки зрения задачи классификации.
    2. Выполнить трансформацию и при необходимости очистку данных (нормализацию, исключение дубликатов и противоречий, подавление выбросов и т.д.). В результате желательно получить линейно разделяемое по классам пространство множества примеров.
    3. Выбрать систему кодирования выходных значений (классическое кодирование, «2 на 2»-кодирование и т.д.)
    1. Выбрать топологию сети: количество слоев, число нейронов в слоях и т.д.
    2. Выбрать активационную функцию нейронов (например, логистическую, гипертангенс и др.)
    3. Выбрать алгоритм обучения сети
    4. Оценить качество работы сети на основе валидационного множества, или другого критерия, оптимизировать архитектуру (уменьшение весов, прореживание пространства признаков)
    5. Остановится на варианте сети, который обеспечивает наилучшую способность к обобщению и оценить качество работы по тестовому множеству
    1. Выяснить степень влияния различных факторов на принимаемое решение (эвристический подход)
    2. Убедиться, что сеть обеспечивает требуемую точность классификации (число неправильно распознанных примеров мало)
    3. При необходимости вернуться на этап 2, изменив способ представления примеров или изменив базу данных
    4. Практически использовать сеть для решения задачи

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

    Другие материалы по теме:

    Сверточные нейронные сети: основы и принцип работы

    Что это? Сверточные нейронные сети (Convolutional Neural Networks, CNN) – класс алгоритмов машинного обучения. С их помощью удается достичь впечатляющих результатов в области распознавания образов, классификации изображений, а также обработки и анализа видеоданных.

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

    В статье рассказывается:

    1. Что собой представляют сверточные нейронные сети
    2. Структура свёрточной нейронной сети
    3. Где используются сверточные нейронные сети
    4. Часто задаваемые вопросы о сверточных нейронных сетях

    Пройди тест и узнай, какая сфера тебе подходит:
    айти, дизайн или маркетинг.
    Бесплатно от Geekbrains

    Что собой представляют сверточные нейронные сети

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

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

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

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

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

    Узнай, какие ИТ — профессии
    входят в ТОП-30 с доходом
    от 210 000 ₽/мес
    Павел Симонов
    Исполнительный директор Geekbrains

    Команда GeekBrains совместно с международными специалистами по развитию карьеры подготовили материалы, которые помогут вам начать путь к профессии мечты.

    Подборка содержит только самые востребованные и высокооплачиваемые специальности и направления в IT-сфере. 86% наших учеников с помощью данных материалов определились с карьерной целью на ближайшее будущее!

    Скачивайте и используйте уже сегодня:

    Павел Симонов - исполнительный директор Geekbrains

    Павел Симонов
    Исполнительный директор Geekbrains

    Топ-30 самых востребованных и высокооплачиваемых профессий 2023

    Поможет разобраться в актуальной ситуации на рынке труда

    Подборка 50+ бесплатных нейросетей для упрощения работы и увеличения заработка

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

    ТОП-100 площадок для поиска работы от GeekBrains

    Список проверенных ресурсов реальных вакансий с доходом от 210 000 ₽

    Получить подборку бесплатно
    Уже скачали 23672

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

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

    Структура свёрточной нейронной сети

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

    В состав сверточной нейронной сети входит несколько слоев. От количества слоев зависит мощность архитектуры и эффективность обучения. Вот схема основных составляющих свёрточной нейронной сети:

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

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

    Для вас подарок! В свободном доступе до 29.10 —>
    Скачайте ТОП-10 нейросетей, которые помогут облегчить
    вашу работу
    Чтобы получить подарок, заполните информацию в открывшемся окне

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

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

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

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

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

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

    Сверточной нейронной сетью изображения классифицируются представляются по-особому – как трехмерные массивы чисел или матриц. В математике они носят название «тензоры». RGB цвета кодируются как три целых числа в диапазоне от 0 до 255. Все пиксели в матричном массиве представлены в виде чисел, отражающих яркость в этом диапазоне.

    Где используются сверточные нейронные сети

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

    • распознавании рукописного текста;
    • классификации документов, таких как СНИЛС или паспорт;
    • распознавании на снимках новообразований и иных патологий.

    В настоящее время сверточные нейронные сети применяются в системах видеонаблюдения, видеоаналитики и беспилотных автомобилях. Например, камеры в комплексе с такими сетями помогают роботам компании «Яндекс» и беспилотным такси понимать, что происходит на дороге.

    Другой популярной областью применения принципа работы сверточных нейронных сетей является генеративное искусство. Когда человек вводит запрос, нейронная сеть генерирует на его основе изображение. Преобразование текста является задачей различных алгоритмов, а генерация изображения – сверточных нейронных сетей. Наиболее распространенными моделями для генерации изображений являются такие сверточные нейронные сети, как Midjourney, Stable Diffusion, Dream, DALL-E 2 и ruDALL-E.

    #1 Нейронные сети для начинающих. Решение задачи классификации Ирисов Фишера

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

    Это первая статья серии введения в нейронные сети, «Нейронные сети для начинающих». Здесь и далее мы постараемся разобраться с таким понятием — как нейронные сети, что они вообще из себя представляют и как с ними «подружиться», на практике решая простые задачи.

    О чём будем говорить:

    • Нейронные сети. Что это такое и какие они бывают?
    • Виды нейронных сетей и конструкция нейронных сетей.
    • Где они применяются?
    • Перцептрон .
    • Классификация. Что это такое и почему это важно?
    • Функции активации (ФА) .
    • Зачем они нужны?
    • Виды ФА.
    • Как обучить нейронную сеть?
    • Цели и задачи обучения.
    • Обучение с учителем и без.
    • Понятие ошибки.
    • Задача минимизации ошибки.
    • Градиентный спуск.
    • Как вычислить градиент?
    • Пресловутые «Ирисы Фишера» .
    • Постановка задачи.
    • Softmax()+ Relu()
    • Ура! Пишем код (Наконец-то) .

    Что такое нейронные сети?

    image

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

    image

    ▍ Виды нейронных сетей:

    image

    Есть десятки видов нейросетей, которые отличаются архитектурой, особенностями функционирования и сферами применения. При этом чаще других встречаются сети трёх видов.
    Нейронные сети прямого распространения (Feed forward neural networks, FFNN). Прямолинейный вид нейросетей, при котором соседние узлы слоя не связаны, а передача информации осуществляется напрямую от входного слоя к выходному. FFNN имеют малую функциональность, поэтому часто используются в комбинации с сетями других видов.

    Свёрточные нейронные сети (Convolutional neural network, CNN). Состоят из слоёв пяти типов:

    • входного,
    • свёртывающего,
    • объединяющего,
    • подключённого,
    • выходного.

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

    Рекуррентные нейронные сети (Recurrent neural network, RNN). Используют направленную последовательность связи между узлами. В RNN результат вычислений на каждом этапе используется в качестве исходных данных для следующего. Благодаря этому, рекуррентные нейронные сети могут обрабатывать серии событий во времени или последовательности для получения результата вычислений.

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

    ▍ Типы задач, которые решают нейронные сети

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

    • Классификация. Для распознавания лиц, эмоций, типов объектов: например, квадратов, кругов, треугольников. Также для распознавания образов, то есть выбора конкретного объекта из предложенного множества: например, выбор квадрата среди треугольников.
    • Регрессия. Для определения возраста по фотографии, составления прогноза биржевых курсов, оценки стоимости имущества и других задач, требующих получения в результате обработки конкретного числа.
    • Прогнозирования временных рядов. Для составления долгосрочных прогнозов на основе динамического временного ряда значений. Например, нейросети применяются для предсказания цен, физических явлений, объёма потребления и других показателей. По сути, даже работу автопилота Tesla можно отнести к процессу прогнозирования временных рядов.
    • Кластеризация. Для изучения и сортировки большого объёма неразмеченных данных в условиях, когда неизвестно количество классов на выходе, то есть для объединения данных по признакам. Например, кластеризация применяется для выявления классов картинок и сегментации клиентов.
    • Генерация. Для автоматизированного создания контента или его трансформации. Генерация с помощью нейросетей применяется для создания уникальных текстов, аудиофайлов, видео, раскрашивания чёрно-белых фильмов и даже изменения окружающей среды на фото.

    Как выглядит простая нейронная сеть?

    image

    image

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

    • Экономика и бизнес.
    • Медицина и здравоохранение.
    • Авионика.
    • Связь.
    • Интернет.
    • Автоматизация производства.
    • Политологические и социологические исследования.
    • Безопасность, охранные системы.
    • Ввод и обработка информации.
    • Геологоразведка.
    • Компьютерные и настольные игры.
    • И т.д.

    Теперь разберём подробнее самую простую модель искусственного нейрона — перцептрон:

    Согласно общему определению перцептро́н или персептрон — математическая или компьютерная модель восприятия информации мозгом, предложенная Фрэнком Розенблаттом в 1958 году и впервые реализованная в виде электронной машины «Марк-1» в 1960 году. Перцептрон стал одной из первых моделей нейросетей, а «Марк-1» — первым в мире нейрокомпьютером.

    Вы уже могли видеть подобные иллюстрации на просторах интернета:

    image

    Но что же это всё означает?

    Давайте по порядку:

    Х1, Х2, Х3, . Хn — входные классы, данные, которые мы подаём на вход нашей сети. Т.е. здесь у нас идут те данные, которые пришли к нам от клиента или же от нашего сервиса, который каким-то образом собирает/парсит данные , далее эти данные умножаются на случайные веса (стандартное обозначение W1, . Wn) и суммируются с так называемым нейроном смещения или bias нейрон в «Сумматоре» (из названия следует, что данные, Хn * Wn , суммируются друг с другом). Далее результат Σ(Хn * Wn + b) подаётся в функцию активации, о которой поговорим далее.

    Данные метаморфозы проиллюстрированы на следующем слайде:

    image

    ▍ Задача классификации

    Проговорив в общих чертах строение «базовой нейронной сети», плавно перейдём к рассмотрению задачи классификации — основной задачи нейронных сетей.

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

    Примитивно эту задачу можно проиллюстрировать следующим образом:

    image

    Мы с вами, с лёгкостью можем понять, что ответ будет следующий:

    image

    Но а что на это скажет компьютер?

    Для него это лишь набор пикселей/байтов, который ему ни о чём не говорит. По-простому — это 0 и 1. Подробнее про это, можете почитать здесь.

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

    ▍ Функции активации — ФА

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

    Давайте рассмотрим некоторые распространённые ФА:

    image

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

    Функция А = активирована, если Y > граница, иначе нет.

    Другой способ: A = 1, если Y > граница, иначе А = 0.

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

    Функция принимает значение 1 (активирована), когда Y > 0 (граница), и значение 0 (не активирована) в противном случае.

    image

    Пользуясь определением, становится понятно, что ReLu возвращает значение х, если х положительно, и 0 в противном случае.

    ReLu нелинейна по своей природе, а комбинация ReLu также нелинейна! (На самом деле, такая функция является хорошим аппроксиматором, так как любая функция может быть аппроксимирована комбинацией ReLu). Это означает, что мы можем стэкать слои. Область допустимых значений ReLu — [ 0,inf ].

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

    image

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

    Ещё одно достоинство такой функции — она не бинарна, что делает активацию аналоговой, в отличие от ступенчатой функции. Для сигмоиды также характерен гладкий градиент.
    Если вы заметили, в диапазоне значений X от -2 до 2 значения Y меняется очень быстро. Это означает, что любое малое изменение значения X в этой области влечёт существенное изменение значения Y. Такое поведение функции указывает на то, что Y имеет тенденцию прижиматься к одному из краёв кривой.

    Сигмоида действительно выглядит подходящей функцией для задач классификации. Она стремится привести значения к одной из сторон кривой (например, к верхнему при х=2 и нижнему при х=-2). Такое поведение позволяет находить чёткие границы при предсказании.
    Другое преимущество сигмоиды над линейной функцией заключается в следующем. В первом случае имеем фиксированный диапазон значений функции — [0,1], тогда как линейная функция изменяется в пределах (-inf, inf). Такое свойство сигмоиды очень полезно, так как не приводит к ошибкам в случае больших значений активации.

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

    Как же обучить нейронную сеть?

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

    1. Данные для обучения
    2. Функция потерь
    3. Понятие «градиентного спуска»

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

    Ошибка нейронной сети — отличие между предсказанным значением и правильным.

    Самая простая функция потерь — Евклидово Расстояние или функция MSE:

    yi – правильный результат.
    zi – предсказанный результат.

    Задача минимизации ошибки:

    Используем метод оптимизации:

    ������������(��) — функция, возвращающая элемент вектора, где достигается минимум.
    ������������(��) — функция, возвращающая элемент вектора, где достигается максимум.

    Градиентный спуск — метод нахождения локального минимума или максимума функции при помощи движения вдоль градиента.

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

    Пресловутые «Ирисы Фишера»

    Теперь немного уйдём от голой теории и сделаем простую программу, решив базовую задачу классификации. Это базовая задача для специалистов, начинающих свой путь в нейронных сетях, своеобразный «Hello world!», для этого направления.

    Здесь хотелось бы сделать небольшое отступление и рассказать подробнее про саму задачу «Ирисов Фишера» зачем и почему она здесь.

    Ирисы Фишера — это набор данных для задачи классификации, на примере которого, Рональд Фишер в 1936 году продемонстрировал работу разработанного им метода дискриминантного анализа. Иногда его также называют ирисами Андерсона, так как данные были собраны американским ботаником Эдгаром Андерсоном. Этот набор данных стал уже классическим, и часто используется в литературе для иллюстрации работы различных статистических алгоритмов.

    image

    Вот так распределяются данные в датасете:

    image

    Ирисы Фишера состоят из данных о 150 экземплярах ириса, по 50 экземпляров из трёх видов:

    • Ирис щетинистый (Iris setosa).
    • Ирис виргинский (Iris virginica).
    • Ирис разноцветный (Iris versicolor).

    image

    • Длина чашелистника (sepal length).
    • Ширина чашелистника (sepal width).
    • Длина лепестка (petal length).
    • Ширина лепестка (petal width).

    Конструкция нейронной сети:

    На входе у нас есть 4 класса(характеристики) — Х, также нам понадобится всего один внутренний слой — Н, в нём будет 10 нейронов (выбирается методом подбора), далее на выходе мы имеем 3 класса, которые зависят от характеристики цветов — Z. Получается вот такая конструкция сети:

    image

    Далее распишем математическое обоснование для нашей задачи:

    image

    Ура-а-а-а! Наконец-то код!

    • Язык программирования Python.
    • Базовая библиотека языка Python, для работы с линейными данными, NumPy.
    • Базовая библиотека языка Python, для «рандомизации» значений, random.
    import numpy as np import random as rd

    Теперь пропишем некоторые гиперпараметры:

    INPUT_DIM = 4 #кол-во входных нейронов OUT_PUT = 3 #кол-во выходных нейронов H_DIM = 10 #кол-во нейронов в скрытом слое 

    Теперь зададим входной вектор и его веса (вначале рандомим данные, для получения реальной картины весов):

    x = np.random.randn(INPUT_DIM) w1 = np.random.randn(INPUT_DIM, H_DIM) b1 = np.random.randn(H_DIM) w2 = np.random.randn(H_DIM, OUT_DIM) b2 = np.random.randn(OUT_DIM) 
    t1 = x @ w1 + b1 h1 = relu(t1)

    Точно также сделаем и для остальных.

    Теперь обернём наш код в функцию:

    def predict(x): t1 = x @ W1 + b1 h1 = relu(t1) t2 = h1 @ W2 + b2 z = softmax(t2) print('z =', z) return z 

    Оформим функцию relu() :

    def relu(t): print('relu:', np.maximum(t, 0)) return np.maximum(t, 0) 

    Теперь добавим softmax() :

    def softmax(t): out = np.exp(t) print('softmax:', out / np.sum(out)) return out / np.sum(out) 

    Добавим вызов функции predict() , также class_names — имена выходных классов и вывод результатов предсказания:

    probs = predict(x) pred_class = np.argmax(probs) class_names = ['Setosa', 'Versicolor', 'Virginica'] print('Predicted:', class_names[pred_class]) 

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

    import numpy as np import random as rd INPUT_DIM = 4 OUT_DIM = 3 H_DIM = 10 x = [] for i in range(4): x.append(float(input())) print(x) # Рандомно вводим значения гиперпараметров: x = np.random.randn(INPUT_DIM) w1 = np.random.randn(INPUT_DIM, H_DIM) b1 = np.random.randn(H_DIM) w2 = np.random.randn(H_DIM, OUT_DIM) b2 = np.random.randn(OUT_DIM) def relu(t): print('relu:1', np.maximum(t, 0)) return np.maximum(t, 0) def softmax(t): out = np.exp(t) print('softmax:', out / np.sum(out)) return out / np.sum(out) def predict(x): t1 = x @ w1 + b1 h1 = relu(t1) t2 = h1 @ w2 + b2 z = softmax(t2) print('z =1', z) return z tl = x @ w1 + b1 hl = relu(tl) probs = predict(x) pred_class = np.argmax(probs) class_names = ['Setosa', 'Versicolor', 'Virginica'] print('Predicted:', class_names[pred_class])

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

    w1 = np.array([[ 0.33462099, 0.10068401, 0.20557238, -0.19043767, 0.40249301, -0.00925352, 0.00628916, 0.74784975, 0.25069956, -0.09290041 ], [ 0.41689589, 0.93211640, -0.32300143, -0.13845456, 0.58598293, -0.29140373, -0.28473491, 0.48021000, -0.32318306, -0.34146461 ], [-0.21927019, -0.76135162, -0.11721704, 0.92123373, 0.19501658, 0.00904006, 1.03040632, -0.66867859, -0.01571104, -0.08372566 ], [-0.67791724, 0.07044558, -0.40981071, 0.62098450, -0.33009159, -0.47352435, 0.09687051, -0.68724299, 0.43823402, -0.26574543 ]]) b1 = np.array([-0.34133575, -0.24401602, -0.06262318, -0.30410971, -0.37097632, 0.02670964, -0.51851308, 0.54665141, 0.20777536, -0.29905165 ]) w2 = np.array([[ 0.41186367, 0.15406952, -0.47391773 ], [ 0.79701137, -0.64672799, -0.06339983 ], [-0.20137522, -0.07088810, 0.00212071 ], [-0.58743081, -0.17363843, 0.93769169 ], [ 0.33262125, 0.18999841, -0.14977653 ], [ 0.04450406, 0.26168097, 0.10104333 ], [-0.74384144, 0.33092591, 0.65464737 ], [ 0.45764631, 0.48877246, -1.16928700 ], [-0.16020630, -0.12369116, 0.14171301 ], [ 0.26099978, 0.12834471, 0.20866959 ]]) b2 = np.array([-0.16286677, 0.06680119, -0.03563594 ]) 

    Опять же для любителей всего кода в одном месте:

    import numpy as np import random as rd INPUT_DIM = 4 OUT_DIM = 3 H_DIM = 10 x = [] # Входные тестовые данные вводятся в следующем формате: "7.9 3.1 7.5 1.8" # Длина чашелистника: 7.9 # Ширина чашелистника: 3.1 # Длина лепестка: 7.5 # Ширина лепестка: 1.8 for i in range(4): x.append(float(input())) print(x) w1 = np.array([[ 0.33462099, 0.10068401, 0.20557238, -0.19043767, 0.40249301, -0.00925352, 0.00628916, 0.74784975, 0.25069956, -0.09290041 ], [ 0.41689589, 0.93211640, -0.32300143, -0.13845456, 0.58598293, -0.29140373, -0.28473491, 0.48021000, -0.32318306, -0.34146461 ], [-0.21927019, -0.76135162, -0.11721704, 0.92123373, 0.19501658, 0.00904006, 1.03040632, -0.66867859, -0.01571104, -0.08372566 ], [-0.67791724, 0.07044558, -0.40981071, 0.62098450, -0.33009159, -0.47352435, 0.09687051, -0.68724299, 0.43823402, -0.26574543 ]]) b1 = np.array([-0.34133575, -0.24401602, -0.06262318, -0.30410971, -0.37097632, 0.02670964, -0.51851308, 0.54665141, 0.20777536, -0.29905165 ]) w2 = np.array([[ 0.41186367, 0.15406952, -0.47391773 ], [ 0.79701137, -0.64672799, -0.06339983 ], [-0.20137522, -0.07088810, 0.00212071 ], [-0.58743081, -0.17363843, 0.93769169 ], [ 0.33262125, 0.18999841, -0.14977653 ], [ 0.04450406, 0.26168097, 0.10104333 ], [-0.74384144, 0.33092591, 0.65464737 ], [ 0.45764631, 0.48877246, -1.16928700 ], [-0.16020630, -0.12369116, 0.14171301 ], [ 0.26099978, 0.12834471, 0.20866959 ]]) b2 = np.array([-0.16286677, 0.06680119, -0.03563594 ]) # x = np.random.randn(INPUT_DIM) # w1 = np.random.randn(INPUT_DIM, H_DIM) # b1 = np.random.randn(H_DIM) # w2 = np.random.randn(H_DIM, OUT_DIM) # b2 = np.random.randn(OUT_DIM) def relu(t): print('relu:1', np.maximum(t, 0)) return np.maximum(t, 0) def softmax(t): out = np.exp(t) print('softmax:', out / np.sum(out)) return out / np.sum(out) def predict(x): t1 = x @ w1 + b1 h1 = relu(t1) t2 = h1 @ w2 + b2 z = softmax(t2) print('z =1', z) return z tl = x @ w1 + b1 hl = relu(tl) probs = predict(x) pred_class = np.argmax(probs) class_names = ['Setosa', 'Versicolor', 'Virginica'] print('Predicted:', class_names[pred_class])

    И в итоге мы получим нужное нам предсказание

    image

    Полноценный код можно также посмотреть в моём github-репозитории по ссылке.

    Ну что же, мы с вами написали свой «Hello world» с нейронными сетями! Эта задача показывает одно из самых популярных направлений в DataSciense — направление классификации данных. Этим мы приоткрыли дверь в большой и быстроразвивающийся мир человекоподобных технологий. Дальше больше!

    А какие примеры классификации и интересные задачи из направления DataSciense вы знаете? Пишите свой вариант в комментариях!

    • python
    • neural networks
    • neural network
    • fisher iris
    • ruvds_статьи

    Какие нейронные сети используются для классификации изображений

    1 Калужский филиал ФГОУ ВО «Московский государственный технический университет имени Н.Э. Баумана (национальный исследовательский университет)

    Работа посвящена разработке и обучению специального типа нейронной сети для работы с малой выборкой данных. Такая сеть содержит несколько свёрточных слоёв, хорошо работающих при решении задач классификации объектов. Топография нейросети и методики работы с ней реализованы в виде программы на языке Python с использованием модуля глубокого обучения Keras. Описана последовательность процедуры разделения исходного набора данных по исследуемым объектам (файлам изображений) на обучающую и валидационную выборки, а также процесса подбора типов слоёв сети и их параметров. Выбран метод компиляции модели, позволяющий достичь максимальной эффективности её работы. В статье описан также процесс обучения нейросетевой модели на достаточно небольшом массиве изображений, получена зависимость качества классификации от количества циклов (эпох) обучения. Определено оптимальное количество эпох обучения, которое позволяет добиться максимального качества классификации объектов. Так как машинное обучение является непрерывно и стремительно развивающейся областью науки, то перечисленные этапы можно реализовать разными способами, из которых выбран лишь один возможный. Язык Python и его модули позволяют программистам и учёным творчески решать данную задачу различными методами, и затем сравнивать качество результатов, чему способствует свободное распространение модулей и популярность данного языка программирования во всём мире. Основной библиотекой функций для работы с нейросетями является модуль Keras, но при создании описываемого программного продукта использованы также модуль обработки массивов данных Numpy, модуль машинной графики Matplotlib, модули Graphviz и Pydot для визуализации топографии нейросетей. Программа отличается тем, что чаще всего даже достаточно сложная процедура реализуется в виде очень короткой части программного кода и исследователь имеет широкие возможности экспериментирования с подбором наилучшего набора параметров используемых функций с точки зрения достижения наивысшего качества модели. По результатам представленной работы сформулированы выводы и даны рекомендации для дальнейшего применения рассмотренной методики.

    свёрточные сети
    нейросетевое программирование
    язык python
    модуль keras
    классификация изображений

    1. Москвитин А.А., Созиев Т.М. Особенности современных методов интеллектуального анализа данных. В сборнике: Современные методы интеллектуального анализа данных. Российский экономический университет им. Г.В. Плеханова. 2016. С. 11-18.

    2. Стоянченко С.С., Демин О.В. Исследование применения алгоритмов классификации для интеллектуальных веб-приложений. В сборнике: Инновационные материалы и технологии. 2018. С. 52-54.

    3. Толстых А.А., Голубинский А.Н. Алгоритм выбора архитектуры полносвязной сети в задачах распознавания изображений на основе сверточных нейронных сетей. В сборнике: Радиолокация, навигация, связь. Воронежский гос. университет. 2019. С. 156-163.

    4. Machine Learning Repository. Center for Machine Learning and Intelligent Systems. [Электронный ресурс]. URL: https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/ (дата обращения: 30.06.2020).

    5. Philippe Golle, Palo Alto. Machine Learning Attacks Against the Asirra CAPTCHA. [Электронный ресурс]. URL: http://xenon.stanford.edu/~pgolle/papers/dogcat.pdf (дата обращения: 30.06.2020).

    6. Толстых А.А., Голубинский А.Н. Программа тестирования эффективности распознавания объектов на изображениях сверточными нейронными сетями. Свидетельство о регистрации программы для ЭВМ RU2019616219, 20.05.2019. Заявка № 2019615108 от 26.04.2019.

    7. Воронецкий Ю.О., Жданов Н.А. Методы борьбы с переобучением искусственных нейронных сетей. Научный аспект. 2019. Т. 13. № 2. С. 1639-1647.

    8. A Beginner’s Guide to Neural Networks and Deep Learning. A.I. Wiki. [Электронный ресурс]. URL: https://pathmind.com/wiki/neural-network (дата обращения: 30.06.2020).

    9. Vitaly Bushaev. Understanding RMSprop — faster neural network learning. [Электронный ресурс]. URL: https://towardsdatascience.com/understanding-rmsprop-faster-neural-network-learning-62e116fcf29a (дата обращения: 30.06.2020).

    10. Keras: The Python Deep Learning library. Keras documentation. [Электронный ресурс]. URL: https://keras.io/#why-thisname-keras. (дата обращения 30.06.2020).

    Введение. Одной из проблем, требующих решения с помощью современных методов обработки данных, является задача машинной классификации объектов (то есть сортировки выборки объектов по классам) [1].

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

    — защита информации, где необходимо отделить секретную и важную информацию от менее важной, актуальные данные от неактуальных;

    — отделение исправных изделий от неисправных;

    — создание контекстных выборок в веб-приложениях [2];

    — распознавание образов на изображениях.

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

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

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

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

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

    При этом используются специальные возможности модуля Keras [4]:

    — функция создания генератора для обучения модели Keras;

    — специальное сочетание разных типов слоёв нейросети для эффективной работы с небольшим массивом данных;

    — тонкая настройка модели с помощью длительного обучения.

    При использовании больших выборок данных и методик глубокого обучения можно достичь точности классификации до 98%. Однако, при работе с малой выборкой некачественных данных достижимая точность классификации гораздо ниже. Более ранние исследования, проведённые с базой данных из 25000 изображений, показали, что при классификации можно добиться точности не более 60% [5]. Однако, в последнее время после детальной разработки архитектуры нейросети, работающей с малой выборкой данных, наблюдается значительный прогресс и в некоторых случаях достигнута точность классификации до 80%.

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

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

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

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

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

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

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

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

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

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

    Разработанная нейронная сеть формируется последовательным соединением следующих слоёв [8] (рис. 1):

    — InputLayer – входной слой для подачи на него обучающих образцов изображений;

    — Три последовательных свёрточных слоя Conv2D, связанных с активационными слоями Activation с передаточной функцией ReLU (линейный выпрямитель Rectified Linear Unit) и последующими выходными тензорами MaxPooling2D. Целью активационного слоя является достижение бинарности данных на выходе («да-нет»), а выходные тензорные слои уменьшают размерность выходной выборки на основе выбора только максимального значения из подвыборок размером pool_size;

    — Flatten — слой для преобразования изображения выходной выборки в одномерный вектор;

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

    Выход сети является бинарным с двумя вариантами классификации (кошка-собака).

    После задания типов и параметров слоёв в программе предусмотрены команды для вывода топографии нейросети на экран и в графический файл (рис. 1).

    Рис. 1. Топография созданной нейронной сети.

    Затем производится компиляция созданной нейросети, для чего использован метод бинарной кроссэнтропии в качестве функции потерь (её назначение описано выше), метрика точности и один из самых современных оптимизаторов адаптивного обучения Rmsprop [9].

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

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

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

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

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

    Результаты. Выполнение расчётов с помощью созданной программы осуществлялось на компьютере с двухъядерным процессором (CPU) с тактовой частотой 2 ГГц и 4 Гб оперативной памяти. Обучение модели по 100 эпохам заняло около 15 часов. Это время может быть значительно сокращено при использовании более мощной конфигурации компьютера и процессора мощной графической карты (GPU вместо CPU).

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

    Рис. 2. Зависимость качества классификации нейросетью от количества эпох обучения.

    По графику видно, что качество обучения колеблется в зависимости от количества эпох и вначале качество классификации в среднем увеличивается. Колебания оценки качества модели можно объяснить наличием неявной связи между архитектурой сети и числом эпох. Наилучшее качество обучения (более 80%) было достигнуто при числе эпох 45. При дальнейшем увеличении количества эпох качество модели не повышается (график изображён только для 50 начальных эпох, т.к. далее оценка качества колеблется около значений 75-80%, не превышая их). Полученное качество обучения близко к предельно допустимым значениям при небольшом наборе данных, поэтому можно сделать вывод, что использованная топография сети с применением свёрточных слоёв хорошо справилась с задачей бинарной классификации.

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

    По результатам выполненной работе можно сформулировать следующие рекомендации:

    — при разбиении исходной базы данных следует отводить на обучающую выборку в несколько раз большее количество объектов, чем на валидационную выборку;

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

    — надо использовать наиболее современный и совершенный метод компиляции сети;

    — избегать переобучения сети, которое в рассматриваемой задаче очень вероятно;

    — при разработке модели можно использовать оценку её качества, предложенную в статье.

    Описанные принципы создания и обучения свёрточных нейросетей с использованием модуля Keras [10] и прочих библиотек языка Python рекомендуется применять также для классификации любых других объектов по малым выборкам данных.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

https://alkogolizm.vyvod-iz-zapoya-v-stacionare-samara11.ru/