Поделиться через


Свертка

Convolution (w, input,
             {kernel dimensions}, 
             mapDims = {map dimensions}, 
             stride = {stride dimensions}, 
             sharing = {sharing flags},
             autoPadding = {padding flags (boolean)},
             lowerPad = {lower padding (int)},
             upperPad = {upper padding (int)},
             maxTempMemSizeInSamples = 0)

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

Эта функция работает с входными тензорами формы [M1 x M2 x ... x Mn x inChannels]. Это можно понять как объект ранжированияn , где каждая запись состоит из вектора inChannels-размерности. Например, изображение RGB имеет размеры [W x H x 3], т. е. [W x H]структуру размера, где каждая запись (пиксель) состоит из трех кортежей (обратите внимание, что формат хранения памяти — это объединение 3 плоскости размера [W x H]).

Convolution() преобразует входные данные с n+1одномерными фильтрами, где первые n измерения являются пространственной экстентой фильтра, а последний должен быть равен inChannels. Существуют outChannels фильтры. Т. е. для каждой позиции вывода вычисляется вектор измерения outChannels . Таким образом, общее число параметров фильтра равно (M1*M2*...*Mn) * inChannels * outChannels.

Convolution() имеет следующие параметры:

  • w — весы фильтра свертки, хранящиеся в виде матрицы измерений [outChannels, (M1*M2*...*Mn)], где (M1*M2*...*Mn) должно быть произведение измерений ядра, например 75 для [5 x 5]фильтра размером в 3 входных каналах.
  • input — входные данные свертки. Тензор с измерениями [M1 x M2 x ... x Mn x inChannels].
  • kernel dimensions — измерения фильтров, включая количество входных каналов, заданных как вектор BrainScript. Последнее измерение должно быть равно количеству входных каналов. (5:5:3) Например, для [5 x 5] фильтра для входных данных из 3 каналов.
  • mapDims — [именованный, необязательный, по умолчанию — 0] число выходных каналов (=называется outChannels выше; то же самое, что и глубина результирующей карты признаков). 0 означает использование измерения строки w
  • stride — [именованный, необязательный, по умолчанию — 1] размеры шага. Шаг > 1 означает, что вычисляются только позиции пикселей, кратные значению шага. Например, шаг 2 приведет к половине измерений. Последнее измерение шага, которое соответствует количеству входных каналов, должно быть равно количеству входных каналов.
  • sharing — [именованный, необязательный, по умолчанию — true] флаги общего доступа для каждого входного измерения.
  • autoPadding — [именованный, необязательный, значение по умолчанию имеет значение true] флаги для каждого входного измерения независимо от того, следует ли автоматически заполнять (то есть симметрично) или вообще не заполняться. Заполнение означает, что ядро свертки применяется ко всем позициям пикселей, где все пиксели за пределами области предполагают нулевое значение ("заполнено нулями"). Без заполнения ядра перемещаются только по позициям, где все входные данные ядра по-прежнему попадают в область. В этом случае выходное измерение будет меньше входного измерения. Последнее значение, которое соответствует количеству входных каналов, должно быть false.
  • lowerPad — [именованный, необязательный, по умолчанию — 0] точное нижнее заполнение для каждого входного измерения.
  • upperPad — [именованный, необязательный, по умолчанию — 0] точное верхнее заполнение для каждого входного измерения.
  • maxTempMemSizeInSamples — [именованный необязательный] максимальный объем вспомогательной памяти (в примерах), который должен быть зарезервирован для выполнения операций свертывания. Некоторые подсистемы свертки (например, cuDNN и GEMM)могут воспользоваться рабочей областью, так как это может повысить производительность. Однако иногда это может привести к более высокому использованию памяти. Значение по умолчанию — 0, то же самое, что и входные примеры.

Все значения формы {...} должны быть фактически заданы в виде последовательности значений, разделенных двоеточием, например (5:5) для измерений ядра. (Если вы используете нерекомендуемое NDLNetworkBuilder, они должны быть разделены запятыми и заключены в него { } .)

Пример.

ConvReLULayer(inp, outMap, inMap, kW, kH, hStride, vStride, wScale, bValue) =
[
    W = Parameter (outMap, inMap * kW * kH, init="gaussian", initValueScale=wScale)
    b = Parameter (outMap, 1, init="fixedValue", value=bValue)
    c = Convolution (W, inp, (kW:kH:inMap), stride=(hStride:vStride:inMap), autoPadding=(true:true:false))
    y = RectifiedLinear (c + b)
].y

Примечание. Если вы используете нерекомендуемое NDLNetworkBuilder, в примере не должно быть конечных .y .

Упрощенное 2D-сверток (нерекомендуемое только NDL)

Теперь нерекомендуемый язык NDL предоставляет упрощенный 2D-вариант Convolution():

Convolution (w, image, 
             kernelWidth, kernelHeight, mapDims, 
             horizontalStride, verticalStride,
             zeroPadding=false, maxTempMemSizeInSamples=0, imageLayout="cudnn" /* or "HWC"*/ )

Где:

  • w — матрица веса свертки, она имеет размеры [mapDims, kernelWidth * kernelHeight * inputChannels].
  • image — входное изображение.
  • kernelWidth — ширина ядра
  • kernelHeight — высота ядра
  • mapDims — глубина карты выходных признаков (количество каналов вывода)
  • horizontalStride — шаг в горизонтальном направлении
  • verticalStride — шаг в вертикальном направлении
  • zeroPadding — [именованный необязательный] указывает, следует ли заполнять стороны изображения нулями. Значение по умолчанию — false.
  • maxTempMemSizeInSamples — [именованный необязательный] максимальный объем вспомогательной памяти (в примерах), который должен быть зарезервирован для выполнения операций свертывания. Некоторые подсистемы свертки (например, cuDNN и GEMM)могут воспользоваться рабочей областью, так как это может повысить производительность. Однако иногда это может привести к более высокому использованию памяти. Значение по умолчанию — 0, то же самое, что и входные примеры.
  • imageLayout — [именованный необязательный] формат хранения каждого изображения. Это устаревший вариант. По умолчанию это HWCозначает, что каждый образ хранится как [channel, width, height] основной столбец. Если вы используете cuDNN для ускорения обучения, необходимо задать для него значение cudnn, что означает, что каждый образ хранится как [width, height, channel]. Обратите внимание, что cudnn макет будет работать как на GPU, так и на ЦП, поэтому рекомендуется использовать его по умолчанию.