Свертки - Основы языковой агностики
Чтобы понять, как свертки работают в кератах, нам необходимо базовое понимание того, как работают свертки в не зависящей от языка обстановке.
Сверточные слои скользят по входу для построения карты активации (также называемой картой объектов).Выше приведен пример двумерной свертки.Обратите внимание, как на каждом шаге темный квадрат 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
вводим данные с помощью кольца нулей, которое служит нескольким целям:
Сохраняем информацию по краям.Из нашей диаграммы обратите внимание, что каждый угловой квадрат проходит только один раз, а центральные квадраты проходят четыре раза.Добавление отступов облегчает эту проблему - квадраты, изначально расположенные на краю, сворачиваются больше раз.
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 не обозначает количество измерений входных данных,а точнее количество осей, по которым ядро скользит по .
Например, на приведенной выше диаграмме, хотя вход является трехмерным (изображение с каналами RGB), это пример Conv2D
слой.Это потому, что есть два пространственных измерения - (rows, cols)
, и фильтр только скользит вдоль этих двух измерений.Вы можете считать это сверточным в пространственных измерениях и полностью связанным в измерении каналов.
Выход для каждого фильтра также является двухмерным.Это потому, что каждый фильтр скользит в двух измерениях, создавая двумерный вывод.В результате вы также можете думать о ND Conv
как о каждом фильтре, выводящем вектор ND.
То же самое можно увидеть с помощью 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/