Aula Pratica NN
Aula Pratica NN
As redes neurais artificiais são um modelo de aprendizagem de máquina inspirado nas redes
neurais biológicas.
Na década de 1980 houve um ressurgimento na pesquisa de redes neurais. Uma rede
perceptron em múltiplas camadas (MLP) é uma classe de redes sem ciclos ou direta (feed forward).
É composta de pelo menos 3 camadas de perceptrons: uma de entrada, uma escondida (ou oculta) e
uma de saída. Exceto os nós de entrada, cada nó é um neurônio que usa uma função de ativação
não-linear.
MLP usa uma técnica para treinamento chamada backpropagation; ela consegue distinguir
dados não linearmente separáveis.
As redes MLP são formadas por:
◦ Camadas (layers), que possuem:
▪ Quantidade k>0 de neurônios
▪ Uma função de ativação θ, a qual é aplicada para cada neurônio da camada.
◦ Cada conexão entre 2 neurônios tem um valor chamado peso (weight) (W). Cada
conexão é ilustrada por uma aresta.
As redes neurais promovem transformações matemáticas nos dados que recebem para
processar. Em cada neurônio de cada camada, elas multiplicam o valor de entrada pelo peso do
neurônio correspondente, somam com o bias associado ao neurônio (valor que não depende da
entrada), e passam esse valor adiante.
Essas operações são lineares, de forma que, por mais complexa que seja a rede neural, ela só
pode captar relações lineares entre as variáveis de entrada e a variável de saída.
Para torná-las capazes de modelar também relações não-lineares, os resultados de saída de
cada camada passaram a ser processados pelas chamadas funções de ativação.
Isso é
especialmente importante nas camadas escondidas da rede neural. Nas camadas de saída, as funções
de ativação podem ter finalidades específicas, dependendo do problema que a rede neural está
tentando resolver.
Mas, qual função de ativação usar? Pelo seu desempenho, a função de ativação mais
utilizada nas camadas escondidas é a ReLU, tendo a preferência na abordagem inicial do problema.
Quando ela não é eficiente, pode-se recorrer às outras funções, considerando-se caso a caso.
Para as camadas de saída, podemos usar a função adequada à natureza do problema a ser
resolvido:
classificação binária, podemos recorrer à função sigmóide, com a tangente hiperbólica
também sendo uma possível solução;
classificação não-binária, podemos aplicar a função softmax;
regressão, usamos a ativação linear.
Treinamento
Cada conexão entre neurônios representa um peso. O treinamento de redes neurais envolve
descobrir valores de pesos que minimizam o erro.
Mesmo para um modelo com poucos neurônios, há infinitas permutações possíveis.
Os algoritmos mais eficientes para ajustar os pesos de um modelo de rede neural utilizam a
ideia do gradiente descendente. A função que calcula o erro do modelo calcula a diferença entre a
saída esperada e a saída atual. A derivada de uma função de custo permite calcular o gradiente para
cada peso W, o que permite ajustá-los para um valor que minimiza o erro.
Experimentos:
1) Código de um único Perceptron em python puro:
Atividades:
a) Imagine que o código acima esteja treinando um perceptron para replicar a função booleana AND
(E), fornecendo 3 pontos apenas. A previsão relacionada ao ponto (1,1) está correta?
b) Alterem o programa de modo a treinar o perceptron com a função booleana XOR (OU-
EXCLUSIVO):
A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0
O perceptron consegue fazer previsões sobre esta função? Por que é assim?
Sugestão: faça um plano cartesiano onde A e B são abscissa e ordenada; pinte a região do plano
correspondente ao 0 de uma cor e a correspondente ao 1 de outra; você consegue separar os zeros
dos uns com apenas uma reta?
Atividades:
a) O código acima tenta aprender a função booleana AND (E), fornecendo 3 pontos apenas. A
previsão relacionada ao ponto (1,1) está correta?
b) Alterem o programa de modo a treinar a rede MLP com a função booleana XOR (OU-
EXCLUSIVO). A rede MLP consegue fazer previsões sobre esta função?
import numpy as np
import pandas as pd
import seaborn as sns # visualization
from sklearn.neural_network import MLPClassifier # neural network
from sklearn.datasets import load_iris
iris = load_iris()
Usaremos a base MNIST, constituída por imagens digitalizadas de dígitos escritos à mão:
Primeiro código:
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD, Adam, RMSprop
from keras.utils import np_utils
model = Sequential()
model.add(Dense(units=512, input_shape=(784,)))
model.add(Activation('relu'))
model.add(Dense(units=512))
model.add(Activation('relu'))
model.add(Dense(units=10))
model.add(Activation('softmax'))
#Compilamos/Criamos o modelo
model.compile(loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy'])
#Executamos o treinamento
history = model.fit(X_train, Y_train, batch_size=128, verbose=1, validation_data=(X_test, Y_test))
Segundo código:
Podemos testar o recurso de salvamento de modelos treinados e arquitetura de uma rede em
um único arquivo. Após rodar o código acima, rode o próximo, o qual usará a rede treinada:
# carregue o modelo
model = load_model('model.h5')
# summarize model
model.summary()
predicao = model.predict_classes(X_test)
Atividades:
a) Ocorreram erros de classificação? Fazem sentido os erros? Você teria reconhecido corretamente
estes dígitos?
b) Teste uma rede feita com Keras aplicada a uma outra base, como a CENSUS ou a IRIS.