Свертка
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, так и на ЦП, поэтому рекомендуется использовать его по умолчанию.