Зачем нам нужно менять форму ввода для LSTM? - PullRequest
2 голосов
/ 16 июня 2020

Я читал эту статью о LSTM:

https://machinelearningmastery.com/how-to-develop-lstm-models-for-time-series-forecasting/

Первый базовый пример c касается "Vanilla LSTM": предсказать следующий временной ряд

Где ввод = [10, 20, 30, 40, 50, 60, 70, 80, 90]

В статье автор разбил ввод (последовательность) на матрицу:

X,              y
10, 20, 30      40
20, 30, 40      50
30, 40, 50      60
...

Я не могу понять, зачем нужен ввод изменить форму:

reshape from [samples, timesteps] into [samples, timesteps, features]

1. Зачем нам это нужно?

Кроме того, если мой ввод похож (основной c пример + столбцы ID):

ID    X,                y
1     10, 20, 30        40
1     20, 30, 40        50
2     30, 40, 50        60
2     40, 50, 60,       70
...

2. как мы его меняем? что у нас будет новое измерение?

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Думаю, эта ссылка поможет вам понять, почему.

Вам всегда нужно давать трехмерный массив в качестве входных данных для вашей сети LSTM. Если первое измерение представляет размер пакета, второе измерение представляет количество временных шагов, которые вы вводите в последовательность. И третье измерение представляет количество единиц в одной входной последовательности. Например, форма ввода выглядит так (batch_size, time_steps, seq_len)

Возьмем вашу примерную последовательность: [10, 20, 30, 40, 50, 60, 70, 80, 90]

После того, как мы выполним split_sequence, как указано в вашей статье, мы получим двумерный вектор признаков X формы (6, 3). Где 6 - количество выборок, а 3 - количество шагов.

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

поэтому из (6, 3) -> (6, 3, 1).

Чтобы ответить на ваш второй вопрос, вы можете просто изменить свой двумерный вектор признаков X, выполнив следующие:

# Given that X is a numpy array
samples = X.shape[0]
steps = X.shape[1]
X = X.reshape(samples, steps, 1)
2 голосов
/ 16 июня 2020

Не знаю, откуда берется идентификатор, но для сети LSTM в Керасе вам нужно, чтобы ваш ввод был трехмерным.

Первоначально у вас есть 2-мерная матрица в качестве входных данных, где каждая строка представляет собой одну временную метку, поэтому
[samples, timesteps].

Но поскольку ожидается, что ввод будет трехмерным, вы измените его как [samples, timesteps, 1]. Здесь 1 обозначает количество функций или переменных, которые есть в ваших данных. Поскольку это одномерный временной ряд (у вас есть последовательность только из 1 переменной), n_features равно 1.

Это легко сделать с помощью np_array.reshape(np_array.shape[0], np_array.shape[1], 1)

...