Saída múltipla para previsão de vários passos à frente usando LSTM com keras

7

Eu sou novo no aprendizado profundo e LSTM (com keras). Estou tentando resolver uma previsão de séries temporais com vários passos à frente. Eu tenho três séries temporais: A, B e C e quero prever os valores de C. Estou treinando um LSTM alimentando 3 passos para trás nos pontos de dados para prever os próximos 3 passos no futuro. Os dados de entrada são parecidos com:

X = [[[A0, B0, C0],[A1, B1, C1],[A2, B2, C2]],[[ ...]]]

com dimensões: (1000, 3, 3). A saída é:

y = [[C3, C4, C5],[C4, C5, C6],...]

com dimensões: (1000, 3).

Estou usando um LSTM simples com 1 camada oculta (50 neurônios). Eu configurei um LSTM com keras como:

n_features = 3
neurons = 50
ahead = 3
model = Sequential()
model.add(LSTM(input_dim=n_features, output_dim=neurons))
model.add(Dropout(.2))
model.add(Dense(input_dim=neurons, output_dim=ahead))
model.add(Activation('linear'))
model.compile(loss='mae', optimizer='adam')
model.fit(X, y, epochs=50)

Este modelo funciona bem. Agora, eu gostaria de prever os valores de B também (usando a mesma entrada). Por isso, tentei remodelar a saída de maneira semelhante à do treinamento com vários recursos:

 y = [[[B3, C3],[B4, C4],[B5, C5]],[[ ...]]]

de modo que ele tem dimensões: (1000, 3, 2). No entanto, isso me dá um erro:

Error when checking target: expected activation_5 to have 2 dimensions, 
but got array with shape (1000, 3, 2)

Eu acho que a estrutura da rede precisa mudar. Eu tentei modificar model.add(Dense(input_dim=neurons, output_dim=ahead))sem sucesso. Devo remodelar o ydiferente? A estrutura da rede está errada?

NCL
fonte
Eu também estou trabalhando em um problema semelhante. Você pode me consultar sobre como você preparou seus dados? X = [[[A0, B0, C0], [A1, B1, C1], [A2, B2, C2]], [[...]]]? Eu também tenho uma pergunta: quando você previu os próximos 3 pontos, você usou os 3 anteriores? Mas quando você deseja prever o quinto, usou o quarto previsto? Agradeço antecipadamente?
Osaozz
Alterar a saída do último densa camada a 3, pode resolver o problema
Kaustabh Ganguly
Se você sempre alimenta no mesmo comprimento e produz o mesmo comprimento, não precisa realmente de nenhum tipo de RNN e poderá obter melhores resultados se não os usar.
#

Respostas:

1
model = Sequential()
model.add(LSTM(input_dim=n_features, output_dim=neurons))
model.add(Dropout(.2))
model.add(Flatten())
model.add(Dense(ahead))
model.compile(loss='mae', optimizer='adam')
model.fit(X, y, epochs=50)

As diferenças incluem:

  • Estou achatando a saída do LSTM, porque ele fornecerá um tensor 3D e uma camada densa para esse cenário que acredito que esperará um tensor 2D.
  • Fez a alteração sugerida em outra resposta .
  • Removida a camada de ativação, pois a ativação padrão da camada densa de Keras é linear.
tenshi
fonte