Проблема с многомерным многими ко многим LSTM в Керасе - PullRequest
0 голосов
/ 17 марта 2020

В настоящее время я пытаюсь создать модель для прогнозирования вывода нескольких шагов с несколькими входами в Керасе. Я хотел бы, чтобы кто-нибудь дал мне несколько советов о том, что я сделал неправильно, и, возможно, сказал бы мне, что это невозможно или неправильно.

Входы и выходы являются многовариантными. Сначала я тестирую, создавая ряд данных с формой (799,2), и генерирую X с 20 шагами назад с формой (776,20,2) и Y с прогнозом 3 шага.

Генерируемые мной тестовые данные довольно просты. Это две серии, одна из которых считается от 0 до 1, а другая - от 1 до 0. Затем я делю набор обучения / теста на соотношение 0,8 / 0,2. .

incds = np.arange(1, 1000) / 1000
decds = (1000-np.arange(1, 1000)) / 1000
dcombined = vstack((incds, decds)).T

Затем я строю модель, используя следующее:

look_back = 20
look_forward = 3
n_features = 2
batch_size = 1

model = Sequential()
model.add(LSTM(200, batch_input_shape=(batch_size, look_back, 2), stateful=True))
model.add(RepeatVector(look_forward))
model.add(TimeDistributed(Dense(n_features)))
model.compile(loss='mse', optimizer='adam')

и подгоняю, используя:

for i in range(30):
    model.fit(trainX, trainY, epochs=1, batch_size=batch_size,  shuffle=False)
    model.reset_states()

Потери go уменьшаются, но предсказания не имеют смысла. Например, мои прогнозы будут выглядеть так:

array([[[0.98509896, 0.71038395],
        [0.98509896, 0.71038395],
        [0.98509896, 0.71038395]],

       [[0.9850033 , 0.71024674],
        [0.9850033 , 0.71024674],
        [0.9850033 , 0.71024674]],

       [[0.9849046 , 0.7101098 ],
        [0.9849046 , 0.7101098 ],
        [0.9849046 , 0.7101098 ]],

       [[0.98480636, 0.7099726 ],
        [0.98480636, 0.7099726 ],
        [0.98480636, 0.7099726 ]]], dtype=float32)

, а фактический Y будет выглядеть так:

array([[[0.5105, 0.9895],
        [0.511 , 0.989 ],
        [0.5115, 0.9885]],

       [[0.511 , 0.989 ],
        [0.5115, 0.9885],
        [0.512 , 0.988 ]],

       [[0.5115, 0.9885],
        [0.512 , 0.988 ],
        [0.5125, 0.9875]],

       [[0.512 , 0.988 ],
        [0.5125, 0.9875],
        [0.513 , 0.987 ]]])

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

Пример, который я хотел бы сделать, состоит в том, чтобы предсказать скорость удара, и в состоянии предсказать, что удар 3 будет самым сильным (наращивание от удара 1) до, возможно, 10-го удара, который модель предсказывает намного медленнее. Когда последовательность движений выполняется как смена другого человека, система сбрасывает состояния и снова начинает предсказывать.

Спасибо.

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