Compartilhar via


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. Essa operação é usada em aplicativos de processamento de imagens e processamento de idioma. Ele dá suporte a dimensões, passo a passo, compartilhamento ou preenchimento.

Essa função opera em tensores de entrada do formulário [M1 x M2 x ... x Mn x inChannels]. Isso pode ser entendido como um objeto de classificaçãon , em que cada entrada consiste em um inChannelsvetor dimensional. Por exemplo, uma imagem RGB teria dimensões [W x H x 3], ou seja, uma [W x H]estrutura do tamanho, em que cada entrada (pixel) consiste em uma tupla de 3 (observe, 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+1filtros dimensionais, em que 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, um vetor de dimensão outChannels é calculado. Portanto, 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 uma matriz de dimensões [outChannels, (M1*M2*...*Mn)], onde (M1*M2*...*Mn) deve ser o produto das dimensões do kernel, por exemplo 75 , para um [5 x 5]filtro de tamanho em três 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 em uma entrada de 3 canais.
  • mapDims - [nomeado, opcional, padrão é 0] número de canais de saída (=chamado outChannels acima; mesmo que a profundidade do mapa de recursos resultante). 0 significa usar a dimensão de linha de w
  • stride - [nomeado, opcional, padrão é 1] dimensões passo a passo. Um passo > 1 significa que apenas as posições de pixel que são múltiplas do valor passo são computadas. Por exemplo, um passo de 2 levará a uma redução pela metade das dimensões. A última dimensão passo a 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, padrão é verdadeiro] compartilhando sinalizadores para cada dimensão de entrada
  • autoPadding - [nomeado, opcional, padrão é verdadeiro] sinalizadores para cada dimensão de entrada se ele deve ser acolchoado automaticamente (ou seja, simetricamente) ou não acolchoado em tudo. Preenchimento significa que o kernel de convolução é aplicado a todas as posições de pixel, em que todos os pixels fora da área são considerados zero ("acolchoados com zeros"). Sem preenchimento, os kernels são deslocados apenas sobre posições em que todas as entradas para o kernel ainda caem dentro da área. Nesse caso, a dimensão de saída será menor que a dimensão de entrada. O último valor que se alinha com o número de canais de entrada deve ser false.
  • lowerPad - [nomeado, opcional, padrão é 0] preenchimento inferior preciso para cada dimensão de entrada.
  • upperPad - [nomeado, opcional, padrão é 0] preenchimento superior preciso para cada dimensão de entrada.
  • maxTempMemSizeInSamples - [nomeado opcional] quantidade máxima de memória auxiliar (em exemplos) que deve ser reservada para executar operações de convolução. Alguns mecanismos de convolução (por exemplo, mecanismos baseados em cuDNN e GEMM) podem se beneficiar do uso do workspace, pois podem melhorar o desempenho. No entanto, às vezes isso pode levar a uma maior utilização de memória. O padrão é 0, o que significa o mesmo que os exemplos de entrada.

Todos os valores do formulário {...} devem realmente ser fornecidos como uma sequência de valores separada por dois pontos, por exemplo (5:5) , para as dimensões do kernel. (Se você usar o preterido NDLNetworkBuilder, eles deverão ser separados por vírgula e fechados 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

Observação: se você estiver usando o preterido NDLNetworkBuilder, não deverá haver nenhum trailing .y no exemplo.

Simplified 2D Convolution (somente NDL preterido)

A linguagem NDL agora preterida 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 kernel
  • kernelHeight - altura do kernel
  • mapDims - profundidade do mapa do recurso de saída (número de canais de saída)
  • horizontalStride - passo na direção horizontal
  • verticalStride - passo na direção vertical
  • zeroPadding - [nomeado opcional] especifica se os lados da imagem devem ser acolchoados com zeros. O padrão é false.
  • maxTempMemSizeInSamples - [nomeado opcional] quantidade máxima de memória auxiliar (em exemplos) que deve ser reservada para executar operações de convolução. Alguns mecanismos de convolução (por exemplo, mecanismos baseados em cuDNN e GEMM) podem se beneficiar do uso do workspace, pois podem melhorar o desempenho. No entanto, às vezes isso pode levar a uma maior utilização de memória. O padrão é 0, o que significa o mesmo que os exemplos de entrada.
  • imageLayout - [nomeado opcional] o formato de armazenamento de cada imagem. Essa é uma opção herdada. Por padrão, ela é HWC, o que significa que cada imagem é armazenada como [channel, width, height] na coluna principal. Se você usar cuDNN para acelerar o treinamento, defina-o como cudnn, o que significa que cada imagem é armazenada como [width, height, channel]. Observe que cudnn o layout funcionará tanto na GPU quanto na CPU, portanto, é recomendável usá-lo por padrão.