Published · 5 min read

Convoluções para CNNs, A partir de operações de array

Nessas áreas de aplicação, a convolução é frequentemente realizada como um filtro que transforma sinais e pixels em valores mais desejáveis.

No cálculo de alto desempenho, o padrão de convolução é frequentemente referido como cálculo de estêncil. A convolução geralmente envolve um número significativo de operações aritméticas em cada elemento de dados. Cada elemento de dados de saída pode ser calculado independentemente dos outros, uma característica desejável para computação paralela. Por outro lado, há um nível substancial de compartilhamento de dados de entrada entre elementos de dados de saída com condições de contorno um pouco desafiadoras. Isso torna a convolução um caso de uso importante de métodos de divisão em blocos sofisticados e métodos de estagiamento de dados de entrada.

A convolução é uma operação de array em que cada elemento de dados de saída é uma soma ponderada de uma coleção de elementos de entrada vizinhos. Os pesos usados no cálculo da soma ponderada são definidos por uma matriz de máscara de entrada, comumente referida como o núcleo de convolução. Nos referiremos a essas matrizes de máscara como máscaras de convolução. A mesma máscara de convolução é tipicamente usada para todos os elementos do array

Abaixo é mostrado um exemplo de convolução para dados unidimensionais onde uma matriz de máscara de convolução de 5 elementos M é aplicada a uma matriz de entrada de 7 elementos N.

Para processamento de imagens e visão computacional, os dados de entrada são tipicamente arrays bidimensionais, com pixels em um espaço x-y. As convoluções de imagens são, portanto, convoluções 2D. A máscara não precisa ser uma matriz quadrada.


1. De convolução unidimensional para bidimensional

Vocês sabem sobre convolução unidimensional:

  • Entrada: array unidimensional (por exemplo, [x0, x1, x2, ...])
  • Núcleo: pequeno array unidimensional (por exemplo, [w0, w1, w2])
  • Operação: deslizar o núcleo e calcular somas ponderadas.

Para imagens, a entrada é 2D (altura × largura), então:

  • Entrada: matriz de pixels, forma H × W
  • Núcleo: pequena matriz, por exemplo, 3 × 3 ou 5 × 5
  • Operação: colocar o núcleo sobre cada 3 × 3 patch da imagem, multiplicar elemento a elemento, somar → um pixel de saída.

Esta é apenas a mesma ideia que você já conhece, mas:

  • Array → matriz 2D.
  • Elementos vizinhos → pixels vizinhos em 2D.

2. Múltiplos canais (por exemplo, RGB)

Imagens reais não são apenas 2D, elas frequentemente têm canais:

  • Forma: H × W × C (por exemplo, C = 3 para R, G, B).
  • Então um kernel **** também tem profundidade C:
    • Forma: kH × kW × C.

Passo de convolução:

  • Para uma posição, você pega um pequeno cubo: kH × kW × C.
  • Multiplica elemento a elemento com o kernel kH × kW × C.
  • Soma todos os valores → 1 número (um valor de canal de saída naquela localização).

Então, conceitualmente: convolução 3D sobre espaço + canais, mas ainda assim apenas “soma ponderada dos vizinhos”.


3. Filtros (núcleos) e mapas de recursos

Nas CNNs, você não usa apenas um núcleo; você usa muitos:

  • Suponha que você use F núcleos diferentes.
  • Cada núcleo tem forma kH × kW × C_in.
  • Cada núcleo produz um canal de saída, chamado de mapa de recursos.

Então, se a forma de entrada for:

  • H × W × C_in,

e você usar F núcleos, a forma de saída se torna:

  • H_out × W_out × F.

Cada um desses F canais de saída captura um tipo diferente de padrão:

  • Um núcleo pode aprender a detectar arestas, outro cantos, outro texturas, etc.

Pense:
“Uma CNN camada = aplicar muitas convoluções (filtros) diferentes sobre a entrada.”


4. Passo e preenchimento

Dois detalhes adicionais relacionados a matrizes:

  • Passo: quanto você move o kernel a cada passo.
    • Passo 1: mover 1 pixel de cada vez → saída densa.
    • Passo 2: pular cada outro pixel → saída menor.
  • Preenchimento: adicionar zeros ao redor da borda da imagem.
    • Sem preenchimento, a saída fica menor.
    • Com preenchimento, você pode manter a mesma altura/largura.

Matematicamente, ainda é apenas janelas deslizantes e produtos escalares, mas com controle sobre:

  • Quanto você desliza (passo).
  • Se você perde informações de borda (preenchimento).

5. Nolinearidade: adicionando funções de ativação

Até agora, é tudo linear: somas ponderadas. Uma camada CNN adiciona não linearidade:

  • Após a convolução, aplicar uma função de ativação elemento a elemento
    (por exemplo, ReLU(x) = max(0, x)).

Então, uma única camada de convolução **** é:

  1. Convolução (somas lineares ponderadas).
  2. Ativação (não linear).

Essa combinação permite que as CNNs aprendam mapeamentos complexos e não lineares.


6. Empilhando camadas → hierarquias de recursos profundos

Um modelo CNN completo é apenas muitas camadas de:

  • Convolução → ativação (→ às vezes pooling).

Intuição:

  • Camadas iniciais: detectam coisas simples (bordas, manchas).
  • Camadas intermediárias: combinam-nas em texturas, formas.
  • Camadas posteriores: combinam formas em partes de objetos e objetos.

Tudo isso ainda é construído a partir do mesmo primitivo que você entende:
“pegar vizinhanças locais e computar somas ponderadas.”


7. Conexão com camadas totalmente conectadas (densas)

Uma camada totalmente conectada também é apenas somas ponderadas:

  • Entrada: vetor 1D.
  • Unidade de saída = soma de (peso × entrada) + viés.

Diferença:

  • Camada densa: cada unidade de saída utiliza todos os elementos de entrada.
  • Camada de convolução: cada unidade de saída utiliza apenas um bairro local (conectividade esparsa) e compartilha pesos em todas as posições.

Então, você pode ver as CNNs como:

  • Uma forma inteligente de usar a operação de convolução para obter:
    • Localidade (pixels próximos importam mais).
    • Compartilhamento de pesos (mesmo kernel em todas as posições).
    • Menos parâmetros do que uma camada densa em imagens completas.

Conclusão: De Operação Simples a Redes Poderosas

"At each position, take neighbors and compute a weighted sum with a kernel,"

então você já está sobre a ideia central por trás das CNNs.

As CNNs pegam esse bloco de construção simples e:

  • Estendem-no de arrays 1D para tensores 2D/3D.
  • Aplicar muitos kernels diferentes em paralelo para produzir mapas de recursos ricos.
  • Adicionar não linearidades para escapar da pura linearidade.
  • Empilhar muitas camadas dessas para que cada estágio “veja” mais estrutura abstrata.

A magia das CNNs não é um novo tipo de matemática — é a composição de muitas operações de convolução pequenas, locais, em uma arquitetura profunda que pode aprender representações visuais poderosas.

Pronto para contratar com precisão?

Comece grátis, convide toda a sua equipe e veja seu primeiro candidato pontuado em 15 minutos.

pt