Как настроить данные для MLP в LSTM (ожидаемый ndim = 3, найденный ndim = 2 ошибка) - PullRequest
1 голос
/ 04 февраля 2020

У меня есть данные, что работа над многоуровневой архитектурой Perceptron выглядит следующим образом

X_train_feature.shape
(52594, 16)

X_train_feature[0]
array([1.18867208e-03, 1.00000000e+00, 8.90000000e+01, 8.00000000e+00,
       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00])

y_train
(52594, 2)

y_train[0].toarray()
array([[0., 1.]])

По первому измерению: число выборок, а второе: для X_train - количество объектов, а в y_train это кодировщик, поддерживающий горячую обработку.

И я хочу использовать те же данные в LSTM / Bi-LSTM, поэтому я копирую код из inte rnet и изменяю входное значение на то же, что и MLP

def define_model():
    model = Sequential()
    model.add(LSTM(20, input_shape=X_train_feature[0].shape, return_sequences=True))
    model.add(TimeDistributed(Dense(1, activation='sigmoid')))
    model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])  # compile
    print('Total params: ', model.count_params())
    return model

Но когда я пытаюсь создать модель, добавляется ошибка о форме ввода

model = define_model()
ValueError: Input 0 is incompatible with layer lstm_30: expected ndim=3, found ndim=2

Что мне нужно настроить, чтобы данные применялись в LSTM, или мне нужно изменить архитектуру конфиг? Большое вам спасибо.

1 Ответ

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

LSTM (в отличие от персептрона) не является сетью переадресации. Нужна история, чтобы предсказать следующий момент. Таким образом, надлежащий входной тензор для LSTM должен иметь форму (timesteps, num_features), означающую, что каждый образец представляет собой последовательность timesteps наблюдений, так что состояние ячейки инициируется в первом наблюдении последовательности и проходит через всю последовательность.

Следовательно, входной тензор должен иметь форму (num_sequences, seq_length, num_features), где:

  • num_sequences: количество выборок, т. Е. Сколько последовательностей требуется для обучения модели ?

  • seq_length: как долго эти последовательности. для последовательностей переменной длины вы можете указать None.

  • num_features: Сколько объектов имеет одно наблюдение в данной последовательности?

...