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

Основная идея сверточной нейронной сети, дать возможность ей самостоятельно определять признаки (фичи) по картинке.

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

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

Операция сверстки - это поэлементное умножение элементов слоя на элементы карты активации.

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

Пример работы сверточного слоя

Шаг 1

1*1 + 2*-1 + 3*1 + 5*1 + 6*-1 + 7*1 + 9*1 + 10*-1 + 11*1 = 18

Шаг 2

2*1 + 3*-1 + 4*1 + 6*1 + 7*-1 + 8*1 + 10*1 + 11*-1 + 12*1 = 21

Шаг 3

5*1 + 6*-1 * 7*1 + 9*1 + 10*-1 + 11*1 + 13*1 + 14*-1 + 15*1 = 30

Шаг 4

6*1 + 7*-1 + 8*1 + 10*1 + 11*-1 + 12*1 + 14*1 + 15*-1 + 16*1 = 33

Размер карты активации

kernel_size - размер карты активации

Шаг свертки

stride - шаг свертки. Шаг свертки может быть по оси X, так и по оси Y

Dilation

dilation - растяжение свертки. Шаг умножения элементов слоя. Элементы слоя умножаются не через 1, а через dilation.

В данном случае при размере карты активации 3x3 умножаются на элементы слоя через 1 элемент.

Padding

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

В данном случае слой был 3x3. К нему добавляются со всех сторон padding=1. И получается слой равным 5x5.

Обработка RGB картинок

Допустим, есть RGB картинка 32x32x3. Для обработки RGB картинки есть два способа.

Первый способ обработать картинку 3D сверткой. 3D свертка - это свертка, в которой карта активации 3мерная, а не 2мерная. Обработав картинку сверткой 3x3x3 получим фичу размером 30x30x1.

Второй способ переставить канал RGB в начало слоя. Сделать это можно через функцию torch.moveaxis

Преобразуем 32x32x3 => 3x32x32 и применяем двумерную свертку к каждом каналу цвета.

Литература

Теория:

  1. Введение в сверточные нейронные сети
  2. Создаём классификатор изображений
  3. Лекция. История развития сверточных нейронных сетей.
  4. Лекция. Сверточные нейронные сети.
  5. Лекция. Пулинг. Операция пулинга.
  6. Лекция. Задачи компьютерного зрения.
  7. Лекция. Архитектуры CNN.
  8. Лекция. Transfer Learning.
  9. Семантическая сегментация. Введение
  10. Семантическая сегментация. Трюки: Deconvolution, Dilated Convolution
  11. Семантическая сегментация. Архитектура UNet
  12. Object Detection: лекция
  13. Основы нейронных сетей и Deep Learning | Технострим
  14. Как работают сверточные нейронные сети
  15. Матричные фильтры обработки изображений
  16. Как начать работу с Keras, Deep Learning и Python по версии Reg.ru
  17. Image Classification via Deep Learning
  18. Сверточный слой: методы оптимизации основанные на матричном умножении
  19. Новые архитектуры нейросетей

Практика:

  1. Семинар: Нейросети в компьютерном зрении: практика (08.12.2019)
  2. Object Detection: практика