Uma introdução as redes neurais convolucionais utilizando o Keras

Saiba como funciona uma CNN através desse exemplo com o dataset MNIST

Alan Melo Clappis
Jul 12 · 6 min read
Photo by Roman Mager on Unsplash

Nós, aqui da EurekaLabs, decidimos reunir nosso time de cientistas de dados para resolvermos alguns problemas do Kaggle. As soluções terão um viés didático e serão compartilhadas aqui no Medium, então fique atento :).

Iniciaremos por um problema simples e gradualmente iremos aumentar a complexidade. Dessa vez, iremos resolver o digit-recognizer, que é basicamente um desafio de reconhecimento de dígitos.

Mas antes de detalhar o problema, vamos entender a teoria de uma rede neural convolucional (CNN), que vai ser o algoritmo adotado para resolver esse problema.


Uma CNN é um tipo específico de rede neural normalmente utilizada para classificação de imagens. Mas para entendermos uma CNN, é preciso compreender como uma imagem é representada computacionalmente.

Uma imagem preta e branca (grayscale) é representada como uma matrix 2D, em que cada posição da matrix representa um pixel da imagem. Os valores para cada elemento variam entre 0 (preto) até 255 (branco), conforme o exemplo abaixo.

Representação grayscale. Fonte: Stanford

Já uma imagem colorida, é normalmente representada por uma matrix 3D de forma que seja possível armazenar uma combinação das cores vermelho, verde e azul (RGB do inglês).

Representação RGB. Fonte: Stanford

Uma CNN pode ser dividida em duas partes: extração de características (Conv, Padding, Relu, Pooling) e uma rede neural tradicional.

Convoluções

Matematicamente, uma convolução é uma operação linear que a partir de duas funções, gera uma terceira (normalmente chamada de feature map). No contexto de imagens, podemos entender esse processo como um filtro/kernel que transforma uma imagem de entrada.

Um kernel é uma matrix utilizada para uma operação de multiplicação de matrizes. Esta operação é aplicada diversas vezes em diferentes regiões da imagem. A cada aplicação, a região é alterada por um parâmetro conhecido como stride. Normalmente o stride possui o valor 1, o que significa que a transformação será aplicada em todos os pixels da imagem. Um exemplo dessa transformação é ilustrado abaixo.

Imagem de entrada a esquerda, filtro a direita. Fonte: Towards
Convolução em uma imagem: Fonte: Towards

Como você pode notar, a matrix resultante desse exemplo possui uma dimensionalidade menor que a imagem de origem. Muitas convoluções podem impactar na assertividade da CNN se o tamanho da imagem for muito reduzido. Para contornar esse cenário, normalmente é utilizado o conceito de Padding.

Padding

Padding é um processo em que alguns pixels são adicionados ao redor da imagem antes da operação de convolução, de forma a manter a dimensionalidade na imagem resultante durante a operação.

Padding — Fonte: Medium

Algumas das operações de convolução mais utilizadas com imagens são apresentadas abaixo.

Convoluções em imagens — Fonte: Wikipedia

Esse processo é utilizado porque essas imagens resultantes podem conter elementos que facilitam a identificação da classe alvo para a rede. Uma CNN utiliza esse processo nas suas camadas iniciais, com a diferença de que a matrix de kernel não possui valores “chumbados” como no exemplo acima, ou seja: eles são parâmetros treinados pelo algoritmo.

ReLU

Uma rede neural sem função de ativação torna-se um modelo linear. Se o seu problema é linear, existem outros modelos mais simples que te atenderão tão bem quanto uma rede neural. Infelizmente a maioria dos problemas complexos não são lineares. Portanto, para adicionar a não linearidade a rede, utilizamos as funções de ativação. Nos dias de hoje, e principalmente no contexto de imagens, a mais utilizada é a função ReLU.

Matematicamente a função ReLU é definida como y = max(0, x). O gráfico a seguir é a ilustração desta função.

Função de Ativação ReLU: Fonte — Medium

Pooling

Pooling é um processo de downsamping. É um processo simples de redução da dimensionalidade/features maps. Em uma forma leviana de pensar, podemos entender essa transformação como uma redução do tamanho da imagem.

A principal motivação dessa operação no modelo, é de diminuir sua variância a pequenas alterações e também de reduzir a quantidade de parâmetros treinados pela rede.

Exemplo de downsampling — Fonte: CS231n

Existem 3 operações diferentes de Pooling (MaxPooling, SumPooling, AvaragePooling). Todas elas seguem o mesmo princípio e só se diferem na forma como calculam o valor final. A mais utilizada nos dias de hoje é a MaxPooling.

A operação de MaxPooling retira o maior elemento de determinada região da matrix (considerando o tamanho do pool aplicado). Posteriormente, é feito um deslizamento considerando um parâmetro de stride (similar a a operação de convolução) para aplicação de uma nova operação.

MaxPooling — Fonte: CS231n

Dropout

Dropout não é uma especificidade de uma CNN, porém a utilizaremos em nossa implementação técnica, portanto abordaremos seu funcionamento.

Em resumo, a camada de Dropout é utilizada para evitar que determinadas partes da rede neural tenham muita responsabilidade e consequentemente, possam ficar muito sensíveis a pequenas alterações.

Essa camada recebe um hyper-parâmetro que define uma probabilidade de “desligar” determinada área da rede neural durante o processo de treinamento.

Flatten

Essa camada normalmente é utilizada na divisão das 2 partes da CNN (extração de características / rede neural tradicional ). Ela basicamente opera uma transformação na matrix da imagem, alterando seu formato para um array. Por exemplo, uma imagem em grayscale de 28x28 será transformada para um array de 784 posições. A imagem abaixo ilustra essa operação.

Operação de Flatten — Fonte: SuperDataScience

Rede Tradicional (Dense Layers)

Rede neural é um modelo computacional baseado no sistema nervoso central humano. Elas são capazes de reconhecer padrões em uma massa de dados de forma a classificá-los em alguma categoria ou fazer a regressão de algum valor. Por já existir um material muito bom sobre redes neurais aqui no DataHackers, se você não tiver familiaridade com o assunto, aconselho dar uma olhada nesse artigo aqui — Introdução teórica a neural network.

Implementação

O problema abordado neste artigo é um desafio de reconhecimento de dígitos escritos a punho por humanos. Tais imagens do desafio encontram-se no formato grayscale e são representados por uma matrix 28x28. Vamos importar a massa de dados do Kaggle e visualizar algumas imagens.

Visualização randômica das imagens

Vamos implementar uma CNN com a topologia abaixo.

Topologia CNN

Inicialmente é aplicado um processo de convolução com 32 filtros na imagem de entrada. Podemos entender esse processo como a geração de 32 novas imagens a partir da entrada. Analogamente, é aplicado outro processo de convolução com 64 filtros. Na camada subsequente, é aplicado a operação de MaxPooling, que reduzirá o tamanho da imagem em 14x14. Finalmente, esses valores são unificados em um array pela operação Flatten (64x14x14 = 12544) para serem a entrada de uma rede neural tradicional.

Acurácia durante as épocas

Finalmente, vamos visualizar algumas predições por curiosidade e depois gerar a resposta para o Kaggle.

Apresentação de predição para algumas imagens.

Poderíamos melhorar essa solução com a utilização de técnicas como Data Augmentation e alguns outros truques, mas esse papo vai ficar pra outro artigo :).

Eai, gostou? Não deixe de acompanhar esse Medium e as redes sociais da EurekaLabs (Linkedin, Facebook) para acompanhar os novos artigos! Até lá!

Data Hackers

Blog oficial da comunidade Data Hackers

Thanks to Isabela Vendramini.

Alan Melo Clappis

Written by

Data Hackers

Blog oficial da comunidade Data Hackers