Parcourir la source

ajout d'une première approche par LSTM, non fonctionnelle. Pas de validation

Emile
Emile Siboulet il y a 4 ans
Parent
révision
ec2d8b0ac5
5 fichiers modifiés avec 5578 ajouts et 0 suppressions
  1. 20
    0
      code/RNN/Model.py
  2. 5481
    0
      code/RNN/WILL5000INDFC.csv
  3. BIN
      code/RNN/dataset.npy
  4. 11
    0
      code/RNN/grab_data.py
  5. 66
    0
      code/RNN/training.py

+ 20
- 0
code/RNN/Model.py Voir le fichier

@@ -0,0 +1,20 @@
import tensorflow as tf

class MyModel(tf.keras.Model):

def __init__(self, HIDDEN):
super(MyModel, self).__init__()
self.lstm1 = tf.keras.layers.LSTM(HIDDEN, return_sequences=True)
self.lstm2 = tf.keras.layers.LSTM(HIDDEN, return_sequences=True)
#self.lstm3 = tf.keras.layers.LSTM(HIDDEN, return_sequences=True)
#self.lstm4 = tf.keras.layers.LSTM(HIDDEN, return_sequences=True)
self.lstmlast = tf.keras.layers.LSTM(1, return_sequences=True)


def call(self, inputs):
x = self.lstm1(inputs)
x = self.lstm2(x)
#x = self.lstm3(x)
#x = self.lstm4(x)
x = self.lstmlast(x)
return x

+ 5481
- 0
code/RNN/WILL5000INDFC.csv
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


BIN
code/RNN/dataset.npy Voir le fichier


+ 11
- 0
code/RNN/grab_data.py Voir le fichier

@@ -0,0 +1,11 @@
import pandas
import numpy as np

csv = pandas.read_csv("WILL5000INDFC.csv")
extraction = csv["WILL5000INDFC"].tolist()
for i in range(len(extraction)) :
if extraction[i] == "." :
extraction[i] = extraction[i-1]
extraction = np.array(extraction).astype(float)
print(extraction)
np.save("dataset.npy", extraction)

+ 66
- 0
code/RNN/training.py Voir le fichier

@@ -0,0 +1,66 @@
import tensorflow as tf
from matplotlib import pyplot as plt
import numpy as np
from Model import MyModel

LEN_TRAIN = 5000
LEN_SEQ = 100
PRED = 0.02
HIDDEN = 128

model = MyModel(HIDDEN)

dataset = np.load('dataset.npy')
datasetp = np.roll(dataset, 1)
datasetp[0] = dataset[0]
data = (dataset - datasetp)/datasetp
data = data*2/(max(data) - min(data))

annee = np.array(list(range(len(data))))/365
annee = annee - annee[-1]
start_pred = int(len(data)*(1-PRED))
print(len(data))
print(start_pred)
plt.figure(1)
plt.plot(annee[:start_pred],data[:start_pred], label="apprentissage")
plt.plot(annee[start_pred:],data[start_pred:], label="validation")
plt.legend()
plt.show()

X_train = [data[0:start_pred-1]]
Y_train = [data[1:start_pred]]

X_train = np.expand_dims(np.array(X_train),2)
Y_train = np.expand_dims(np.array(Y_train),2)


model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['binary_crossentropy'])
import os
os.system("rm -rf log_dir")

model.fit(x=X_train, y=Y_train, epochs=30)

Pred = X_train.copy()
while len(Pred[0]) < len(data) :
print(len(data) - len(Pred[0]))
Pred = np.concatenate((Pred, np.array([[model.predict(Pred)[0][-1]]])),1)
Pred = Pred/2*(max(data) - min(data))
data_Pred = dataset.copy()
Pred = np.squeeze(Pred)
for i in range(start_pred,len(data_Pred)) :
data_Pred[i] = data_Pred[i-1]*Pred[i] + data_Pred[i-1]

plt.figure(2)
plt.plot(annee[:start_pred],dataset[:start_pred], label="apprentissage")
plt.plot(annee[start_pred:],dataset[start_pred:], label="validation")
plt.plot(annee, data_Pred, label="prediction")
plt.legend()

fig, axs = plt.subplots(2)
axs[0].plot(annee[:start_pred],dataset[:start_pred], label="apprentissage")
axs[0].plot(annee[start_pred:],dataset[start_pred:], label="validation")
axs[1].plot(annee, data_Pred, label="prediction")
plt.legend()
plt.show()

Chargement…
Annuler
Enregistrer