Arquiteturas de Redes Neurais Convolucionais para reconhecimento de imagens

Dando continuação ao artigo anterior, vamos entender agora como o conceito da convolução se relaciona com as redes neurais para reconhecimento de imagens. Para este tipo de classificação, é necessária uma boa performance, geralmente alcançada através da utilização de Deep Learning, ou seja, uma rede neural de múltiplas camadas, mais especificamente uma rede neural convolucional – conhecida pela sigla CNN.

Ela recebe este nome porque possui camadas de convolução que, juntamente com outros tipos de camadas, determinam uma arquitetura específica para esta finalidade, como veremos adiante. Uma rede neural profunda possui camadas de neurônios: uma camada de entrada, algumas camadas intermediárias (ou ocultas), e uma camada de saída:

Hipoteticamente, em uma rede completamente conectada, teríamos cada pixel de uma imagem 300×300 – por exemplo – ligado a cada um dos neurônios na entrada. Para isso, precisaríamos de 90 mil neurônios, resultando em uma quantidade extremamente alta de parâmetros, e uma descorrelação espacial entre os pixels da imagem, ou seja, um enorme desperdício de recurso.

Por isso, a aplicação de camadas convolucionais sobre os pixels da imagem, reduz muito a quantidade de parâmetros e facilita a descoberta de padrões. Geralmente utiliza-se filtros espaciais lineares como visto no artigo anterior.

Uma camada convolucional realiza o aprendizado de múltiplos filtros, onde cada filtro – ou kernel – extrai uma informação da imagem. Como dito anteriormente, outras camadas são utilizadas em conjunto com a convolucional. O módulo Keras para desenvolvimento de uma CNN fornece uma camada convolucional para imagens, chamada de Conv2D, e também outras camadas (ou layers) para se utilizar em combinação sequencial. São elas:

MaxPooling2D

● Dropout

● Flatten

● Dense e

● Activation

Na camada Conv2D: realiza-se a convolução e deve-se especificar a quantidade de filtros, e o tamanho do kernel;

Na camada Activation: utiliza-se uma função de ativação, ao final de uma camada Conv2D e da camada Dense. A inspiração biológica é que inicialmente acreditava-se que os neurônios só conseguiam transmitir uma informação adiante pelo axônio após receberem um certo nível de estímulo (ou de saturação), e nessa situação estariam ativados. Esta função tentava representar esse cenário. Na prática, a função de ativação insere um comportamento necessário de não-linearidade, após a função linear dos pesos com as entradas, do corpo da célula:

 

As principais funções de ativação 

‒ Sigmóide: muito utilizada para aprendizado de funções lógicas, pois espreme os valores entre 0 e 1. Não é centrada em torno de zero, o uso de exponencial é relativamente custoso, e não é boa para reconhecimento de imagens;

‒ Tangente Hiperbólica: utilizada em redes LSTM (um tipo de rede neural recorrente), esta função espreme os valores entre -1 e 1, mas não é boa para funções binárias (pelo intervalo negativo);

‒  ReLU (Unidade Linear Retificada): muito utilizada para imagens, não satura na região positiva, converge bem mais rápido do que a sigmóide ou tangente hiperbólica sobre imagens, não é centrada em zero, porém é ruim para funções lógicas, e não é utilizada em redes recorrentes;

‒  Leaky ReLU: esta função nunca satura, é semelhante a ReLU porém faz tratamento para entradas negativas;

‒  ELU (Unidade Linear Exponencial): apresenta todos os benefícios da ReLU, produz saídas com médias próximas de zero, porém necessita de exponencial para seu cálculo;

‒ Softmax: esta função produz uma distribuição das probabilidades para cada classe de imagem durante uma classificação, diferente da sigmóide capaz de lidar com apenas duas classes. É utilizada na camada de saída da CNN.

Na camada de Pooling ou Agrupamento: geralmente usa-se a função de valor máximo para processamento de imagens. No Keras é a função MaxPooling2D que age reduzindo ou agrupando pixels de uma determinada região, com a finalidade de diminuir a variância a pequenas alterações e também de reduzir a quantidade de parâmetros. O pooling também pode ser feito por função de soma ou de média.

Na camada Dropout: realiza-se um regularização, onde alguns neurônios são desligados aleatoriamente, juntamente com suas conexões, durante o treinamento apenas. Durante a predição todos os neurônios são mantidos ativos. O motivo de se fazer isso é evitar overfitting no treinamento. Deve-se informar a porcentagem de desligamento.

Na camada Flatten: a matriz resultante das camadas anteriores de convoluções e poolings é redimensionada para se tornar um array linear, de uma única dimensão. Esta etapa é um preparo para se entrar na camada principal da rede neural totalmente conectada.

Na camada Dense: é implementada a rede neural totalmente conectada, ou fully connected (conhecido pela sigla FC em inglês), e deve-se informar a dimensão da saída e a função de ativação a ser utilizada. No contexto de reconhecimento de imagens é comum se projetar esta camada densa com a função de ativação ReLU e, por fim, outra camada densa com a dimensão igual a quantidade de classes a serem classificadas com a função de ativação softmax (para múltiplas classes).

Fonte da imagem: site https://medium.com

Arquiteturas de CNNs ou ConvNETs

Sobre arquiteturas de CNNs ou ConvNETs, inicialmente podemos citar três projetos que contribuíram para as arquiteturas atuais: 

LeNET: foi proposta em 1998 e já continha camadas de convolução com filtros 5×5 e passo 1, e agrupamentos com filtros 2×2 com passo 2, intercaladas, seguidas de camadas FC. A sequência de camadas eram: CONV-POOL-CONV-POOL-FC-FC.

AlexNET: proposta em 2012, bem mais complexa que a LeNET. Essa arquitetura continha cinco camadas de convolução, batch de tamanho 128, e primeiro uso da função de ativação ReLU.

VGG: em 2014 surge a arquitetura VGG com a ideia de filtros menores (3×3) em redes mais profundas com mínimo de 12 convoluções e maxpooling com filtros 2×2. Filtros menores geram menos parâmetros. Porém as camadas FC geravam uma quantidade muito grande de parâmetros e, as convoluções iniciais utilizavam muita memória RAM, tornando essa rede muito pesada.

Sobre as redes mais recentes, podemos citar dois projetos: a GoogleNET e ResNET.

GoogleNET: também em 2014 surgiu a ideia de se utilizar filtros de forma paralela, mais especificamente, fazer uso de uma nova camada chamada Inception, que se tornou elemento básico desta rede, onde tinha-se em sequência, nove módulos do tipo Inception. Este módulo possui convoluções 3×3 e 5×5 precedidas de convoluções 1×1 a fim de se reduzir o custo computacional.

ResNET: ou rede residual, proposta em 2015, de forma simplificada, a ideia é de se realizar um curto-circuito a cada duas convoluções, acrescentando um resultado anterior ao resultado futuro. Assim, diferentemente de uma rede tradicional, quanto mais camadas, menor o erro. Porém para os atuais projetos ResNET de 50, 101 e 152 camadas, ao invés de se trabalhar com 2 camadas convolucionais de 3×3, uma é retirada e são inseridas duas convoluções 1×1, diminuindo o custo computacional, como visto na GoogleNET.

Gostou deste artigo? Acompanhe outros textos aqui no nosso blog ou entre em contato com um dos nossos especialistas.