2016-10-17 2 views
4

Я хочу использовать нейронную сеть LSTM с keras для прогнозирования групп временных рядов, и у меня возникают проблемы с тем, чтобы модель соответствовала тому, что я хочу. Размеры моих данных являются:Размеры, не соответствующие в keras LSTM model

вход Тензор: (data length, number of series to train, time steps to look back)

выход Тензор: (data length, number of series to forecast, time steps to look ahead)

Примечание: Я хочу, чтобы сохранить размеры точно так, не транспозиции.

Фиктивный код данных, который воспроизводит проблемы является:

import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense, TimeDistributed, LSTM 

epoch_number = 100 
batch_size = 20 
input_dim = 4 
output_dim = 3 
look_back = 24 
look_ahead = 24 
n = 100 

trainX = np.random.rand(n, input_dim, look_back) 
trainY = np.random.rand(n, output_dim, look_ahead) 
print('test X:', trainX.shape) 
print('test Y:', trainY.shape) 

model = Sequential() 

# Add the first LSTM layer (The intermediate layers need to pass the sequences to the next layer) 
model.add(LSTM(10, batch_input_shape=(None, input_dim, look_back), return_sequences=True)) 

# add the first LSTM layer (the dimensions are only needed in the first layer) 
model.add(LSTM(10, return_sequences=True)) 

# the TimeDistributed object allows a 3D output 
model.add(TimeDistributed(Dense(look_ahead))) 

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy']) 
model.fit(trainX, trainY, nb_epoch=epoch_number, batch_size=batch_size, verbose=1) 

Этот trows:

Исключение: Ошибка при проверке целевой модели: ожидаемое timedistributed_1, чтобы иметь форму (Не, 4 , 24), но получил массив с формой (100, 3, 24)

Проблема заключается в определении слоя TimeDistributed.

Как определить слой TimeDistributed так, чтобы он собирал и тренировал?

ответ

0

Сообщение об ошибке немного неверно в вашем случае. Ваш выходной узел сети называется timedistributed_1, потому что это последний узел в вашей последовательной модели. То, что сообщение об ошибке пытается сказать вам, заключается в том, что вывод этого узла не соответствует цели вашей модели, подходит к, то есть вашим меткам trainY.

Ваш trainY имеет форму (n, output_dim, look_ahead), так (100, 3, 24) но сеть производит выходную форму (batch_size, input_dim, look_ahead). Проблема в этом случае заключается в том, что output_dim! = input_dim. Если изменяется ваше измерение времени, вам может потребоваться прокладка или сетевой узел, который удаляет указанный временной сигнал.

0

Я думаю, проблема в том, что вы ожидаете output_dim (! = input_dim) на выходе TimeDistributed, в то время как это невозможно. Этот размер - это то, что он считает : размер: он сохраняется.

вход должен быть по крайней мере 3D, и размерность индекса один будет считать временное измерение.

Цель TimeDistributed заключается в применении тот же слой каждого временного шага. Вы можете получить только то же количество шагов времени, с которых вы начали.

Если вам действительно нужно свести это измерение с 4 до 3, я думаю, вам нужно либо добавить еще один слой в конце, либо использовать что-то отличное от TimeDistributed.

PS: один намек на поиск этой проблемы состоял в том, что output_dim никогда не используется при создании модели, она появляется только в данных проверки. Хотя это всего лишь запах кода (в этом наблюдении может быть что-то не так), это что-то заслуживающее проверки.

+0

Я делаю транспозицию, потому что для одного временного ряда эта транспозиция делает прогноз намного точнее. Я получил эту идею, следуя этому руководству: http://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/ Но, я думаю, есть еще одна работа, которую нужно сделать для многих, многие отношения –

Смежные вопросы