Workshop com

TensorFlow e Keras

Émerson Silva

Universidade Federal de Alagoas

emersonjose877@gmail.com

silvaemerson

Luís Eduardo G. França

Universidade Federal de Alagoas

luiseduardogfranca@gmail.com

luiseduardogfranca

Instalação


para Linux

Pandas: Biblioteca para análise de dados;

Numpy: Operações matemáticas em arrays e matrizes multidimensionais;

Matplotlib: Biblioteca de Visualização 2D e 3D;

Seaborn: Criação de gráficos estatísticos atraentes;

Instalação dos pacotes auxiliares...

              
 pip3 install pandas seaborn matplotlib numpy
              
            

Instalação do TensorFlow e Keras

              
 sudo apt install python3-pip

 pip3 install virtualenv

 virtualenv -p python3 TensorKeras

 source TensorKeras/bin/activate

 pip3 install tensorflow=1.5 keras
              
            

Implementação

Classificação de vinhos em 3 classes com o TensorFlow e Keras;

Dataset: Wine Data Set

Librarys para manipulação e visualização:

              
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
              
            

Seleção de atributos:

              
#Criação das colunas para tabela
columns = [i-1 for i in range(1,15)]
columns[0] = 'Class'

#Leitura do dataset com pandas
df = pd.read_csv('wine.data.txt')

#Recriação de dataframe com as colunas criadas
df = pd.DataFrame(df.values.tolist(), columns=columns)

#Visualização das correlações em um mapa de calor
plt.figure(figsize=(10, 10))
sns.heatmap(df.iloc[:, 1:].corr(), annot=True)


#Lista com atributos de menor correlação
selected_columns = [3, 2, 4, 2, 13, 2, 4, 13, 6, 13, 6, 12]
selected_columns = set(selected_columns)
selected_columns.add('Class')

#Configura o tipo de dados
df = df.astype('float32')

#Função para selecionar um percentil do conjunto de dados
def split_data(data, percent=0.8):
    index = int(percent * len(data))
    return data[:index], data[index:]

#Resolver problemas com as classes ([1, 2, 3] -> [0, 1, 2])
df['Class'] = df['Class'] - 1

#Separa as classes do conjunto de dados
labels = df.iloc[:, 0].values

#Seleciona os atributos fracamente correlacionados
features = df[list(selected_columns)].values

#Separa o conjunto de dados com a função 'split_data'
X_train, X_test = split_data(features)
Y_train, Y_test = split_data(labels)

np.save('X_train', X_train)
np.save('X_test', X_test)
np.save('Y_train', Y_train)
np.save('Y_test', Y_test)
              
            

Visualização do mapa de correlação

Mapa de correlação
Keras

O que é Keras?

É uma API de alto nível para a criação de redes neurais

Pode usar TensorFlow, CNTK ou Theano como backend

Muito usada por pesquisadores devido à facilidade de criação de modelos

Implementação com Keras

Importe as libs nescessárias

              
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import to_categorical
import matplotlib.pyplot as plt
from keras.optimizers import Adam
from keras.initializers import TruncatedNormal
              
            

Recuperando dados e configurando a rede

              
#Carrega os dados salvos no pré-processamento com numpy
X_train, X_test = np.load('X_train.npy'), np.load('X_test.npy')
Y_train, Y_test = np.load('Y_train.npy'), np.load('Y_test.npy')

#Criando uma matriz binária '[1,0,0]'
Y_train, Y_test = to_categorical(Y_train), to_categorical(Y_test)

#Recupera a quantidade de valores armazenados
input_dim = len(X_train[0, :])
classes_num = len(Y_train[0, :])

model = Sequential()
init = TruncatedNormal(stddev=0.01, seed=10)

#Configurando modelo da rede
model.add(Dense(units=50, activation='relu', input_dim=input_dim,
          kernel_initializer=init))
model.add(Dense(units=classes_num, activation='softmax',
          kernel_initializer=init))

#Inicializando o otimizador
adam = Adam(lr=0.007)

#Configurando a forma de compilação da rede
model.compile(loss='categorical_crossentropy',
              optimizer=adam,
              metrics=['accuracy'])

#Treino da rede
history = model.fit(X_train, Y_train, epochs=800,
          validation_data=(X_test, Y_test), shuffle=False)

plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='best')
plt.show()

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='best')
plt.show()
              
            

Gráfico de acurácia e perda

Acurácia com Keras
Acurácia com Keras
Perda com Keras
Perda com Keras
TensorFlow logo

O que é TensorFlow?

Biblioteca open source para computação númerica (não somente para machine learning);

Permite criar modelos preditivos de forma mais eficiente e que requisite menos processamento para a aplicação;

Desenvolvida em C++, porém com disponibilidade de comunicação em Python por meio da API TensorFlow;

TensorFlow vai dispor de várias outras aplicações, como: API TensorFlow, TensorBoard e TensorServing;

Algumas empresas utilizam o TensorFlow: Google, OpenAI, DeepMind, Snapchat, Airbus, Uber, Dropbox e etc.

Conceitos

TensorFlow usa de grafos para representar o fluxo de dados(tensores) e as suas operações;

Tensor: Um array n-dimensional;

Nós: Onde ocorre as operações entre os tensores;

Session: É o objeto que encapsula o ambiente onde as operações são executadas e as variáveis inicializadas;

Implementação com TensorFlow

Importe o TensorFlow

              
import tensorflow as tf
              
            

Criando modelo

              
  Y_train, Y_test = tf.keras.utils.to_categorical(Y_train), tf.keras.utils.to_categorical(Y_test)

  features_num = len(X_train[0])

  l1 = 50

  l2 = len(Y_train[0])

  tf.set_random_seed(10)

  #Criando entrada para os dados e classes
  X = tf.placeholder(shape=[None, features_num], dtype=tf.float32, name="Input")
  labels = tf.placeholder(shape=[None, l2], dtype=tf.float32, name="Labels")


  with tf.name_scope("Hidden_Layer") as scope:
      #Criando pesos e bias da camada intermediária
      W1 = tf.Variable(tf.truncated_normal([features_num, l1], stddev=0.01), name="W1")
      B1 = tf.Variable(tf.zeros([l1]), name="B1")

      #Calculando saída da camada intermediária
      l1_activation = tf.nn.relu(tf.matmul(X, W1) + B1, name="l1_activation")
              
            

Grafo da Camada Intermediária

First Step

              
with tf.name_scope("Final_Layer") as scope:
    #Criando pesos e bias da camada de saída
    W2 = tf.Variable(tf.truncated_normal([l1, l2], stddev=0.01), name="W2")
    B2 = tf.Variable(tf.zeros([l2]), name="B2")

    #Calculando saída da camada de saída
    final_result = tf.nn.softmax(tf.matmul(l1_activation, W2) + B2, name="result")
              
            

Grafo da Camada Final

Second Step

              
with tf.name_scope("Loss_function") as scope:
    #Criando a entropia cruzada
    loss_func = -tf.reduce_sum(labels * tf.log(final_result))
              
            

Grafo da Função de Custo

Third Step
              
with tf.name_scope('Accuracy') as scope:
    #Verificando se a classe predita é igual à real [1, 0, 0] [0.1, 0.9, 0.0]
    is_correct = tf.equal(tf.argmax(final_result, axis=1), tf.argmax(labels, axis=1))

    #Calculando a acurácia
    accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
              
            

Grafo da acurácia

Fourth Step

Referências

Keras Documentation
TensorFlow.org