Я изучаю, как использовать Keras, и я добился разумного успеха с моим помеченным набором данных, используя примеры в Chollet Deep Learning for Python . Набор данных ~ 1000 временных рядов с длиной 3125 с 3 потенциальными классами.
Я хотел бы выйти за рамки базовых плотных слоев, которые дают мне около 70% прогнозирования, и далее в книге обсуждаются уровни LSTM и RNN.
Кажется, что во всех примерах используются наборы данных с несколькими функциями для каждой временной серии, и я изо всех сил пытаюсь понять, как реализовать мои данные в результате.
Если, например, у меня есть временной ряд 1000x3125, как мне передать это во что-то вроде слоя SimpleRNN или LSTM? Мне не хватает фундаментальных знаний о том, что делают эти слои?
Текущий код:
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()
источник
batch_size
при определении модели, он будет взят из того же аргумента внутриmodel.fit()
. Вы должны(3025, 100, 1000)
изменить форму, чтобы получить , что означает 3025 пакетов, каждый из 100 (строки) временных шагов и 1000 (столбцы) переменных. Использованиеnp.reshape
, к сожалению, не будет работать для этого (вы получите ошибку), из-за того, что у вас будут наложения данных ... конечная фигура имеет больше данных, чем входных данных. 3025x100x1000> 3125x1000 -np.reshape
не нравится, так как это неоднозначно. Я предлагаю просто зацикливаться на наборе данных, 1 петля = 1 выборка.