Многоэтапная классификация серийного поезда LSTM Keras на каждом этапе - PullRequest
0 голосов
/ 18 октября 2018

Вопрос

Как выполнить пакетную подготовку многоэтапного LSTM в Керасе для одноклассовой многоклассовой классификации, на каждом временном шаге для> 2 классов?

Текущая ошибка

Каждая целевая партия представляет собой 3-мерный массив с формой (batch_size, n_time_steps, n_classes), но Keras ожидает 2-мерный массив.

Пример /Контекст

Предположим, у нас есть ежедневные цены закрытия для N акций и для каждого дня и акций: m функций и одно из трех действий: «куплено», «проведено», «продано».Если на запас имеется 30 дней данных, мы можем обучить LSTM прогнозировать каждое действие (на каждый день для каждой акции) следующим образом.

Для каждой партии выборок размером n << N,<code>X_train будет иметь форму (n, 30, m), то есть n сэмплов, 30 временных шагов и m функций.После горячего кодирования «куплено», «проведено» и «продано» Y_train будет иметь форму (n, 30, 3), представляющую собой массив из 3-х измерений.

Проблема в том, что Kerasвыдает ошибку из-за ожидания, что Y_train будет двумерным.

Вот фрагмент кода:

n_time_steps = 30
n_ftrs = 700
n_neurons = 100
n_classes = 3
batch_size = 256
n_epochs = 500
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(n_time_steps, n_ftrs)))
model.add(Dense(n_classes, activation='sigmoid'))
model.compile(loss='categorical_crossentropy', optimizer='adam', 
    metrics=['accuracy'])

for e in range(n_epochs):
  X_train, Y_train = BatchGenerator()
  # Y_train.shape = (256, 30, 3)
  model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=1)

Ошибка

Error when checking target: expected dense_20 to have 2 dimensions, 
but got array with shape (256, 30, 3)

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Если вы посмотрите на вывод model.summary(), вы поймете, в чем проблема:

Layer (type)                 Output Shape              Param #   
=================================================================
lstm_1 (LSTM)                (None, 100)               320400    
_________________________________________________________________
dense_74 (Dense)             (None, 3)                 303       
=================================================================
Total params: 320,703
Trainable params: 320,703
Non-trainable params: 0
_________________________________________________________________

Как видите, форма вывода слоя LSTM равна (None, 100), что означает, что возвращается только результат последнего временного шага .И, как результат, выходная форма слоя Dense равна (None, 3), что означает, что он будет классифицировать все входные временные ряды (т. Е. Все 30-дневные данные акции) в один из 3 классов.Это не то, что вы хотите.Скорее вы хотите классифицировать каждый временной шаг входных временных рядов.Чтобы это произошло, как предложил @VegardKT, вы можете передать return_sequences=True слою LSTM, чтобы он выводился на каждом временном шаге.Давайте посмотрим на вывод model.summary() после этого изменения:

Layer (type)                 Output Shape              Param #   
=================================================================
lstm_2 (LSTM)                (None, 30, 100)           320400    
_________________________________________________________________
dense_75 (Dense)             (None, 30, 3)             303       
=================================================================
Total params: 320,703
Trainable params: 320,703
Non-trainable params: 0
_________________________________________________________________

Как вы можете видеть, теперь слой LSTM дает выходные данные каждого временного шага и, следовательно, слой Dense, который действует как классификаторсможет классифицировать каждый из этих временных шагов в один из 3 классов по желанию.

0 голосов
/ 18 октября 2018

Вам необходимо добавить изменение слоя LSTM следующим образом:

model.add(LSTM(n_neurons, input_shape=(n_time_steps, n_ftrs), return_sequences=True))

Этот аргумент выполняет следующие действия:

return_sequence: Boolean.Вернуть ли последний вывод в выходной последовательности или полную последовательность.

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

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