В настоящее время я пытаюсь создать модель для прогнозирования вывода нескольких шагов с несколькими входами в Керасе. Я хотел бы, чтобы кто-нибудь дал мне несколько советов о том, что я сделал неправильно, и, возможно, сказал бы мне, что это невозможно или неправильно.
Входы и выходы являются многовариантными. Сначала я тестирую, создавая ряд данных с формой (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-го удара, который модель предсказывает намного медленнее. Когда последовательность движений выполняется как смена другого человека, система сбрасывает состояния и снова начинает предсказывать.
Спасибо.