Exercício Empírico – Rede Neural Artificial

Este artigo traz um modelo de classificação de imagens. Vamos tentar observar o uso de um modelo para solução de um problema com características muito simples.

Neste artigo, vamos tentar identificar as cores. Separamos três delas: vermelho, verde e azul, a conhecida tríade RGB. Nosso modelo deverá receber uma imagem, apenas da cor. Não vamos olhar características dentro da imagem. Isto é, o modelo funciona quando recebemos uma imagem cujo conteúdo é da cor azul, vermelho ou verde.

A intenção aqui é entender o processo de classificação utilizando um modelo de rede neural artificial. O modelo que vamos partilhar tem alta tendência ao overfitting, uma vez que o conjunto de dados, ou dataset, é muito pequeno. Portanto, vamos analisar a implementação, a fim de iniciar o entendimento de forma empírica.

 

 

Implementação

Dataset

O nosso dataset é um conjunto muito pequeno de imagens de cores. Temos três pastas, uma para cada cor: vermelho, verde e azul.

Cada pasta contém um número de imagens. Note que, para esse exemplo, o número de imagens em cada pasta é muito pequeno, perto da quantidade que precisaríamos para obter resultados mais robustos. Vamos dar uma olhada nos exemplos:

Na pasta “vermelho”:

 

Na pasta “verde”:

 

Na pasta “azul”:

 

Pronto. Agora que conhecemos nosso conjunto de dados, vamos separar as imagens em pastas de treinamento e testes. Geralmente, 20% do dataset é separado para testar a precisão do modelo. Pode-se também optar por outra forma de validação, como a crossvalidation, por exemplo.

Uma vez que organizamos nosso dataset em pastas de treinamento e testes, vamos carregar as imagens em memória. Devemos ter em mente que uma imagem é um conjunto de números que representam a frequência de luz que o pixel emite, portanto, uma imagem pode ser vista como uma matiz.

No nosso caso, estamos lidando com cores, então, teremos uma matriz de três dimensões, cada dimensão representa um canal de cor RGB.

Veja o código para o carregamento do dataset:

A primeira linha é o import da biblioteca que vamos utilizar para carregar e tratar as imagens em memória. Clique aqui para ver a documentação.

A função recebe como entrada a raiz do caminho para acessar as pastas de treinamento e testes. Por meio de um laço ou loop, a função faz a leitura de todas as imagens e as redimensiona, nesse caso para 32×32. Esse tamanho de matriz não é regra, optamos por esses números para trabalhar com valores pequenos.

O np, no código, é a referência para a biblioteca numpy. E a variável lables_k é um dicionário que contém os nomes das classes. Neste caso, cada pasta (vermelho, verde e azul) corresponde ao nome da classe, portanto, temos três classes.

O próximo passo é definir um modelo de rede neural, que recebe as imagens que tratamos na função de carregamento das imagens como input na camada de entrada da rede.

Utilizamos o tensorflow, cujo link da documentação se encontra aqui.

Nossa rede neural é composta por três camadas: a de entrada, uma oculta, e a de saída, com três neurônios artificiais. Esta última contém três neurônios artificiais, já que temos três classes possíveis – vermelho, verde e azul. Faremos uma distribuição das probabilidades de cada classe.

A primeira camada tem o papel de “achatar” a matriz de entrada, assim, cada valor segue para a camada oculta e todo o processamento sobre o perceptron, ajuste de pesos e etc, conforme explicado em artigos anteriores.

A função de otimização é a ‘Adam’. No caso de perda, utilizamos SparseCategoricalCrossentropy – recomendamos a leitura desta documentação –  e, finalmente, a métrica acurácia (do inglês accuracy).

Em seguida, vamos treinar o modelo:

Note que após o treinamento, chamamos o comando model.save, e passamos o nome do arquivo. Após o treinamento, o modelo treinado será salvo no disco com o nome que for passado como argumento da função model.save. Ao fazer a predição, isto é, perguntar ao modelo qual é a cor da imagem de entrada, usaremos o arquivo que foi salvo.

Vamos plotar num gráfico o resultado do treinamento:

Observando o gráfico, podemos confirmar o que havíamos previsto: há overfitting no modelo. Note como o gráfico do treinamento não faz uma curva ao ajustar os pesos; na verdade sobe quase em linha reta até o 1.

Por fim, uma função que faz a predição ou uma distribuição da probabilidade da imagem de entrada ser ou não de uma cor.

 

Note no código acima que passamos o caminho de uma imagem e o nome da classe para visualização e que a função faz o carregamento do arquivo do modelo que foi salvo durante o treinamento.

Vemos abaixo os resultados das predições:

[6.4990473, 3.6263258, -14.657624]

[5.3511486, -0.9631639, -4.5017295]

[-10.344551, 10.185369, -10.249828]

[-6.479312, 3.8852334, -4.916281]

[-13.886836, -11.409933, 0.42647403]

[-3.390987, -2.6114514, 0.17050534]

Apesar de nosso modelo não apresentar ótimos resultados, conseguimos classificar a cor de acordo com a imagem de entrada. Consideramos que esse é um exemplo básico de construção de um modelo capaz de classificar, interpretando os dados de entrada.

Por meio desse exemplo básico, conseguimos atingir o objetivo de iniciar o entendimento empírico no tocante ao desenvolvimento de modelos de redes neurais artificiais.

 

Referências

https://www.tensorflow.org/tutorials/keras/classification