Estoy aprendiendo a usar Keras y he tenido un éxito razonable con mi conjunto de datos etiquetado utilizando los ejemplos de Deep Learning for Python de Chollet . El conjunto de datos es ~ 1000 Series temporales con longitud 3125 con 3 clases potenciales.
Me gustaría ir más allá de las capas densas básicas que me dan una tasa de predicción del 70% y el libro continúa discutiendo las capas LSTM y RNN.
Todos los ejemplos parecen usar conjuntos de datos con múltiples características para cada serie de tiempo y, como resultado, estoy luchando para encontrar la manera de implementar mis datos.
Si, por ejemplo, tengo una serie temporal de 1000x3125, ¿cómo introduzco eso en algo como la capa SimpleRNN o LSTM? ¿Me falta algún conocimiento fundamental de lo que hacen estas capas?
Código actual:
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()
fuente
batch_size
al definir el modelo, se tomará del mismo argumento dentromodel.fit()
. Debería remodelar para obtener(3025, 100, 1000)
, lo que significa 3025 lotes, cada uno de 100 (filas) pasos de tiempo y 1000 (columnas) variables. El usonp.reshape
lamentablemente no funcionará para esto (obtendrá un error), debido al hecho de que tendrá superposiciones de datos ... la forma final tiene más datos que la entrada. 3025x100x1000> 3125x1000 :np.reshape
no le gusta porque es ambiguo. Sugiero simplemente recorrer el conjunto de datos, 1 ciclo = 1 muestra.