Одномерная ошибка LSTM с сохранением состояния KERAS для многошагового прогнозирования вперед ValueEor: не удалось передать входной массив из формы (180,1) в форму (1,1) - PullRequest
0 голосов
/ 25 мая 2020

У меня есть простой набор данных временного ряда, содержащий дни и связанные с ними посещения веб-сайта. Я хочу создать прогноз c трафика. table

Для прогноза я хочу спрогнозировать посещения на следующие 180 дней в будущем, используя LSTM с отслеживанием состояния KERAS с return_sequences = True.

n_input = 180
n_features = 1
batch_size = 180
#epochs = 120
timesteps = 180

Чтобы найти максимальную длину поезда в соответствии с размером партии, я использовал следующий код:

def get_train_length(dataset, batch_size, test_percent):
# substract test_percent to be excluded from training, reserved for testset
length = len(dataset)
length *= 1 - test_percent
train_length_values = []
for x in range(int(length) - 100,int(length)): 
    modulo=x%batch_size
    if (modulo == 0):
        train_length_values.append(x)
        print(x)
return (max(train_length_values))

length = get_train_length(df_data_2, batch_size, 0)
print(length)

В этом случае результат был 2160.

Чтобы получить данные в правильный формат для lstm, я использовал MinMaxScale ()

scaler = MinMaxScaler()
scaler.fit(train3)
train3 = scaler.transform(train3)

Моя модель выглядит следующим образом:

#two hidden layer - WORKING NOW
from keras.optimizers import adam
import keras.utils
from keras.layers import Activation, Dense, Flatten
import numpy as np

timesteps = 180
generator = TimeseriesGenerator(train3, train3, length=n_input, batch_size=180)
model = Sequential()
model.add(LSTM(1,return_sequences=True, batch_input_shape=(n_input, timesteps, n_features),stateful=True))
model.add(LSTM(200, return_sequences=True,stateful=True))
model.add(Dropout(0.25))
model.add(LSTM(150, return_sequences=True,stateful=True))
model.add(Dropout(0.20))
model.add(LSTM(100, stateful=True))
model.add(Dropout(0.15))
model.add(Dense(1,activation='sigmoid'))

adam = adam(lr=0.1,beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])

model.summary()

Резюме выглядит так:

lstm_model_summary

При запуске fit_generator все кажется прекрасным (epochs = 2 здесь только для более быстрого тестирования)

epochs=2
for i in range(epochs):
    print("Epoch: " + str(i))
    #run through all data but the cell, hidden state are used for the next batch.
    history = model.fit_generator(generator,epochs=1,shuffle=False)

    #regressor_mse.fit(train, train, shuffle=False, epochs = 1, batch_size = batch_size)
    #resets only the states but the weights, cell and hidden are kept.
    model.reset_states()

Но когда я пытаюсь вызвать прогноз функция для создания списка прогнозов (взято из этого руководства: LSTM Tutorial ),

pred_list = []

batch = train3[-n_input:].reshape((1,n_input,n_features))

for i in range(n_input):   
    pred_list.append(model.predict(batch)[0]) 
    batch = np.append(batch[:,1:,:],[[pred_list[i]]],axis=1)

Я получаю следующее сообщение об ошибке: ValueError: не удалось передать входной массив из формы (180,1) в форму (1,1)

Полное сообщение об ошибке: ValueError: could not broadcast input array from shape into shape* 104 2 *

Пожалуйста, кто-нибудь может взглянуть на это, потому что я застрял здесь, и мне действительно нужна помощь, чтобы решить эту проблему.

...