Redes Neurais Convolucionais

Escrito por Samuel Santiago

Pré-requisito: Redes Neurais.

1. Introdução

Reconhecemos facilmente o número 5 na imagem, mas uma rede neural recebe apenas os valores dos seus pixels. Nesta imagem em tons de cinza, cada pixel é representado por uma intensidade de 0 (preto) a 255 (branco). O dígito pertence ao conjunto MNIST. Se a imagem fosse colorida, precisaríamos de três números por pixel, um para cada canal RGB, mas não lidaremos com esse caso por enquanto.

O reconhecimento de dígitos é um caso de classificação, que atribui um rótulo à imagem. Redes convolucionais também podem ser usadas no processamento de imagens (por exemplo, remoção de ruído), na detecção de objetos (classes e posições) e na segmentação semântica (uma classe por pixel). Essas tarefas podem exigir saídas e arquiteturas diferentes.

Dígito 5 manuscrito, com uma região quadrada marcada em azul. Duas linhas diagonais ligam o quadrado à sua ampliação, na qual cada célula mostra o valor exato do pixel original, de 0 a 255.

A posição dos pixels é tão importante quanto seus valores. Uma borda aparece quando a intensidade muda de uma região para outra; isso só pode ser percebido comparando pixels vizinhos. Ao acompanhar essas mudanças, começamos a identificar linhas e curvas, como as que compõem o número 5.

Essa é a intuição por trás de uma CNN: construir padrões mais complexos a partir de padrões simples. Nas primeiras camadas, os filtros podem responder a contrastes, bordas e pequenos traços. As camadas seguintes combinam essas respostas para representar estruturas maiores, como curvas e partes do dígito. Por fim, a rede usa a combinação dessas características para estimar qual número aparece na imagem. Os padrões que cada filtro detecta não são definidos manualmente: seus pesos são ajustados durante o treinamento.

Para isso, cada filtro de uma camada convolucional percorre pequenas regiões da entrada, reutilizando os mesmos pesos em diferentes posições. Suas respostas indicam onde certos padrões aparecem e servem de entrada para as camadas seguintes.

Para entender como isso funciona, vamos usar uma janela de 3 × 3 pixels.

2. Convolução e mapas de ativação

Chamamos de filtro, ou kernel, o pequeno conjunto de pesos que percorre a imagem. Em cada posição, multiplicamos os valores dos pixels pelos pesos correspondentes e somamos os produtos. Essa soma é a resposta do filtro naquela região.

Por exemplo, um filtro que atribui pesos negativos à esquerda e positivos à direita responde à diferença de intensidade entre os dois lados. Uma região uniforme dá resposta zero; uma transição pode produzir uma resposta positiva ou negativa. É assim que um filtro pode destacar bordas.

Deslocando a janela por toda a imagem, obtemos uma resposta em cada posição. Essas respostas formam um mapa de características: ele indica onde e com que intensidade o padrão procurado aparece. Como os mesmos pesos são usados em todas as posições, o filtro pode detectar um traço em diferentes lugares.

Pode ser difícil imaginar como uma matriz de números produz padrões reconhecíveis. Por isso, fiz este interativo para vocês brincarem com os filtros. Movam o cursor sobre o dígito (ou o dedo na tela) e troquem os filtros para observar as diferenças.

Imagem
Mapa de ativações

Mova o cursor ou o dedo sobre o número à esquerda. A janela e a resposta acompanham o movimento.

Pixels
×
Filtro
Soma dos produtos
322Após ReLU: 322

O mapa à direita mostra as respostas após a ReLU, já explicada na aula de Redes Neurais. Ela zera os valores negativos; por isso, uma região escura do mapa não significa necessariamente ausência de contraste.

Expressão matemática (opcional)

Para escrever essa operação de forma geral, sejam X os pixels da imagem, K os pesos do filtro e b um viés. A resposta da janela que começa em (i, j) é:

No interativo, b = 0. A operação mostrada é, rigorosamente, uma correlação cruzada, pois não invertemos o filtro. Mesmo assim, nas CNNs ela costuma receber o nome de convolução.

Si,j=b+∑a=02∑c=02Xi+a,j+cKa,c.S_{i,j}=b+\sum_{a=0}^{2}\sum_{c=0}^{2}X_{i+a,j+c}\,K_{a,c}.

Si,j = b + ∑a=0..2 ∑c=0..2 Xi+a,j+c Ka,c

Cada filtro produz seu próprio mapa. Os quatro exemplos incluem bordas verticais, horizontais, diagonais e blur (média dos pixels). Em uma CNN treinada, os pesos são aprendidos, e os filtros não precisam corresponder a esses efeitos clássicos.

Parâmetros da convolução

Até aqui, usamos um filtro de 3 × 3 com passo de um pixel. Outros valores mudam quais regiões são examinadas e o tamanho do mapa de saída:

Entrada (5 × 5)
Saída (4 × 4)
Passe o cursor ou toque para mover a janela.

3. Camadas da CNN

Até aqui, vimos como um filtro produz um mapa de características. Uma CNN encadeia várias camadas: as saídas de uma tornam-se as entradas da próxima. A figura usa mapas reais de uma CNN treinada; o contraste foi ajustado para facilitar a leitura.

  1. Dígito manuscrito 5
    Imagem
  2. Convolução 1
  3. Pooling
  4. Convolução 2
  5. Pooling
  6. 5
    Classificação

Entrada

A imagem é representada por uma matriz de 28 × 28 pixels em tons de cinza, com um canal. Em uma imagem RGB, seriam três canais, um para cada cor. O conjunto desses valores é organizado em um tensor (altura × largura × canais).

Convolução

Os filtros de uma CNN têm pesos aprendidos durante o treinamento. A primeira convolução utiliza oito filtros de 5 × 5 e produz oito mapas de 28 × 28.

Na segunda convolução, cada filtro combina informações dos oito canais de entrada: aplica um kernel de 3 × 3 a cada mapa, soma os resultados e acrescenta um viés. Com 16 conjuntos de kernels, obtemos 16 mapas de 14 × 14. Ou seja, cada camada pode combinar as características encontradas pela anterior.

Pooling

O pooling reduz as dimensões espaciais dos mapas de características. Existem vários tipos, entre eles o max pooling, que seleciona o maior valor de cada região, e o average pooling, que calcula a média.

Na rede do exemplo, usamos max pooling com janela de 2 × 2 e passo 2. Considere este exemplo ilustrativo:

1324
2051
0632
1247
Entrada · 4 × 4
4567
Saída · 2 × 2

Assim, os oito mapas de 28 × 28 passam a 14 × 14. Após a segunda convolução, os dezesseis mapas de 14 × 14 passam a 7 × 7. O número de canais permanece igual. O pooling não aprende pesos e descarta parte da informação.

Flatten

Ao final das convoluções e dos poolings, a informação ainda está distribuída por vários mapas. O flatten organiza todos esses valores em um único vetor, sem realizar novos cálculos sobre eles. Veja este exemplo ilustrativo:

1234
Canal A
5678
Canal B
15263748
Vetor · 8 valores

No caso da rede, os 16 mapas de 7 × 7 são reorganizados em 16 × 7 × 7 = 784 valores. A ordem dos valores depende da organização dos canais, mas nenhum valor se perde.

Classificação

Uma camada totalmente conectada recebe esses 784 valores e os combina usando pesos aprendidos, produzindo 64 valores intermediários. A camada seguinte produz dez escores, um para cada dígito de 0 a 9. O maior escore determina a classe prevista.

Neste exemplo, o maior escore corresponde ao dígito 5. Isso mostra o resultado para a imagem escolhida, não garante que a rede sempre acerte.

Para observar como outra CNN reage a novos desenhos, explore a visualização 3D de Adam Harley.