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

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

Опубликовано shwan в 28.07.2019 28.07.2019

Добрый день, уважаемые читатели. Целью этой статьи является классификация изображений с помощью сверточных слоёв Keras . Всё это дело мы будем тестировать на стандартном наборе — MNIST. Этот набор содержит 70.000 изображений рукописных цифр (от 0 до 9-ти). Наша цель проста — сделать так, чтобы сверточная нейронная сеть правильно предсказала изображенную цифру.

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

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

Самая простая сверточная нейронная сеть

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

Мы загрузим MNIST прямо из наборов Keras , довольно удобно. Там же импортируем класс последовательность модели ( Sequential ) и необходимые слои: Dense (обычный персептрон), Flatten (преобразователь матриц в вектор), Dropout (один из методов регуляризации для противостояния переобучению), Conv2D (свёрточный слой) и MaxPooling2D — уменьшает размер исходной матрицы.

Загрузим данные и оценим их кол-во:

60.000 обучающих и 10.000 тестовых образцов, каждый из которых имеет форму (28, 28).

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

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

Теперь преобразуем наборы образцов, а также обработаем вектора с целевыми значениями:

Мы изменяем тип массива на float32 , чтобы нормализировать его путём деления на 255. А «цели» мы преобразуем в категории от 0 до 9.

Теперь задумаемся над архитектурой модели:

Как она будет работать? Сначала у нас 2 свёрточных слоя, которые будут работать с поступающим им изображением. Потом мы уменьшим размер исходной матрицы с помощью слоя MaxPooling . Затем изменим несколько значений на ноль, развернём многомерный массив в вектор, проведём его через один линейный слой, заново откинем несколько значений и произведём классификацию с помощью функции активации softmax . В остальных слоях используя самая популярная активация — relu .

Создадим отчёт об архитектуре модели (именно для этого мы указывали форму ввода для первого слоя):

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

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

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

Мы не даром сохранили историю обучения, стандартным образом визуализируем её:

Если чтение отчёта вызывает у Вас трудности, то лучше вывести отдельно конечные точность и ошибку на тестовых данных:

Мы достигли точности в 0.9909. В официальном примере от Keras была достигнута точность в 0.9925. Могу сказать, что при многократной адаптации модели она показывала и лучшие результаты. Так я однажды получил точность в 0.9927. Это всё из-за того, что изначальные веса модели задаются случайно, что влияет на градиент обучения.

Заключение

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

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

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

понедельник, 9 мая 2016 г.

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

1 Введение

Свёрточная нейронная сеть (convolutional neural network, CNN, LeNet) была представлена в 1998 году французским исследователем Яном Лекуном (Yann LeCun) [1] , как развитие модели неокогнитрон (neocognitron) [2] .

Модель свёрточной сети, которую мы рассмотрим в этой статье, состоит из трёх типов слоёв: свёрточные (convolutional) слои, субдискретизирующие (subsampling,подвыборка) слои и слои "обычной"нейронной сети – перцептрона [3] .

Читайте также:  Как выбрать карту видеозахвата

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

Своё название свёрточная сеть получила по названию операции – свёртка [5] , она часто используется для обработки изображений и может быть описана следующей формулой.

Здесь f — исходная матрица изображения, g — ядро (матрица) свёртки.

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

При этом в зависимости от метода обработки краёв исходной матрицы результат может быть меньше исходного изображения (valid), такого же размера (same) или большего размера (full).

2 Свёрточный слой

В этом разделе мы рассмотрим устройство свёрточного слоя.

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

В упрощённом виде этот слой можно описать следующей формулой.

Здесь x l — выход слоя l , f () — функция активации, b — коэффициент сдвига, символом ∗ обозначена операция свёртки входа x с ядром k .

При этом за счёт краевых эффектов размер исходных матриц уменьшается.

Здесь x j l — карта признаков j (выход слоя l ), f () — функция активации, b j — коэффициент сдвига для карты признаков j , k j — ядро свёртки номер j , x i l − 1 — карты признаков предыдущего слоя.

tanh ( u ) (гиперболический тангенс). —>

3 Субдискретизирующий слой

В этом разделе мы поговорим про субдискретизирующий (subsampling) слой. Слои этого типа выполняют уменьшение размера входной карты признаков (обычно в 2 раза). Это можно делать разными способами, в данном случае мы рассмотрим метод выбора максимального элемента (max-pooling) — вся карта признаков разделяется на ячейки 2х2 элемента, из которых выбираются максимальные по значению. Формально слой может быть описан следующим образом.

Здесь x l — выход слоя l , f () — функция активации, a,b — коэффициенты, subsample () — операция выборки локальных максимальных значений.

Использование этого слоя позволяет улучшить распознавание образцов с изменённым масштабом (уменьшенных или увеличенных).

4 Слой MLP

Последний из типов слоёв это слой ”обычного” многослойного перцептрона (MLP), его можно описать следующим соотношением.

Здесь x l — выход слоя l , f () — функция активации, b — коэффициент сдвига, w — матрица весовых коэффициентов.

5 О топологии сети

В этом разделе мы поговорим о схеме соединения слоёв между собой.

Рассмотрим свёрточную сеть из 7 слоёв, порядок их следования описан ниже.

  1. входной слой — матрица картинки
  2. свёрточный слой — набор однотипных матриц (карт признаков)
  3. субдискретизирующий слой — уменьшенный в 2 раза предыдущий набор матриц
  4. свёрточный слой — предыдущий набор матриц объединяется в одну, в соответствии со схемой соединения слоёв, и генерируется новый набор
  5. субдискретизирующий слой — уменьшенный в 2 раза предыдущий набор матриц
  6. слой MLP — предыдущий набор матриц разворачивается в вектор и обрабатывается как MLP
  7. слой MLP (выходной)

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

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

6 Метод обучения сети

Для обучения свёрточной сети применяются градиентные методы [4, 6] .

6.1 Вычисление ошибки

Для выходного (MLP) слоя ошибка рассчитывается следующим образом.

Здесь T — ожидаемый (учебный) выход , Y — реальный выход, f ′ ( u ) — производная функции активации по её аргументу

Для скрытых слоёв MLP ошибка имеет следующий вид.

Здесь δ l — ошибка слоя l , f ′ ( u l ) — производная функции активации, u l — состояние (не активированное) нейронов слоя l , W l — матрица весовых коэффициентов слоя l .

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

Здесь δ l — ошибка слоя l , f ′ ( u l ) — производная функции активации, u l — состояние (не активированное) нейронов слоя l , upsample () — операция увеличения размера матриц.

Читайте также:  Пк не видит джойстик ps3

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

Здесь δ l — ошибка слоя l , f ′ ( u l ) — производная функции активации, u l — состояние (не активированное) нейронов слоя l , k — ядра свёртки.

6.2 Вычисление градиента

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

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

Здесь δ l — ошибка слоя l , x l — вход слоя l , k — ядра свёртки.

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

Здесь δ l — ошибка слоя l
Градиент для коэффициентов субдискретизирующего слоя вычисляется следующим образом.

Здесь x l — выход слоя l , δ l — ошибка слоя l , subsample () — операция выборки локальных максимальных значений.

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

Здесь δ l — ошибка слоя l
Градиент для весов MLP выглядит следующим образом.

Здесь δ l — ошибка слоя l , x l — вход слоя l , W l — матрица весовых коэффициентов слоя l .

7 Реализация

В этом разделе описана реализация классификатора рукописных символов на основе свёрточной сети. В качестве учебного набора была использована база MNIST [7] , которая содержит 60 тысяч учебных образов с цифрами от 0 до 9 разного начертания.

Обучение заняло несколько часов. Конечная средня квадратическая ошибка (MSQE) обучения 0.076052.

Проверка итогового качества обучения проводилась на наборе из 10 тысяч образов. Средня квадратическая ошибка на тестах 0.072857 или 344 ошибок и отказов на 10000.

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

Она состоит из трёх частей.
— конвертер БД MNIST в формат системы,
— программа обучения сети, генерирующая рабочие веса классификатора,
— и программа-тест, которая тестирует обученную сеть на конвертированных примерах из БД MNIST.

Сам набор данных MNIST можно скачать на сайте [7] .

7.1 Реализация для Caffe

Caffe является системой моделирования свёрточных сетей, она может использовать для вычислений GPU [9] и работает гораздо быстрее чем представленная выше реализация свёрточной сети на octave, обучение с использованием GPU занимает меньше минуты.

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

Для спецификаций используется язык protobuf [10] . Спецификация состоит из трех следующих файлов, которые можно найти в пакете caffe в каталоге примеров.

    train_test.prototxt — описание сети и данных для обучения, ниже представлена схема сети (кликабельно)

solver.prototxt — параметры метода обучения

deploy.prototxt — описание уже обученной сети для использования в классификаторе, ниже представлена схема сети (кликабельно)

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

  1. входной слой
  2. свёрточный слой
  3. слой выборки (max-pooling)
  4. свёрточный слой
  5. слой выборки (max-pooling)
  6. слой MLP с активацией ReLu
  7. слой MLP с активацией SoftMax

При этом, используется полная связность свёрточных слоёв (все входные карты связаны со всеми выходными), слой max-pooling выполняет только выборку т.е. коэффициенты установлены как a=1,b=0 и не изменяются в процессе обучения, свёрточные и max-pooling слои имеют линейную функцию активации (y=x).

Реализация для Caffe [здесь].

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

[1] LeCun, Yann. "LeNet-5, convolutional neural networks". – http://yann.lecun.com/exdb/lenet/

[2] Fukushima Kunihiko Neocognitron: A Self-organizing Neural Network Model for a Mechanism of Pattern Recognition Unaffected by Shift in Position. // Biological Cybernetics 1980 36 (4)

AlexNet — сверточная нейронная сеть, которая оказала большое влияние на развитие машинного обучения, в особенности — на алгоритмы компьютерного зрения. Сеть с большим отрывом выиграла конкурс по распознаванию изображений ImageNet LSVRC-2012 в 2012 году (с количеством ошибок 15,3% против 26,2% у второго места).

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

Читайте также:  Программа для скачивания аудио видео

Особенности AlexNet

  1. Как функция активации используется Relu вместо арктангенса для добавления в модель нелинейности. За счет этого при одинаковой точности метода скорость становится в 6 раз быстрее.
  2. Использование дропаута вместо регуляризации решает проблему переобучения. Однако время обучения удваивается с показателем дропаута 0,5.
  3. Производится перекрытие объединений для уменьшения размера сети. За счет этого уровень ошибок первого и пятого уровней снижаются до 0,4% и 0,3%, соответственно.

Датасет ImageNet

ImageNet — набор из 15 миллионов помеченных изображений с высоким разрешением, разделенных на 22 000 категорий. Изображения собраны в интернете и помечены вручную с помощью краудсорсинга Amazon’s Mechanical Turk. Начиная с 2010 года проводится ежегодный конкурс ImageNet Large-Scale Visual Recognition Challenge (ILSVRC), являющийся частью Pascal Visual Object Challenge. В челлендже используется часть датасета ImageNet с 1000 изображений в каждой из 1000 категорий. Всего получается 1,2 миллиона изображений для обучения, 50 000 изображений для проверки и 150 000 — для тестирования. ImageNet состоит из изображений с разным разрешением. Поэтому для конкурса их масштабируют до фиксированного разрешения 256 × 256. Если изначально изображение было прямоугольным, то его обрезают до квадрата в центре изображения.

Архитектура

Архитектура сети приведена на рисунке 1. AlexNet содержит восемь слоев с весовыми коэффициентами. Первые пять из них сверточные, а остальные три — полносвязные. Выходные данные пропускаются через функцию потерь softmax, которая формирует распределение 1000 меток классов. Сеть максимизирует многолинейную логистическую регрессию, что эквивалентно максимизации среднего по всем обучающим случаям логарифма вероятности правильной маркировки по распределению ожидания. Ядра второго, четвертого и пятого сверточных слоев связаны только с теми картами ядра в предыдущем слое, которые находятся на одном и том же графическом процессоре. Ядра третьего сверточного слоя связаны со всеми картами ядер второго слоя. Нейроны в полносвязных слоях связаны со всеми нейронами предыдущего слоя.

Таким образом, AlexNet содержит 5 сверточных слоев и 3 полносвязных слоя. Relu применяется после каждого сверточного и полносвязного слоя. Дропаут применяется перед первым и вторым полносвязными слоями. Сеть содержит 62,3 миллиона параметров и затрачивает 1,1 миллиарда вычислений при прямом проходе. Сверточные слои, на которые приходится 6% всех параметров, производят 95% вычислений.

Обучение

AlexNet проходит 90 эпох. Обучение занимает 6 дней одновременно на двух графических процессорах Nvidia Geforce GTX 580, что является причиной того, что сеть разделена на две части. Используется стохастический градиентный спуск со скоростью обучения 0,01, импульсом 0,9 и распадом весовых коэффициентов 0,0005. Скорость обучения делится на 10 после насыщения точности и снижается в 3 раза в течение обучения. Схема обновления весовых коэффициентов w имеет вид:

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

Примеры использования и реализация

Результаты показывают, что большая, глубокая сверточная нейронная сеть способна достигать рекордных результатов на очень сложных датасетах, используя только обучение с учителем. Через год после публикации AlexNet все участники конкурса ImageNet стали использовать сверточные нейронные сети для решения задачи классификации. AlexNet была первой реализацией сверточных нейронных сетей и открыла новую эру исследований. Сейчас реализовать AlexNet стало проще с помощью библиотек глубокого обучения: PyTorch, TensorFlow, Keras.

Результат

Сеть достигает следующего уровня ошибок первого и пятого уровней: 37,5% и 17,0%, соответственно. Лучшая производительность, достигнутая в ходе конкурса ILSVRC-2010, составляла 47,1% и 28,2% при использовании подхода, в котором усредняются предсказания, полученные шестью моделями с разреженным кодированием, обученных на различных векторах свойств. С тех пор достигнуты результаты: 45,7% и 25,7% при использовании подхода, в котором усредняются предсказания двух классификаторов, обучаемых на векторах Фишера. Результаты ILSVRC-2010 приведены в таблице 1.

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

Ссылка на основную публикацию
Самые умные роботы в мире
Получайте на почту один раз в сутки одну самую читаемую статью. Присоединяйтесь к нам в Facebook и ВКонтакте. ASIMO –...
Реболлинг видеокарты в домашних условиях
Возможно, вы помните статью про артефакты видеокарты, где я рассказывал о ситуации с артефактами на видеокарте 8800 GTS. В сервисном...
Ребята отправились в поход
В 6:20 поступил вопрос в раздел ЕГЭ (школьный), который вызвал затруднения у обучающегося. Вопрос вызвавший трудности Ответ подготовленный экспертами Учись.Ru...
Самый быстрый мобильный интернет в россии 2018
Компания Ookla, которая владеет SpeedTest.net, провела исследование скоростей мобильного интернета в России. Именно через этот сервис операторы определяют пропускную способность...
Adblock detector