Convolução
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 a convolução de uma matriz de peso com uma imagem ou tensor. Esta operação é utilizada em aplicações de processamento de imagem e processamento de idiomas. Suporta quaisquer dimensões, passo, partilha ou estofamento.
Esta função funciona nos tensores de entrada do formulário [M1 x M2 x ... x Mn x inChannels]
. Isto pode ser entendido como um objeto de classificaçãon
, onde cada entrada consiste de um inChannels
vetor -dimensional.
Por exemplo, uma imagem RGB teria dimensões [W x H x 3]
, ou seja, uma [W x H]
estrutura de tamanho, onde cada entrada (pixel) consiste num 3-tuple (note-se, no entanto, que o formato de armazenamento de memória é a concatenação de 3 planos de tamanho [W x H]
).
Convolution()
envolve a entrada com n+1
filtros -dimensional, onde as primeiras n
dimensões são a extensão espacial do filtro, e a última deve ser igual a inChannels
. Há outChannels
filtros. Ou seja, para cada posição de saída, é calculado um vetor de dimensão outChannels
. Assim, o número total de parâmetros de filtro é (M1*M2*...*Mn) * inChannels * outChannels
.
Convolution()
tem os seguintes parâmetros:
w
- pesos de filtro de convolução, armazenados como matriz de dimensões[outChannels, (M1*M2*...*Mn)]
, onde(M1*M2*...*Mn)
deve ser o produto das dimensões do núcleo, por exemplo75
, para um[5 x 5]
filtro de tamanho em 3 canais de entrada.input
- entrada de convolução. Um tensor com dimensões[M1 x M2 x ... x Mn x inChannels]
.kernel dimensions
- dimensões dos filtros , incluindo o número de canais de entrada, dado como um vetor BrainScript. A última dimensão deve ser igual ao número de canais de entrada. Por exemplo,(5:5:3)
para um[5 x 5]
filtro numa entrada de 3 canais.mapDims
- [nomeado, opcional, o padrão é 0] número de canais de saída (=acima;outChannels
o mesmo que a profundidade do mapa de características resultante). 0 significa utilizar a dimensão da linha dew
stride
- [nomeado, opcional, o padrão é 1] dimensões de passo. Um passo > 1 significa que apenas posições de pixel que são múltiplos do valor do passo são calculadas. Por exemplo, um passo de 2 levará a uma redução para metade das dimensões. A última dimensão do passo que se alinha com o número de canais de entrada deve ser igual ao número de canais de entrada.sharing
- [nomeado, opcional, o padrão é verdadeiro] partilhando bandeiras para cada dimensão de entradaautoPadding
- bandeiras [nomeadas, opcionais, predefinidas] para cada dimensão de entrada, quer devam ser acolchoadas automaticamente (isto é, simetricamente) ou não acolchoadas. O estofamento significa que o núcleo de convolução é aplicado a todas as posições dos pixels, onde todos os pixels fora da área são assumidos zero ("acolchoado com zeros"). Sem estofos, os núcleos são apenas deslocados sobre posições onde todas as entradas para o núcleo ainda caem dentro da área. Neste caso, a dimensão de saída será inferior à dimensão de entrada. O último valor que alinha com o número de canais de entrada deve serfalse
.lowerPad
- [nomeado, opcional, predefinido é 0] estofamento inferior preciso para cada dimensão de entrada.upperPad
- [nomeado, opcional, predefinido é 0] estofamento superior preciso para cada dimensão de entrada.maxTempMemSizeInSamples
- [nomeado opcional] quantidade máxima de memória auxiliar (em amostras) que deve ser reservada para a realização de operações de convolução. Alguns motores de convolução (por exemplo, motores baseados em cuDNN e GEMM) podem beneficiar da utilização do espaço de trabalho, uma vez que pode melhorar o desempenho. No entanto, às vezes isto pode levar a uma maior utilização da memória. O padrão é 0, o que significa o mesmo que as amostras de entrada.
Todos os valores da forma {...}
devem efetivamente ser dados como uma sequência de valores separada do cólon, por exemplo (5:5)
, para as dimensões do núcleo. (Se utilizar o precintado NDLNetworkBuilder
, estes devem ser separados em { }
vírgula e em vez disso.)
Exemplo:
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: Se estiver a utilizar o prevadado NDLNetworkBuilder
, não deve haver qualquer pista .y
no exemplo.
Convolução 2D simplificada (apenas NDL precotado)
A linguagem NDL agora prevadizada forneceu uma variante 2D simplificada de Convolution()
:
Convolution (w, image,
kernelWidth, kernelHeight, mapDims,
horizontalStride, verticalStride,
zeroPadding=false, maxTempMemSizeInSamples=0, imageLayout="cudnn" /* or "HWC"*/ )
em que:
w
- matriz de peso de convolução, tem as dimensões de[mapDims, kernelWidth * kernelHeight * inputChannels]
.image
- a imagem de entrada.kernelWidth
- largura do núcleokernelHeight
- altura do núcleomapDims
- mapa de características de saída (número de canais de saída)horizontalStride
- passo na direção horizontalverticalStride
- passo na direção verticalzeroPadding
- [nomeado opcional] especifica se os lados da imagem devem ser acolchoados com zeros. A predefinição é falso.maxTempMemSizeInSamples
- [nomeado opcional] quantidade máxima de memória auxiliar (em amostras) que deve ser reservada para a realização de operações de convolução. Alguns motores de convolução (por exemplo, motores baseados em cuDNN e GEMM) podem beneficiar da utilização do espaço de trabalho, uma vez que pode melhorar o desempenho. No entanto, às vezes isto pode levar a uma maior utilização da memória. O padrão é 0, o que significa o mesmo que as amostras de entrada.imageLayout
- [nomeado opcional] o formato de armazenamento de cada imagem. Esta é uma opção antiga. Por padrão é , oHWC
que significa que cada imagem é armazenada como[channel, width, height]
na coluna maior. Se utilizar o cuDNN para acelerar o treino, deve defini-lo paracudnn
, o que significa que cada imagem é armazenada como[width, height, channel]
. Note que ocudnn
layout funcionará tanto na GPU como no CPU, pelo que é recomendado usá-lo por padrão.