Основная идея сверточной нейронной сети, дать возможность ей самостоятельно определять признаки (фичи) по картинке.
На вход подается картинка. Далее она обрабатывается сверточными слоями. Они преобразуют картинку в набор признаков. Далее эти признаки передаются на вход многослойному персептрону (полносвязные слои), который по этим признакам классифицирует картинку.
Сверточный слои можно подключать последовательно друг к другу. Таким образом первая сверточная сеть находит первичные признаки. Второй сверточный слой находит вторичные обощающие признаки, и т.д.
Операция сверстки — это поэлементное умножение элементов слоя на элементы карты активации.
Карта активации — это матрица на которую умножается свертка, чтобы на выходе получить фичи. Для каждой фичи нужна своя карта активации. Соотвественно, если мы хотим получить 32 фичи то нужно 32 карты активации.
Пример работы сверточного слоя
Шаг 1
_x000D_1*1 + 2*-1 + 3*1 + 5*1 + 6*-1 + 7*1 + 9*1 + 10*-1 + 11*1 = 18
Шаг 2
_x000D_2*1 + 3*-1 + 4*1 + 6*1 + 7*-1 + 8*1 + 10*1 + 11*-1 + 12*1 = 21
Шаг 3
_x000D_5*1 + 6*-1 * 7*1 + 9*1 + 10*-1 + 11*1 + 13*1 + 14*-1 + 15*1 = 30
Шаг 4
_x000D_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.
В данном случае при размере карты активации 3×3 умножаются на элементы слоя через 1 элемент.
Padding
padding — отступ, который добавляется к слою сверху, снизу, слева и справа.
В данном случае слой был 3×3. К нему добавляются со всех сторон padding=1. И получается слой равным 5×5.
Обработка RGB картинок
Допустим, есть RGB картинка 32x32x3. Для обработки RGB картинки есть два способа.
Первый способ обработать картинку 3D сверткой. 3D свертка — это свертка, в которой карта активации 3мерная, а не 2мерная. Обработав картинку сверткой 3x3x3 получим фичу размером 30x30x1.
Второй способ переставить канал RGB в начало слоя. Сделать это можно через функцию torch.moveaxis
Преобразуем 32x32x3 => 3x32x32 и применяем двумерную свертку к каждом каналу цвета.