Свёрточная нейронная сеть - AstridSamsonova/cnn GitHub Wiki

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

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


Её задача — это приём начального изображения на вход и вывод его класса (кошка, собака и т.д.) или группы вероятных классов. Входные данные – изображение. Изображение для компьютера, это массив пикселей. В зависимости от разрешения и размера изображения, размер массива может быть 32х32х3 (где глубина 3 — это значения каналов RGB). Например, цветное изображение в формате JPG, и его размер 480х480. Соответствующий массив будет 480х480х3. Каждому из этих чисел присваивается значение от 0 до 255, которое описывает интенсивность пикселя в этой точке. Эти цифры являются единственными входными данными, доступными компьютеру. Идея в том, что вы даете компьютеру эту матрицу, а он выводит числа, которые описывают вероятность класса изображения (.80 для кошки, .15 для собаки, .05 для птицы и т.д.).


Общее описание работы

Нам нужно, чтобы компьютер мог различать изображения и распознавать уникальные особенности, которые делают собаку собакой, а кошку кошкой. Работа СНС в общем представлении, это переход от конкретных особенностей изображения к более абстрактным деталям, и далее к ещё более абстрактным деталям… до выделения понятий высокого уровня. При этом сеть самонастраивается и вырабатывает сама необходимую иерархию абстрактных признаков (последовательности карт признаков), фильтруя маловажные детали и выделяя существенное.

Если конкретнее, берётся изображение, пропускается через серию свёрточных (convolution layers), нелинейных слоев, слоев объединения и полносвязных слоёв, и генерируется вывод (класс или вероятность классов, которые лучше всего описывают изображение).


Что делает каждый слой

Первый слой всегда свёрточный. Входное изображение — это матрица с пиксельными значениями размером, например, 32х32х3. Свёрточный слой или фильтр (или нейрон, ядро) — это матрица размером, например, 5х5х3 (такую матрицу ещё называют матрицей весов или матрицей параметров). Глубина у этого фильтра должна быть такой же, как и глубина входного изображения. Свертка производится следующим образом — фильтр «скользит» по входным данным и умножает значения матрицы фильтра на исходные значения тех пикселей матрицы изображения (поэлементное умножение) над которыми в данный момент находится. В нашем примере получится 75 умножений, все эти умножения суммируются, в итоге получается одно число. Это число просто символизирует нахождение фильтра в верхнем левом углу изображения. Следующий шаг – перемещение фильтра вправо на единицу и так далее, процесс повторяется в каждой позиции. И каждая уникальная позиция исходного изображения производит число. После прохождения фильтра по всем позициям из матрицы 32х32 получается матрица 28х28, которую называют функцией активации или картой признаков. Получается матрица 28х28 т.к. при наложении фильтра 5х5 на изображение 32х32 может получится только 784 различных локации фильтра. Так происходит свертка.
picture of first hidden lyaer


Про свертку подробнее. Первый слой

Каждый фильтр можно рассматривать как идентификатор свойства (прямые границы, простые цвета и кривые). Т.е. самые простые характеристики, которые имеют все изображения в общем. Например, фильтр 7х7х3, и он будет детектором кривых. Для простоты игнорируем глубину 3 и рассматриваем только верхний слой фильтра и изображения. У фильтра пиксельная структура, в которой вдоль области, определяющей форму кривой, численные значения выше. картинка_пример_фильтра_7х7
Возьмем пример изображения, которому надо присвоить класс и установим фильтр в верхнем левом углу: фильтр_кривой_на_исх_изображении

Значения фильтра умножаются на значения пикселей исходного изображения той области, на которую накладывается фильтр. Если на входном изображении есть форма, похожая на кривую фильтра и все умножения суммируются, то получится большое значение. картинка_умножение_фильтра_на_изобр_влевомуглу Теперь рассмотрим положение фильтра в другой области изображения. Значение будет сильно ниже потому, что в новой области изображения нет ничего, что мог засечь фильтр кривой. картинка_умножение_фильтра_на_изобр_вправомуглу Вывод свёрточного слоя — карта свойств. В нашем простом примере этот фильтр — детектор кривой, карта свойств покажет области, в которых больше вероятности наличия кривых. В левом верхнем углу значение нашей 28х28х1 карты свойств будет 6600, что показывает, что что-то похожее на кривую присутствует на изображении, и такая вероятность активировала фильтр. В правом верхнем углу значение у карты свойств будет 0, нет ничего, что могло активировать фильтр, т.е. кривой нет. Это только один фильтр. Могут быть другие фильтры для других типов линий. Чем больше фильтров, тем больше глубина карты свойств, и тем больше информации мы имеем о входном изображении.

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

картинка_с_примерами_фильтров