Как смоделировать 1D сеть CNN + LSTM, где каждый шаг по времени представляет собой набор 1D массивов? - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь смоделировать сеть на основе Keras, используя набор 1D слоев CNN и LSTM. В большинстве доступных в Интернете примеров используются данные в форме, например (1, 30, 50) (1 образец, содержащий 30 временных шагов по 50 объектов в каждом).

Однако каждый временной шаг в моем наборе данных состоит из нескольких одномерных массивов. Выборка с 10 временными шагами будет (1, 10, 100, 384) (1 партия - одна выборка, 10 временных шагов, каждая из которых содержит 100 массивов с 384 признаками). Итак, как мне определить модель с такой формой?

Я действительно мог бы сгладить данные каждого временного шага (100*384), но это кажется совершенно неадекватным, поскольку могло бы аннулировать всю обработку CNN ... Плюс, все данные временного шага действительно 1D: это не так пространственные данные .

Я уже определил простую модель, такую ​​как ниже, но я думаю, что она неправильно использует batch_size формы ввода. Я думаю, что он пытается учиться на «482 сэмплах», а не на одном сэмпле с «482 временными шагами» ...

data_input_shape = (482, 100, 384)

model = Sequential()
model.add(Conv1D(300, 1, activation="relu", input_shape=(100,384)))
model.add(MaxPooling1D(4))
model.add(Conv1D(256, 1, activation="relu"))
model.add(MaxPooling1D(4))
model.add(Conv1D(128, 1, activation="relu"))
model.add(MaxPooling1D(5))

model.add(LSTM(200, return_sequences=True))
model.add(LSTM(200, return_sequences=True))
model.add(LSTM(200, return_sequences=True))
model.add(Dense(1, activation='sigmoid'))

Есть предложения?

1 Ответ

0 голосов
/ 03 июля 2019

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

  1. 384 значения каждого объекта пространственно независимы.
  2. 384 значения каждой функции пространственно зависят.Например, это значения в частотном диапазоне после некоторого БПФ или аналогичной операции.

В случае 1 у вас есть в основном независимая функция 100x384.Таким образом, сглаживание, кажется, является опцией.

В случае 2, возможно, имеет смысл применить двумерную свертку ко всем элементам.Вот как это делается:

Сначала вы должны подготовить данные в правильном формате.Предполагая, что ваши данные имеют 482 временных шага, вы должны решить, сколько временных шагов вы хотели бы иметь в каждой выборке.Например, вы можете решить сделать 10 временных шагов в каждой выборке, что без перекрытия между выборками даст вам около 48 выборок.Таким образом, данные теперь будут иметь форму (48, 10, 100, 384).Кроме того, мы должны добавить дополнительное измерение в качестве канала, чтобы иметь возможность применять двумерную свертку в Керасе.Таким образом, ваши данные обретут форму (48, 10, 100, 384, 1)

Далее вы можете выбрать архитектуру.Мы будем применять Conv2D к каждому массиву на каждом временном шаге.Мы используем размер ядра (1, x) или (100, x), поскольку ваши массивы пространственно не связаны.Вот пример архитектуры:

model = Sequential()
model.add(TimeDistributed(Conv2D(16, (1, 5), activation="relu"), input_shape=(10, 100, 384, 1)))
model.add(TimeDistributed(MaxPooling2D((1, 2))))
model.add(TimeDistributed(Conv2D(32, (100, 9), activation="relu"), input_shape=(10, 100, 384, 1)))
model.add(TimeDistributed(MaxPooling2D((1, 4))))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(16, return_sequences=True))
model.add(Dense(1, activation='sigmoid'))

Несколько дополнительных примечаний:

  • Вы, безусловно, можете добавить больше слоев каждого типа.
  • TimeDistruted является новым выше.Вы можете прочитать об этом здесь .
  • Если у вас есть изображения для начала, рассмотрите возможность использования гибрида CNN / LSTM или Conv3D с самого начала по сравнению с извлечением 100 массивов из изображения.
  • Взгляните на ConvLSTM2D здесь для комбинированного слоя CNN и LSTM.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...