Redes Neurais Convolucionais com Keras

Na última postagem do blog, usando Keras, você aprendeu a criar uma rede neural simples (Multilayer Perceptron) que classificou as imagens do conjunto de dados MNIST com precisão de 97%. Você pode pensar que 97% é um bom número, mas ainda é possível melhorá-lo. Utilizando Convolutional Neural Networks (ou convnets), um tipo de modelo de aprendizagem profunda mais comumente aplicado à análise de imagens visuais, é possível atingir cerca de 99% de precisão em treinamento e validação.

Você pode clonar esse projeto aqui: https://github.com/waslleysouza/keras.

A estrutura do modelo é semelhante à Rede Neural que criamos aqui: Começando com Keras.

A primeira mudança que precisamos fazer é nas bibliotecas importadas.
Aqui vamos adicionar a biblioteca Numpy e 3 novos tipos de camadas: Conv2D, MaxPooling2D, Flatten.

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPooling2D, Flatten
from keras.utils import to_categorical
import matplotlib.pyplot as plt
import numpy as np

Nós precisaremos mudar a remodelação da imagem (reshape) porque as convnets aceitam o tensor 3D (altura, largura, canais) em vez de dados achatados em forma de 1D. Precisamos definir o valor do canal como 1 porque todas as imagens no conjunto de dados MNIST estão em escala de cinza.

train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255

Como última alteração, precisaremos alterar a estrutura do modelo, adicionando camadas Conv2D e MaxPooling2D.
Neste modelo, cada camada Conv2D extrairá features usando um kernel 3×3 e cada camada MaxPooling2D reduzirá pela metade o tamanho da imagem.

model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3), activation='relu', input_shape=(28,28,1)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()

Agora, quando treinamos a rede, a precisão aumenta em torno de 99%.

Divirta-se!

Autor: Waslley Souza

Consultor Oracle com foco em tecnologias Oracle Fusion Middleware e SOA. Certificado Oracle WebCenter Portal, Oracle ADF e Java.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *