Проблема определения размера набора данных Keras LSTM - PullRequest
0 голосов
/ 08 мая 2018

Я работаю над проектом, который предполагает прогнозирование 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?

Спасибо!

1 Ответ

0 голосов
/ 08 мая 2018

LSTM принимает данные в виде

(no_of_samples,timesteps,no_of_features)

ValueError: Входные массивы должны иметь то же количество выборок, что и целевые массивы. Найдено 1 входных образцов и 52590 целевых образцов.

Что касается первоначальной проблемы, модель считает, что у вас есть 1 выборка с 52000 временных шагов с 19 характеристиками в каждой, поскольку форма обучающих данных равна (1,52000,19). С другой стороны, форма поставляемых этикеток, т. Е. (52000,4), означает, что у вас есть 4 этикетки на 52000 образцов. Вот почему вы получаете ошибку несоответствия.

Эти 19 столбцов содержат 15 текущих экзогенных показаний и один временной шаг, содержащий 4 предыдущих значения "Y" (y (t-1)).

Если я правильно понимаю, то 4 показания предыдущих временных шагов также будут иметь соответствующие показания для текущих временных шагов в других 15 функциях
т.е. (4 показания за предыдущий) + (соответствующие 4 за текущий) + (11 других замеров) = всего 19
Так что ваши временные шаги здесь два одновременно.

Как мне структурировать свои данные, чтобы я мог обучить модели LSTM / Dense?

Я не знаю приложения или контекста и почему вы передаете только 4 функции за предыдущие временные шаги. Но ваша форма ввода должна быть примерно такой (52000,2, no_of_features). Может быть, вы могли бы разделить входные данные для модели. Первый входной поток будет иметь 4 функции, которые связаны со временем и входят в LSTM. Вторым входом будут остальные, а затем вы присоединитесь к ним после LSTM. Но это только одно из решений

Можно ли создать LSTM с использованием Keras, который может прогнозировать все четыре выхода одновременно?

Да, вы можете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...