Introdução a Deep Learning usando Keras

Sempre acompanhei palestras ou aulas que buscavam explicar algum trabalho relacionado à Deep Learning com um olhar admirado, mas ao mesmo tempo sem entender muita coisa. Aproveitando que o DataCamp disponibilizou uma semana gratuita para todos os seus cursos, resolvi finalmente me desafiar e aprender mais a respeito. Seguindo a track Deep Learning in Python, comecei então pelo curso “Introduction to Deep Learning in Python”. Confesso que me surpreendi com a fluidez do material e tento então através desta publicação transmitir um pouco do que estou aprendendo.

Tentarei então compartilhar uma introdução à como construir modelos de Deep Learning com Keras. Keras é uma biblioteca de rede neural de código aberto escrita em Python, que irei utilizar. O modelo de Deep Learning pode então ser dividido em quatro passos:

1. Especificação da Arquitetura

Neste passo, você deve então específicar a arquitetura da rede neural, respondendo algumas perguntas como:

  • Quantas camadas a rede possuirá?
  • Quantos nós existirão em cada camada?
  • Qual função de ativação será utilizada em cada camada?

Respondendo estas perguntas, você consegue começar a imaginar o formato da sua rede neural, como seria a sua disposição ideal. A Figura 1 representa um exemplo de arquitetura, onde a rede possui duas camadas ocultas, uma camada de entrada e uma de saída. Além disso, são definidos quatro nós para as camadas ocultas, três para a camada de entrada e apenas um para a camada de saída.

Figura 1. Rede Neural que será utilizada como exemplo.


Para especificar o modelo da Figura 1 utilizando Keras, você pode utilizar o seguinte código:

import pandas as pd
from keras.layers import Dense
from keras.models import Sequential

#Obtendo os dados de entrada
data = pd.read_csv('dados_entrada.csv')
predictors = data.drop(['resultado'], axis=1).as_matrix()
target = data['resultado'] 

#Utilizando o número de colunas para delimitar os nós de entrada (3 nós)
num_cols = predictors.shape[1]

#Iniciando uma rede neural sequencial
model = Sequential()

#Instanciando a primeira camada oculta com 4 nós a partir dos 3 nós da entrada
model.add(Dense(4, activation='relu', input_shape=(n_cols, )))

#Instanciando a segunda camada oculta com 4 nós
model.add(Dense(4, activation='relu', input_shape=(n_cols, )))

#Instanciando a camada de saída com apenas 1 nó
model.add(Dense(1))

2. Compilação

Agora, você pode compilar o modelo, configurando a mesma para a otimização. Neste passo você deve especificar a função de perda e alguns detalhes sobre como a otimização da rede neural irá funcionar.

Os métodos de compilação possuem então dois argumentos importantes para você escolher:

  1. Qual otimizador será utilizado? R: Neste caso, apresentarei o “Adam”
  2. Qual será a função de perda? R: Neste caso, apresentarei o erro quadrático médio, por se tratar de um exemplo de regressão (um nó de saída).

O otimizador está diretamente relacionado com a taxa de aprendizado da rede neural. Continuando o código em Python apresentado como exemplo, irei compilar o modelo da seguinte maneira:

#Compilando o modelo proposto para a rede neural 
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])

3. Fit (Encaixe)

Após compilar o modelo com a arquitetura proposta, você pode então encaixar o modelo. Neste passo então você literalmente encaixa a rede neural formulada com os dados de entrada. É aqui que você irá definir e aplicar os ciclos de backpropagation e como será realizada a otimização dos pesos do modelo com os seus dados.

Continuando o código em Python apresentado como exemplo, irei fazer o fit do modelo da seguinte maneira:

#Encaixando a rede neural com os dados de entrada e o resultado esperado
model.fit(predictors, target, validation_split=0.3)

Após realizar o fit do seu modelo, é recomendado salvar o mesmo. Para salvar, utilize o seguinte:

#Salvando o modelo para uso posterior
model.save('model.h5')

4. Predição

E por fim, com a sua rede neural já treinada com os dados de entrada, você poderá utilizar o modelo para realizar certas predições. Com o modelo salvo, devemos então recarregá-lo e utilizá-lo posteriormente. Isto pode ser feito através do seguinte código:

#Carregando o modelo criado anteriormente e os dados a serem preditos
the_model = load_model('model.h5')
data_predict = pd.read_csv('dados_predicao.csv')

predictions = the_model.predict(data_predict)

Conclusão

E é isso! Com estas pouquissímas linhas de código você apreendeu a criar uma rede neural que consegue estimar uma predição na saída, conforme os dados de entrada. Claro que esta rede é extremamente pequena, mas a ideia aqui era apenas fornecer de maneira simples o que muitas vezes é desesperador ao se ouvir falar pela primeira vez.