LSTM в keras, форма ввода, временные шаги против nfeatures

#keras #lstm

#keras #lstm

Вопрос:

Я работаю над моделью прогнозирования с keras, используя слои LSTM, но у меня проблемы с пониманием того, как форматировать мои входные данные (модель возвращает nan также в зависимости от формата ввода).

Я постараюсь дать четкое объяснение!

Давайте назовем X моими входными данными, а y — моими выходными данными. Оба являются массивами одинаковой формы

 X.shape = (20, 1001)  
y.shape = (20, 1001)
 

Итак, в основном 20 выборок по 1001 значению в каждой.

Теперь давайте определим простую модель LSTM:

 model = Sequential()
model.add(LSTM(32,activation='relu', input_shape=XXX ))
model.add(Dense(y.shape[1]))
 

Форма ввода (XXX) на данный момент оставлена пустой.

Плотный слой — это выходные данные. Таким образом, он имеет длину одного образца (1001)

Форма ввода для слоя LSTM — это 3D: (образцы, временные шаги, объекты)

Таким образом, мои входные данные могут быть переформатированы либо с учетом выборки с шагом 1 раз с 1001 функцией

 X=trainX.reshape( (trainX.shape[0], 1, trainX.shape[1]) )
 

что дало бы input_shape в определении слоя

 input_shape=(1, trainX.shape[1])
 

Или с учетом 1001 временных шагов с 1 функцией

 X=trainX.reshape( (trainX.shape[0], trainX.shape[1], 1) )
 

и соответствующий input_shape

 input_shape=(trainX.shape[1], 1)
 

Первая конфигурация (1 временной шаг, 1001 функция) работает.

Вторые конфигурации (1001 временной шаг, 1 функция) не работают. Обучение очень быстро возвращает значения nan.

Мой вопрос в том, почему второе решение возвращает значения nan (я предполагаю, что я, возможно, неправильно понял, что означает временные интервалы)?

Концептуально, учитывая, что мой входной массив представляет собой одну функцию, а несколько временных шагов имеют для меня больше смысла, чем наоборот.

В лучшем случае я бы просто попробовал оба варианта работы с наилучшими результатами.

Еще одна вещь! Предполагается, что LSTM сохраняет некоторую память (учитывая, что значение имеет направление чтения, которое затем может быть прочитано в противоположном направлении с помощью двунаправленного встроенного слоя). Если данные представлены как один временной шаг, но несколько функций, имеет ли значение эта «направленность» массива?

Извините за длинный пост, надеюсь, кто-нибудь сможет пролить свет на это!

Ответ №1:

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

Комментарии:

1. Хорошо, это объясняет проблемы. Каким будет диапазон временных шагов, с которым можно работать?

2. конкретного ответа на этот вопрос нет, но вы можете попробовать разные длины.