J'apprends à utiliser Keras et j'ai eu un succès raisonnable avec mon ensemble de données étiqueté en utilisant les exemples de Deep Learning pour Python de Chollet . L'ensemble de données est ~ 1000 séries temporelles de longueur 3125 avec 3 classes potentielles.
Je voudrais aller au-delà des couches denses de base qui me donnent un taux de prédiction d'environ 70% et le livre continue pour discuter des couches LSTM et RNN.
Tous les exemples semblent utiliser des ensembles de données avec plusieurs fonctionnalités pour chaque série temporelle et j'ai du mal à trouver comment implémenter mes données en conséquence.
Si, par exemple, j'ai des séries temporelles de 1 000 x 3 125, comment puis-je les alimenter dans quelque chose comme la couche SimpleRNN ou LSTM? Me manque-t-il une connaissance fondamentale de ce que font ces couches?
Code actuel:
import pandas as pd
import numpy as np
import os
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM, Dropout, SimpleRNN, Embedding, Reshape
from keras.utils import to_categorical
from keras import regularizers
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
def readData():
# Get labels from the labels.txt file
labels = pd.read_csv('labels.txt', header = None)
labels = labels.values
labels = labels-1
print('One Hot Encoding Data...')
labels = to_categorical(labels)
data = pd.read_csv('ts.txt', header = None)
return data, labels
print('Reading data...')
data, labels = readData()
print('Splitting Data')
data_train, data_test, labels_train, labels_test = train_test_split(data, labels)
print('Building Model...')
#Create model
model = Sequential()
## LSTM / RNN goes here ##
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print('Training NN...')
history = model.fit(data_train, labels_train, epochs=1000, batch_size=50,
validation_split=0.25,verbose=2)
results = model.evaluate(data_test, labels_test)
predictions = model.predict(data_test)
print(predictions[0].shape)
print(np.sum(predictions[0]))
print(np.argmax(predictions[0]))
print(results)
acc = history.history['acc']
val_acc = history.history['val_acc']
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
la source
batch_size
lors de la définition du modèle, il sera tiré du même argument qu'il contientmodel.fit()
. Vous devez remodeler pour obtenir(3025, 100, 1000)
, ce qui signifie 3025 lots, chacun de 100 (lignes) timesteps et 1000 (colonnes) variables. L'utilisationnp.reshape
ne fonctionnera malheureusement pas pour cela (vous obtiendrez une erreur), car vous aurez des chevauchements de données ... la forme finale a plus de données que l'entrée. 3025x100x1000> 3125x1000 -np.reshape
n'aime pas ça car c'est ambigu. Je suggère simplement de boucler sur l'ensemble de données, 1 boucle = 1 échantillon.