Convolución
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()
calcula la convolución de una matriz de peso con una imagen o tensor. Esta operación se usa en aplicaciones de procesamiento de imágenes y procesamiento de lenguaje. Admite cualquier dimensión, paso, uso compartido o relleno.
Esta función funciona en tensores de entrada del formato [M1 x M2 x ... x Mn x inChannels]
. Esto se puede entender como un objeto rank-n
, donde cada entrada consta de un inChannels
vector dimensional.
Por ejemplo, una imagen RGB tendría dimensiones [W x H x 3]
, es decir, una [W x H]
estructura de tamaño, donde cada entrada (píxel) consta de una tupla de 3 (tenga en cuenta, sin embargo, que el formato de almacenamiento de memoria es la concatenación de 3 planos de tamaño [W x H]
).
Convolution()
convolvía la entrada con n+1
filtros dimensionales, donde las primeras n
dimensiones son la extensión espacial del filtro y la última debe ser igual a inChannels
. Hay outChannels
filtros. Es decir, para cada posición de salida, se calcula un vector de dimensión outChannels
. Por lo tanto, el número total de parámetros de filtro es (M1*M2*...*Mn) * inChannels * outChannels
.
Convolution()
tiene los parámetros siguientes:
w
- pesos de filtro de convolución, almacenados como una matriz de dimensiones[outChannels, (M1*M2*...*Mn)]
, donde(M1*M2*...*Mn)
debe ser el producto de las dimensiones del kernel, por ejemplo75
, para un[5 x 5]
filtro de tamaño en 3 canales de entrada.input
- entrada de convolución. Tensor con dimensiones[M1 x M2 x ... x Mn x inChannels]
.kernel dimensions
- dimensiones de los filtros , incluido el número de canales de entrada, dados como vector BrainScript. La última dimensión debe ser igual al número de canales de entrada. Por ejemplo,(5:5:3)
para un[5 x 5]
filtro en una entrada de 3 canales.mapDims
- [con nombre, opcional, el valor predeterminado es 0] número de canales de salida (=llamadooutChannels
anteriormente; igual que la profundidad del mapa de características resultante). 0 significa usar la dimensión de fila dew
stride
- [con nombre, opcional, el valor predeterminado es 1] dimensiones de paso. Un paso > 1 significa que solo se calculan las posiciones de píxeles que son múltiplo del valor de paso. Por ejemplo, un paso de 2 dará lugar a una reducción a la mitad de las dimensiones. La última dimensión de paso que se alinea con el número de canales de entrada debe ser igual al número de canales de entrada.sharing
- [named, optional, default is true] sharing flags for each input dimensionautoPadding
- [named, optional, default is true] flags for each input dimension whether it should be padded automatically (es decir, symmetrically) or not padded at all. Relleno significa que el kernel de convolución se aplica a todas las posiciones de píxeles, donde todos los píxeles fuera del área se asumen cero ("rellenados con ceros"). Sin relleno, los kernels solo se desplazan sobre las posiciones en las que todas las entradas al kernel todavía se encuentran dentro del área. En este caso, la dimensión de salida será menor que la dimensión de entrada. El último valor que se alinea con el número de canales de entrada debe serfalse
.lowerPad
- [con nombre, opcional, el valor predeterminado es 0] relleno inferior preciso para cada dimensión de entrada.upperPad
- [con nombre, opcional, el valor predeterminado es 0] relleno superior preciso para cada dimensión de entrada.maxTempMemSizeInSamples
- [opcional con nombre] cantidad máxima de memoria auxiliar (en muestras) que se deben reservar para realizar operaciones de convolución. Algunos motores de convolución (por ejemplo, cuDNN y motores basados en GEMM) pueden beneficiarse del uso del área de trabajo, ya que puede mejorar el rendimiento. Sin embargo, a veces esto puede dar lugar a un mayor uso de memoria. El valor predeterminado es 0, lo que significa lo mismo que las muestras de entrada.
Todos los valores del formulario {...}
deben proporcionarse realmente como una secuencia separada por dos puntos de valores, por ejemplo (5:5)
, para las dimensiones del kernel. (Si usa el en desuso NDLNetworkBuilder
, estos deben estar separados por comas y encerrados en { }
su lugar).
Ejemplo:
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
Nota: Si usa el en desuso NDLNetworkBuilder
, no debe haber ninguna pista .y
en el ejemplo.
Convolución 2D simplificada (solo NDL en desuso)
El lenguaje NDL ahora en desuso proporcionó una variante 2D simplificada de Convolution()
:
Convolution (w, image,
kernelWidth, kernelHeight, mapDims,
horizontalStride, verticalStride,
zeroPadding=false, maxTempMemSizeInSamples=0, imageLayout="cudnn" /* or "HWC"*/ )
donde:
w
- matriz de peso de convolución, tiene las dimensiones de[mapDims, kernelWidth * kernelHeight * inputChannels]
.image
: la imagen de entrada.kernelWidth
: ancho del kernelkernelHeight
: alto del kernelmapDims
- profundidad del mapa de características de salida (número de canales de salida)horizontalStride
- paso en dirección horizontalverticalStride
- paso en dirección verticalzeroPadding
- [con nombre opcional] especifica si los lados de la imagen deben rellenarse con ceros. El valor predeterminado es False.maxTempMemSizeInSamples
- [opcional con nombre] cantidad máxima de memoria auxiliar (en muestras) que se deben reservar para realizar operaciones de convolución. Algunos motores de convolución (por ejemplo, cuDNN y motores basados en GEMM) pueden beneficiarse del uso del área de trabajo, ya que puede mejorar el rendimiento. Sin embargo, a veces esto puede dar lugar a un mayor uso de memoria. El valor predeterminado es 0, lo que significa lo mismo que las muestras de entrada.imageLayout
- [con nombre opcional] el formato de almacenamiento de cada imagen. Se trata de una opción heredada. De forma predeterminada, esHWC
, lo que significa que cada imagen se almacena como[channel, width, height]
en la columna principal. Si usa cuDNN para acelerar el entrenamiento, debe establecerlocudnn
en , lo que significa que cada imagen se almacena como[width, height, channel]
. Tenga en cuenta que elcudnn
diseño funcionará tanto en GPU como en CPU, por lo que se recomienda usarlo de forma predeterminada.