Свертка

Начать надо с того, что цвета на цифровых устройствах закодированы числами. Чаще, используется RGB модель, но бывают и другие. Если картинка представлена в RGB, то это значит, что каждый пиксель состоит из набора трех цифр, где первая цифра говорит об оттенке красного (Red), вторая — об оттенке зеленого (Green) и последняя — об оттенке синего (Blue). Так картинка представляется в виде массива размерностью 3 × height × width:

967193142839ea06b018a3ae6ae62b24.png

Однако, ниже будет использоваться черно-белая цветовая модель чтобы работать не в трехмерном пространстве, а в двумерном (хотя, в случае куба, все операции будут аналогичны). Так мы смотрим на изображение как на массив размерности height × width.

При хранении изображений, чаще всего, интенсивность цветов кодируется числами от 0 до 255. Однако, при работе с нейросетями (в тензорах), изображения необходимо привести в диапазон от 0 до 1 (достаточно просто разделить все числа на 255) и нормализовать (отнять поканальное среднее и разделить стандартное отклонение).

Свертка — это наложение на разные участки изображения небольших фильтров (ядер, обычно, размерности 3, 5 или 7) чтобы получить карту активаций, которая показывает насколько сильно фильтр похож на участок изображения. Похожесть определяется как скалярное умножение.

Почему в качестве похожестей используется скалярное умножение

Если рассматривать расстояние как (x - y)^2 = x^2 + y^2 - 2xy. При этом xи y — нормированные вектора, а, значит, вносят константные значения в расстояние, как и 2. Остается только xy, которое и является скалярным произведением в случае векторов. Если вектора не отнормированы, то скалярное произведение не сработает.

Выглядит это так:

2a26b1a9d6a967a3dbaca90641a95836.png

Шаг свертки (stride) можно брать больше единицы для экономии ресурсов.

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

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

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

f5c61f1d1d8f5f89142d024d4d0fba3f.png

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

45041a14ef46d8b5876358f342bfdcb6.png

Размер карты активаций для одного сверточного слоя:

CF = \frac{(image + 2 \cdot padding - kernel)}{stride} + 1

Размер Receptive field на n-ом сверточном слое:

rf_n = (kelnell_n - 1) \cdot \prod_{i = 1}^{n-1} stride_i + rf_{n-1}

© Habrahabr.ru