Как сверточные слои (CNN) работают в керасе? - PullRequest
0 голосов
/ 17 февраля 2019

Я заметил, что в документации keras есть много разных типов слоев Conv, то есть Conv1D, Conv2D, Conv3D.

Все они имеют такие параметры, как filters, kernel_size, strides и padding, которых нет в других keras слоях.

Я виделподобные изображения, которые «визуализируют» Conv слоев,

enter image description here

, но я не понимаю, что происходит при переходе от одного слоя кследующий.

Как изменение вышеуказанных параметров и размеров нашего Conv слоя влияет на то, что происходит в модели?

1 Ответ

0 голосов
/ 17 февраля 2019

Свертки - Основы языковой агностики

Чтобы понять, как свертки работают в кератах, нам необходимо базовое понимание того, как работают свертки в не зависящей от языка обстановке.

enter image description here

Сверточные слои скользят по входу для построения карты активации (также называемой картой объектов).Выше приведен пример двумерной свертки.Обратите внимание, как на каждом шаге темный квадрат 3 X 3 скользит по входу (синий), и для каждой новой части 3 x 3 входного сигнала, которую он анализирует, он выводит значение на нашей карте активации вывода (сине-зеленые прямоугольники наТоп).

Ядра и фильтры

Темный квадрат - это наш kernel.kernel - это матрица весов, которая умножается на каждую часть нашего ввода.Все результаты этих умножений, собранные вместе, образуют нашу карту активации.

Интуитивно, наш kernel позволяет нам повторно использовать параметры - матрица весов, которая обнаруживает глаз в этой части изображения, будет работать для его обнаружения в другом месте;нет смысла настраивать различные параметры для каждой части нашего ввода, когда один kernel может перемещаться и работать везде.Мы можем рассматривать каждый kernel как детектор объектов для одной функции, а его карту активации вывода - как карту вероятности того, что эта функция присутствует в каждой части вашего ввода.

Синонимом kernel является filter.Параметр filters запрашивает количество kernels (признаков-детекторов) в этом Conv слое.Это число также будет размером с последним измерением в вашем выводе, т.е. filters=10 приведет к выходной форме (???, 10).Это связано с тем, что выход каждого слоя Conv представляет собой набор карт активации, и будет filters количество карт активации.

Размер ядра

Хорошо kernel_size, размер для каждого ядра.Ранее мы обсуждали, что каждый kernel состоит из матрицы весов, которая настроена для лучшего и лучшего обнаружения определенных функций.kernel_size определяет размер маски фильтра.На английском языке , сколько "ввода" обрабатывается во время каждой свертки Например, наша диаграмма выше обрабатывает порцию 3 x 3 входных данных каждый раз.Таким образом, он имеет kernel_size (3, 3).Мы также можем назвать вышеприведенную операцию «сверткой 3x3»

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

Шаги

Обратите внимание, как наш выше kernel сдвигается на две единицы каждый раз.Величина, которую kernel «сдвигает» для каждого вычисления, называется strides, поэтому в keras говорят наши strides=2.Вообще говоря, когда мы увеличиваем число strides, наша модель теряет больше информации от одного слоя к следующему, потому что карта активации имеет «пробелы».

Заполнение

Возвращаясь к приведенной выше диаграмме, обратите внимание на кольцо белых квадратов, окружающих наш вход.Это наш padding.Без заполнения, каждый раз, когда мы пропускаем наш ввод через слой Conv, форма нашего результата становится все меньше и меньше.В результате мы pad вводим данные с помощью кольца нулей, которое служит нескольким целям:

  1. Сохраняем информацию по краям.Из нашей диаграммы обратите внимание, что каждый угловой квадрат проходит только один раз, а центральные квадраты проходят четыре раза.Добавление отступов облегчает эту проблему - квадраты, изначально расположенные на краю, сворачиваются больше раз.

  2. padding - это способ контролировать форму нашего вывода.Мы можем упростить работу с фигурами, сохранив выходные данные каждого слоя Conv в той же форме, что и наши входные данные, и мы можем создавать более глубокие модели, когда наша фигура не уменьшается при каждом использовании слоя Conv.

keras обеспечивает три различных типа заполнения.Объяснения в документах очень просты, поэтому они скопированы / перефразированы здесь.Они передаются с padding=..., то есть padding="valid".

valid: без заполнения

same: заполнение входа таким образом, чтобы длина выхода равнялась исходному вводу

causal: приводит к причинно-следственной связи(набранные свертки).Обычно на приведенной выше диаграмме «центр» ядра соответствует значению на выходной карте активации.При каузальных извилинах используется правый край.Это полезно для временных данных, когда вы не хотите использовать будущие данные для моделирования текущих данных.

Conv1D, Conv2D и Conv3D

Интуитивно понятные операции, которые происходят на этих слоях, остаются прежними.Каждый kernel все еще скользит по вашему вводу, каждый filter выводит карту активации для своей собственной функции, и padding все еще применяется.

Разница заключается в количестве свернутых измерений.Например, в Conv1D 1D kernel скользит по одной оси.В Conv2D 2D kernel скользит по двум осям.

Очень важно отметить, что D в слое XD Conv не обозначает количество измерений входных данных,а точнее количество осей, по которым ядро ​​скользит по .

enter image description here

Например, на приведенной выше диаграмме, хотя вход является трехмерным (изображение с каналами RGB), это пример Conv2D слой.Это потому, что есть два пространственных измерения - (rows, cols), и фильтр только скользит вдоль этих двух измерений.Вы можете считать это сверточным в пространственных измерениях и полностью связанным в измерении каналов.

Выход для каждого фильтра также является двухмерным.Это потому, что каждый фильтр скользит в двух измерениях, создавая двумерный вывод.В результате вы также можете думать о ND Conv как о каждом фильтре, выводящем вектор ND.

enter image description here

То же самое можно увидеть с помощью Conv1D (на фото выше).В то время как входные данные являются двумерными, фильтр скользит только вдоль одной оси, что делает это одномерной сверткой.

В keras это означает, что для ConvND требуется, чтобы каждый образец имел размеры N+1 - N для фильтра, чтобы скользить по нему, и одно дополнительное измерение channels.

TLDR - завершение Keras

filters: количество различных kernels в слое.Каждый kernel обнаруживает и выводит карту активации для определенной функции, что делает его последним значением в выходной форме.Т.е. Conv1D выводы (batch, steps, filters).

kernel_size: Определяет размеры каждого kernel / filter / элемента-детектора.Также определяет, сколько входных данных используется для расчета каждого значения в выходных данных.Большой размер = обнаружение более сложных функций, меньше ограничений;однако он склонен к переоснащению.

strides: Сколько единиц вы перемещаете, чтобы получить следующую свертку.Больше strides = больше потери информации.

padding: либо "valid", "causal", либо "same".Определяет, если и как дополнить ввод нулями.

1D vs 2D vs 3D: Обозначает количество осей, по которым движется ядро.Слой ND Conv будет выводить вывод N-D для каждого фильтра, но для каждого семпла потребуется N + 1 размерный ввод.Это составлено из N измерений в поперечном направлении и одного дополнительного измерения channels.

Ссылки:

Интуитивное понимание 1D, 2D и 3D сверток в сверточных нейронных сетях

https://keras.io/layers/convolutional/

http://cs231n.github.io/convolutional-networks/

...