Обучение LSTM в Керасе с временными рядами различной длины - PullRequest
0 голосов
/ 07 июня 2018

Я новичок в Keras и удивляюсь, как обучать LTSM с (прерванными) временными рядами различной длины.Рассмотрим, например, непрерывный ряд с 1 по 10 день и еще один непрерывный ряд с 15 по 20 день. Простое объединение их в один ряд может привести к неверным результатам.Я вижу в основном два варианта, чтобы привести их в форму (batch_size, timesteps, output_features):

  1. Расширить более короткую серию на некоторое значение по умолчанию (0), т.е. для приведенного выше примера у нас будет следующий пакет:

    d1, ..., d10
    d15, ..., d20, 0, 0, 0, 0, 0
    
  2. Вычислить GCD длин, разрезать серию на куски и использовать LSTM с состоянием, то есть:

    d1, ..., d5
    d6, ..., d10
    reset_state
    d15, ..., d20
    

Есть ли другие / лучшие решения?Является ли обучение LSTM без состояния с полной последовательностью эквивалентным обучению LSTM с состоянием с кусками?

1 Ответ

0 голосов
/ 08 июня 2018

Вы пробовали подавать слой LSTM входами разной длины?Вводимые временные ряды могут иметь различную длину при использовании LSTM (даже размеры партии могут отличаться от одной партии к другой, но размеры объектов должны быть одинаковыми).Вот пример в Керасе:

from keras import models, layers

n_feats = 32
latent_dim = 64

lstm_input = layers.Input(shape=(None, n_feats))
lstm_output = layers.LSTM(latent_dim)(lstm_input)

model = models.Model(lstm_input, lstm_output)
model.summary()

Вывод:

Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer)         (None, None, 32)          0         
_________________________________________________________________
lstm_2 (LSTM)                (None, 64)                24832     
=================================================================
Total params: 24,832
Trainable params: 24,832
Non-trainable params: 0

Как видно, первая и вторая оси входного слоя - None.Это означает, что они не указаны заранее и могут иметь любое значение.Вы можете думать о LSTM как о цикле.Независимо от длины ввода, пока есть оставшиеся векторы данных одинаковой длины (т.е. n_feats), уровень LSTM обрабатывает их.Поэтому, как вы можете видеть выше, количество параметров, используемых в слое LSTM, не зависит от размера пакета или длины временного ряда (это зависит только от длины вектора входного объекта и скрытого измерения LSTM).

import numpy as np

# feed LSTM with: batch_size=10, timestamps=5
model.predict(np.random.rand(10, 5, n_feats))   # This works

# feed LSTM with: batch_size=5, timestamps=100
model.predict(np.random.rand(5, 100, n_feats))  # This also works

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

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