Treino Autoencoder

Nesta página será realizado o treino com os dados que foram coletados em campo.

Todos os dados aqui contidos são de vias consideradas boas ou ótimas,onde não há elementos considerados anomalias como lombadas, valetas tampas de bueiro, etc.

Configurações

As variáveis de ambiente, bibliotecas e caminhos serão aqui definidos.

Montando Google Drive

[1]:
from google.colab import drive
import os
drive.mount('/content/drive')
Mounted at /content/drive

Clonando a biblioteca Easy_lstm

Há ainda, uma biblioteca chamada easy_lstm, biblioteca essa desenvolvida pelo autor para manipulação e preparação de dados para a rede do tipo lstm. Para utilizá-la necessitamos clonar a mesma.

[2]:
!git clone https://github.com/GabrielLima1995/easy_lstm.git
Cloning into 'easy_lstm'...
remote: Enumerating objects: 17, done.
remote: Counting objects: 100% (17/17), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 17 (delta 5), reused 15 (delta 3), pack-reused 0
Unpacking objects: 100% (17/17), done.

Caminhos necessários

Definimos também os caminhos necessários para os dados de interesse.

[3]:
lib_path = '/content'
[4]:
main_path = '/content/drive/MyDrive/IG2021/'

Import das bibliotecas utilizadas

Importando as bibliotecas e dependências necessárias:

[5]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import joblib
import tensorflow as tf
from tensorflow import keras
from keras.layers import Input,Dropout,Dense,LSTM,TimeDistributed,RepeatVector
from keras.models import Model
from keras import regularizers
[6]:
import sys
sys.path.insert(0,lib_path)
[7]:
from easy_lstm import preparation,operations,models,dt

Váriaveis uteis

Seção para definição de alguns parâmetros e variáveis necessárias.

[8]:
cols = ['DataTimeStamp','GPSLong','GPSLat','Vel','ExernalAcelX','ExernalAcelY',
 'ExernalAcelZ','ExernalGyroscopeX','ExernalGyroscopeY','ExernalGyroscopeZ',
 'Pitch','Roll','Yaw']
[9]:
used_cols = ['Vel','ExernalAcelX','ExernalAcelY','ExernalAcelZ',
             'ExernalGyroscopeX','ExernalGyroscopeY',
             'ExernalGyroscopeZ','Pitch','Roll','Yaw']
[10]:
l = os.listdir(main_path + 'train/')

Definições e inicializações graficas

Seção para inicialização do método gráfico da biblioteca matplotlib e afins.

[11]:
plt.style.use('dark_background')

Carregamento dos dados

Os dados de Treino serão aqui lidos pela biblioteca pandas.

[12]:
filepaths = [pd.read_csv(main_path + 'train/' + f,delimiter=';', usecols= cols) for f in l ]

Tratamento dos Dados

Os dados serão convertidos para o formato necessário para a inicialização do treino.

Conversão para DateTime

Converteremos a coluna Datatimestamp para DateTime

[13]:
for i in range(len(filepaths)):
  filepaths[i]['DataTimeStamp'] = filepaths[i]['DataTimeStamp'].apply(lambda x : dt.to_datetime(x))
  filepaths[i].set_index('DataTimeStamp',drop=True,inplace=True)

Criação das Janelas (time steps)

Será utilizado 30 time steps e 10 features, onde da biblioteca easylstm será utilizado o método to_lstm.

[14]:
train = preparation.to_lstm(filepaths,30,used_cols)

Após a criação podemos ver que os dados possuem 3 dimensões.

[15]:
train.shape
[15]:
(38173, 30, 10)

Normalização dos dados de treino.

Será então normalizado os dados de treino.

[16]:
X_train,scaler = operations.normalize_fit(train)

E salvaremos os dados dessa normalização para utilização a posteriori.

[17]:
joblib.dump(scaler, main_path+'file_train/scaler.save')
[17]:
['/content/drive/MyDrive/IG2021/file_train/scaler.save']

Treino

Será então realizado o treino.

Instanciação da Rede

Inicialmente realizaremos a instanciação da rede autoencoder do tipo lstm.

Esta rede esta definida na biblioteca easy_lstm, onde utilizaremos o método autoencoder.

[18]:
model = models.autoencoder(X_train)
model.compile(optimizer='adam',loss='mae')
WARNING:tensorflow:Layer lstm will not use cuDNN kernels since it doesn't meet the criteria. It will use a generic GPU kernel as fallback when running on GPU.
WARNING:tensorflow:Layer lstm_1 will not use cuDNN kernels since it doesn't meet the criteria. It will use a generic GPU kernel as fallback when running on GPU.
WARNING:tensorflow:Layer lstm_2 will not use cuDNN kernels since it doesn't meet the criteria. It will use a generic GPU kernel as fallback when running on GPU.
WARNING:tensorflow:Layer lstm_3 will not use cuDNN kernels since it doesn't meet the criteria. It will use a generic GPU kernel as fallback when running on GPU.

Podemos também ver a rede que foi instanciada, fazendo:

[19]:
model.summary()
Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         [(None, 30, 10)]          0
_________________________________________________________________
lstm (LSTM)                  (None, 30, 16)            1728
_________________________________________________________________
lstm_1 (LSTM)                (None, 4)                 336
_________________________________________________________________
repeat_vector (RepeatVector) (None, 30, 4)             0
_________________________________________________________________
lstm_2 (LSTM)                (None, 30, 4)             144
_________________________________________________________________
lstm_3 (LSTM)                (None, 30, 16)            1344
_________________________________________________________________
time_distributed (TimeDistri (None, 30, 10)            170
=================================================================
Total params: 3,722
Trainable params: 3,722
Non-trainable params: 0
_________________________________________________________________

Fit dos Dados

O Treino será realizado com 100 épocas com batch size = 10 e 5% de validação.

Será utilizado early stop para diminuir o overfitting.

[20]:
epochs_number = 100
batch_size = 10
history = model.fit(X_train,X_train,epochs=epochs_number,batch_size=batch_size,
                    validation_split=0.05,callbacks=[keras.callbacks.\
                    EarlyStopping(monitor='val_loss', patience=2, mode='min')],
                    shuffle=False).history
Epoch 1/100
3627/3627 [==============================] - 998s 273ms/step - loss: 0.0543 - val_loss: 0.0466
Epoch 2/100
3627/3627 [==============================] - 1019s 281ms/step - loss: 0.0448 - val_loss: 0.0469
Epoch 3/100
3627/3627 [==============================] - 945s 260ms/step - loss: 0.0441 - val_loss: 0.0430
Epoch 4/100
3627/3627 [==============================] - 902s 249ms/step - loss: 0.0290 - val_loss: 0.0266
Epoch 5/100
3627/3627 [==============================] - 911s 251ms/step - loss: 0.0262 - val_loss: 0.0262
Epoch 6/100
3627/3627 [==============================] - 924s 255ms/step - loss: 0.0259 - val_loss: 0.0264
Epoch 7/100
3627/3627 [==============================] - 927s 256ms/step - loss: 0.0258 - val_loss: 0.0257
Epoch 8/100
3627/3627 [==============================] - 917s 253ms/step - loss: 0.0256 - val_loss: 0.0261
Epoch 9/100
3627/3627 [==============================] - 932s 257ms/step - loss: 0.0260 - val_loss: 0.0239
Epoch 10/100
3627/3627 [==============================] - 921s 254ms/step - loss: 0.0260 - val_loss: 0.0235
Epoch 11/100
3627/3627 [==============================] - 904s 249ms/step - loss: 0.0262 - val_loss: 0.0239
Epoch 12/100
3627/3627 [==============================] - 900s 248ms/step - loss: 0.0260 - val_loss: 0.0239

Visualização das métricas.

Após o término será plotado um gráfico do MAE em função das épocas, tanto para o conjunto de treino como para o conjunto de validação.

[22]:
plt.plot(history['loss'], label='loss')
plt.plot(history['val_loss'], label='Validation loss')
plt.xlabel('epochs')
plt.ylabel('MAE - Mean Average Error')
plt.legend()
plt.show()
_images/Data_train_56_0.png

Salvamento dos Dados

Por fim a rede treinada será salva para posterior inferências.

[23]:
model.save(main_path + 'file_train/treino_1.h5')
[24]:
model.save_weights(main_path + 'file_train/weights_treino_1.h5')