# Introdução
Esse relatório tem como objetivo fazer um overview explicando os processos utilizados do inicío até o fim de um treinamento utilizando o Keras. Futuramente será feito um relatório entrando em detalhes mais profundos como parâmetros, algorítmos de perda/ otimização e etc.
Keras é uma API de redes neurais de alto nível, escrita em Python e capaz de executar sobre TensorFlow, CNTK ou Theano.
# Datasets
Antes de iniciar, é preciso escolher um dataset. O próprio Keras já disponibiliza alguns:
boston_housing module: Conjunto de dados de regressão do preço da habitação em Boston.
cifar10 module: Conjunto de dados de classificação de imagens pequenas CIFAR10 (60000 imagens coloridas de 32 x 32 em 10 classes, com 6000 imagens por classe).
cifar100 module: Conjunto de dados de classificação de imagens pequenas CIFAR100 (assim como o CIFAR-10, exceto que possui 100 classes contendo 600 imagens cada).
fashion_mnist module: Dataset Fashion-MNIST (conjunto de dados das imagens dos itens da loja Zalando - consistindo em um conjunto de treinamento de 60.000 exemplos e um conjunto de testes de 10.000 exemplos. Cada exemplo é uma imagem em escala de cinza de 28 x 28, associada a um rótulo de 10 classes).
imdb module: Conjunto de dados de classificação de sentimentos do IMDB.
mnist module: Conjunto de dados de dígitos manuscritos MNIST.
reuters module: Conjunto de dados de classificação de tópicos da Reuters.
Para o curso foi utilizado o fashion_mnist module.
# Sequential
O modelo Sequencial (keras.Sequential) é uma pilha linear de camadas.
É possível criar um modelo seqüencial passando uma lista de instâncias de camada para o construtor:
modelo = keras.Sequential([
# Camada de entrada
keras.layers.Flatten(input_shape = (28,28)), # As imagens, de 28 por 28 pixels (input_shape = tamanho das entradas).
# Processamento (camada do tipo dense,
keras.layers.Dense(256, activation = tf.nn.relu), # => Não há um número exato, ele deve ser testado e ajustado.
# 'Adormecer' alguns itens, normalizando o modelo
keras.layers.Dropout(0.2),
# Saida
keras.layers.Dense(10, activation = tf.nn.softmax), # => Aqui eu coloco 10 porque eu tenho 10 tipos de categorias.
])
Os modelos em Keras são definidos como uma sequência de camadas.
# Camada Flatten
O keras.Flatten basicamente nivela a entrada. Achatar um tensor significa remover todas as dimensões, exceto uma. É exatamente isso que a camada Flatten faz.
# Camada Dense
Conforme a documentação, Apenas a sua camada NN comum, densamente conectada (NN = neural network). Ou seja, a cadada core. É a implementação da equação:
output = activation(dot(input, kernel) + bias)
Isso significa que estamos pegando o produto escalar entre nosso tensor de entrada e qualquer que seja a matriz de núcleo de peso que esteja presente em nossa camada densa. Em seguida, adicionamos um vetor de viés e realizamos uma ativação por elemento dos valores de saída (relu no nosso caso).
# Dropout
Aplica o Dropout à entrada.
O Dropout (abandono) consiste em definir aleatoriamente uma taxa de fração das unidades de entrada como 0 a cada atualização durante o tempo de treinamento, o que ajuda a evitar o ajuste excessivo (overfitting).
Overfitting: Quando um modelo é treinado com muitos dados, ele começa a aprender com o ruído e as entradas de dados imprecisas em nosso conjunto de dados. Em seguida, o modelo não categoriza os dados corretamente, devido a muitos detalhes e ruídos.
# Compile
Antes de treinar um modelo, é preciso configurar o processo de aprendizado, que é feito pelo método de compilação. Ele recebe três argumentos:
Um otimizador (optimizer). Pode ser o identificador de sequência de um otimizador existente (como rmsprop ou adagrad) ou uma instância da classe Optimizer.
Uma função de perda (loss). Esse é o objetivo que o modelo tentará minimizar. Pode ser o identificador de sequência de uma função de perda existente (como categorical_crossentropy ou mse) ou pode ser uma função objetiva.
Uma lista de métricas (metrics). Para qualquer problema de classificação, defina isso como métricas = ['precisão']. Uma métrica pode ser o identificador de sequência de uma métrica existente ou uma função de métrica personalizada.
modelo.compile( # Otimizador optimizer=adam, # Função de perda loss='sparse_categorical_crossentropy', # métricas metrics=['accuracy'] )
# Training (fit)
Após configurar e compilar o modelo, fazemos o treinamento dele com o .fit. Conforme a documentação: Treina o modelo para um número fixo de épocas (iterações em um conjunto de dados).
O retorno é um objeto History. Seu atributo History.history é um registro de valores de perda de treinamento e valores de métricas em épocas sucessivas, bem como valores de perda de validação e valores de métricas de validação.
historico = modelo.fit(imagens_treino, identificacoes_treino, epochs=5, validation_split=0.2)
# Predict
Por fim, após toda a parte custosa do Deep Learning ter sido finalizada, podemos fazer as predições usando nosso modelo com o .predict . Segundo a documentação, o predict:
Gera previsões de saída para as amostras de entrada.
# Referências
[1] https://keras.io/
[2] https://www.dobitaobyte.com.br/rede-neural-com-keras-mais-anotacoes/
[3] https://stackoverflow.com/questions/43237124/what-is-the-role-of-flatten-in-keras
[4] https://medium.com/@hunterheidenreich/understanding-keras-dense-layers-2abadff9b990