Как я могу сделать модель последовательности к последовательности (RNN / LSTM) с Keras с данными фиксированной длины? - PullRequest
2 голосов
/ 14 февраля 2020

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

У меня есть вход в виде вектора (1, 1000). Это данные временных рядов, поэтому у меня будет 10 из них по порядку. Что, если я правильно понимаю тензоры, дает мне что-то в форме (10, 1, 1000), верно?

Я хочу передать это через RNN / LSTM, и выходные данные также должны иметь такую ​​же форму (10, 1, 1000). А именно, 10 векторов по 1000 измерений каждый.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Если вам нужна только модель LSTM, которая принимает входные данные формы (nb_seq, 1, 1000) (с nb_seq, равным вашему числу последовательностей, 10 в вашем случае) и выводит ту же форму, вот базовая модель c, которую вы можете adapt: ​​

input_x = Input(shape=(1, 1000))
x = LSTM(64, return_sequences=True)(input_x)
x = LSTM(64, return_sequences=True)(x)
x = Dense(1000)(x)

Model(inputs=input_x, outputs=x)

Слой LSTM с return_sequence = True вернет тензор формы (nb_seq, 1, 64) (при 64 числах нейронов в вашем слое LSTM), поэтому для найти исходную форму, которую вы можете либо пропустить через этот тензор через плотный слой, который придаст вам форму (nb_seq, 1, 1000), либо вы можете напрямую иметь 1000 нейронов на последнем слое LSTM (я не рекомендую, потому что он сгенерирует много параметров).

Вы можете изменить это, когда вы будете sh.

РЕДАКТИРОВАТЬ после точности

Поскольку keras LSTM принимает только 3D-ввод, вы можете обмануть его, передав Распределение по времени сглаживает слой в начале, как это:

input_x = Input(shape=(10, 1, 1000))
x = TimeDistributed(Flatten())(input_x)
x = LSTM(64, return_sequences=True)(x)
x = LSTM(64, return_sequences=True)(x)
x = Dense(1000)(x)
x = Reshape(target_shape=(10, 1, 1000))(x)

Model(inputs=input_x, outputs=x)

Это дает вам такую ​​сводку:

Model summary

1 голос
/ 17 февраля 2020

Первое, что вам нужно, это знать, «что» вы считаете последовательностью там.

Какие шаги? Это 10 временных шагов? Или это 1000 временных шагов?


Сначала я предположу, что у вас 1000 временных шагов

Тогда следующий вопрос: каковы 10 вещей? Это 10 разных независимых примеров одной и той же природы? Или это 10 параллельных вещей различной природы (особенностей) из одного и того же примера?


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

  • (10, 1000, 1): 10 отдельных примеров, 1000 временных шагов на пример, измерение одной переменной / элемента
  • (1, 1000, 10): 1 длинная последовательность, 1000 временных шагов, измерение 10 независимых переменных / значений
    • Вам нужно будет разделить ваши данные на скользящие windows, потому что примеров для двух вышеупомянутых случаев слишком мало (есть много примеров того, как это сделать онлайн). Если вы этого не сделаете, ваша модель будет дико наряжаться.
    • Скольжение windows Вы превратите данные в (more_examples, shorter_length, same_features)
  • (1000, 10, 1): 1000 различных последовательностей из 10 временных шагов, измеряющих одну переменную / функцию
    • Хорошие данные, вы хороши для go
  • (1, 10, 1000): 1 единственная последовательность из 10 временных шагов, измеряющая 1000 независимых переменных / функций
    • Я не уверен, что эти данные можно обучить, у вас недостаточно примеров, даже если вы пытаетесь скользить windows
  • (10, 1, 1000): 10 отдельных примеров, 1 шаг, измерение 1000 переменных / функций
  • (1000, 1, 10): 1000 различных последовательностей с одним временным шагом измерения десяти переменных.
    • Два приведенных выше случая не являются последовательностями для работы с LSTM.

Как только вы решили это, пришло время поработать:

Соберите входные данные в соответствии с вашим делом и запустите модель.

Я буду считать, что у вас есть данные в форме (samples, timesteps, features), тогда ваша модель может go, например:

inputs = Input((timesteps, features)) #or (None,features) for variable length
outputs = LSTM(any_units, return_sequences=True)(inputs)
.... can add more LSTM layers with different units, and return_sequences=True
.... can add Conv1D layers with padding='same', any number of filters
outputs = Dense(desired_features, activation=some_useful_activation)(outputs)

Обратите внимание, что ваш вывод обязательно (samples, timesteps, desired_features). Если вы хотите другую конечную форму, измените ее за пределами модели.

...