Pull to refresh

Свертка

Level of difficultyEasy
Reading time2 min
Views4.4K

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

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

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

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

Почему скалярное произведение?

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

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

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

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

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

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

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

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

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}

Tags:
Hubs:
Total votes 12: ↑9 and ↓3+6
Comments5

Articles