Свертка
Начать надо с того, что цвета на цифровых устройствах закодированы числами. Чаще, используется RGB модель, но бывают и другие. Если картинка представлена в RGB, то это значит, что каждый пиксель состоит из набора трех цифр, где первая цифра говорит об оттенке красного (Red), вторая — об оттенке зеленого (Green) и последняя — об оттенке синего (Blue). Так картинка представляется в виде массива размерностью 3 × height × width:
Однако, ниже будет использоваться черно-белая цветовая модель чтобы работать не в трехмерном пространстве, а в двумерном (хотя, в случае куба, все операции будут аналогичны). Так мы смотрим на изображение как на массив размерности height × width.
При хранении изображений, чаще всего, интенсивность цветов кодируется числами от 0 до 255. Однако, при работе с нейросетями (в тензорах), изображения необходимо привести в диапазон от 0 до 1 (достаточно просто разделить все числа на 255) и нормализовать (отнять поканальное среднее и разделить стандартное отклонение).
Свертка — это наложение на разные участки изображения небольших фильтров (ядер, обычно, размерности 3, 5 или 7) чтобы получить карту активаций, которая показывает насколько сильно фильтр похож на участок изображения. Похожесть определяется как скалярное умножение.
Почему в качестве похожестей используется скалярное умножение
Если рассматривать расстояние как . При этом и — нормированные вектора, а, значит, вносят константные значения в расстояние, как и 2. Остается только , которое и является скалярным произведением в случае векторов. Если вектора не отнормированы, то скалярное произведение не сработает.
Выглядит это так:
Шаг свертки (stride) можно брать больше единицы для экономии ресурсов.
Поскольку свертка — линейная дифференцируемая операция, ее используют в нейронных сетях. Оптимизируется ядро свертки с помощью градиентного спуска.
Например, если в задаче нужно классифицировать, есть ли котик на изображении, то, в процессе обучения, ядро свертки будет подстраивается так, что наибольшее скалярное произведение (высокая активация нейрона) получится только с теми картинками, на которых будет котик.
Нейронные сети состоят из нескольких сверточных слоев (Convolution Layers): к получившейся карте активации применяется еще раз свертка. При этом, каждый следующий слой позволяет взглянуть на бо́льшие кусочки оригинального изображения (receptive field). А каждая следующая карта активаций становится меньше:
Сохранить размерность, а так же дать лучшую активацию для объектов на границах изображения, позволяет padding — рамка вокруг изображения. Обычно рамка заполняется нулями вокруг изображения, но, бывает, используют отображение или цикличность.
Размер карты активаций для одного сверточного слоя:
Размер Receptive field на n-ом сверточном слое: