Я работаю над проектом, который предполагает прогнозирование LSTM с использованием библиотеки Keras (работает через Tensorflow).
SETUP
Мой обучающий набор данных "X" (изначально) представляет собой фрейм данных Pandas, содержащий более 52 000 строк и 19 столбцов. Эти 19 столбцов содержат 15 текущих экзогенных показаний и один временной шаг, содержащий 4 предыдущих значения «Y» (y (t-1)). Количество временных шагов может быть изменено (то есть, если использование только одного временного шага не даст хороших прогнозов, я планирую расширить набор данных до 52 000+ x 23). Мой обучающий набор данных "Y" (также изначально) представляет собой фрейм данных Pandas, содержащий 52 000 строк + 4 столбца. Оба кадра данных преобразуются в массивы с использованием следующего кода:
trainXArr = np.array(trainX)
trainXArr = np.reshape(trainXArr, (1, trainXArr.shape[0], trainXArr.shape[1]))
trainYArr = np.array(trainY)
print
операторы подтверждают, что обработанные данные имеют размер trainXArr.shape = (1, 52590, 19) и trainYArr.shape = (52590, 4). Это согласуется с некоторыми учебниками, которые я видел, разбросанными по Интернету, за одним исключением: обычно trainYArr.shape будет выглядеть так (52590,).
Цель модели - сделать прогнозы для четырех точек (следовательно, 4 в форме массива trainYArr). В идеале все четыре точки должны быть предсказаны в одной и той же модели, а не создавать четыре отдельные модели с одним выходным сигналом в каждой. Моя модель определяется следующим образом:
model = Sequential()
model.add(LSTM(4, input_shape=(trainXArr.shape[1], trainXArr.shape[2]), activation='sigmoid'))
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mse', 'mae'])
ВЫПУСКА
Когда я запускаю модель, как описано в первом окне кода, я получаю следующую ошибку: ValueError: Input arrays should have the same number of samples as target arrays. Found 1 input samples and 52590 target samples.
Я читаю эту ошибку как сообщение о том, что размерность моего набора данных не соответствует порядку.
НЕИСПРАВНОСТЬ
Вот некоторые шаги, которые я предпринял для решения проблемы:
1) Изменение второй строки (первого поля кода) на trainXArr = trainXArr = np.reshape(trainXArr, (trainXArr.shape[0], 1, trainXArr.shape[1]))
дает ошибку ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (8738, 19)
.
Понятия не имею, откуда взялась эта цифра 8738, поскольку в моем коде нет ничего, содержащего длину 8738.
2) Добавление строки trainYArr = np.reshape(trainYArr, (1, trainYArr.shape[0], trainYArr.shape[1]))
дает ошибку: ValueError: Error when checking target: expected dense_1 to have 2 dimensions, but got array with shape (1, 52590, 4)
.
Это говорит о том, что моя проблема сводится либо к форме целевого набора данных (которая возвращает меня в исходное состояние), либо к конфигурации плотного слоя.
3) Применение # 2 при закомментировании плотного слоя приводит к ошибке: ValueError: Error when checking target: expected lstm_1 to have 2 dimensions, but got array with shape (1, 52590, 4)
.
Нет ... Это должна быть форма целевых данных.
4) Если закомментировать плотный слой и убрать строку trainYArr = np.reshape...
, выдается ошибка: ValueError: Input arrays should have the same number of samples as target arrays. Found 1 input samples and 52590 target samples.
И мы вернулись туда, откуда начали ...
Вопросы
После всего этого устранения неполадок я признал, что у меня возникла проблема с пониманием того, как настроить данные для соответствия модели LSTM. Мои вопросы:
1) Можно ли создать LSTM с использованием Keras, который может прогнозировать все четыре выхода одновременно?
2) Как мне структурировать свои данные, чтобы я мог тренировать модель LSTM / Dense?
Спасибо!