Многоканальный CNN-LSTM в Керасе - PullRequest
0 голосов
/ 06 июня 2019

У меня есть многомерный набор данных временных рядов с N элементами (размерами).Я строю модель CNN-LSTM, которая имеет N входных каналов (по одному на каждую функцию).Сначала модель должна выполнить одномерные свертки для каждого объекта, затем объединить выходные данные и передать их в слой LSTM.Однако у меня возникают проблемы с измерениями (я подозреваю, что это основная проблема), а именно объединенные выходные измерения не соответствуют ожидаемым.

Я пробовал Flatten () для каждой функции, но она возвращает (?,?) и Reshape (), похоже, тоже не справляются.

# Init the multichannel CNN-LSTM proto.
def mccnn_lstm(steps=window, feats=features, dim=1, f=filters, k=kernel, p=pool):
    channels, convs = [], []

    # Multichannel CNN layer
    for i in range(feats):
        chan = Input(shape=(steps, dim))
        conv = Conv1D(filters=f, kernel_size=k, activation="tanh")(chan)
        maxpool = MaxPooling1D(pool_size=p, strides=1)(conv) # Has shape (?, 8, 64)
        flat = Flatten()(maxpool) # Returns (?, ?), not (?, 8*64) as expected
        channels.append(chan)
        convs.append(flat)

    merged = concatenate(convs)  # Returns (?, ?), would expect a tensor like (?, 8*64, num of channels)

    # LSTM layer
    lstm = TimeDistributed(merged)
    lstm = LSTM(64)(merged) # This line raises the error
    dense = Dense(1, activation="sigmoid")(lstm)

    return Model(inputs=channels, outputs=dense)


model = mccnn_lstm()

Сообщение об ошибке:

ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2

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

1 Ответ

0 голосов
/ 06 июня 2019

Вы используете Keras? В этом случае вы не создали модель Sequential(). Это может быть причиной ошибки. Пожалуйста, дайте мне знать.

-

EDIT

Я думаю Flatten() не нужен в этой модели. Flatten предназначался для подачи вывода слоя conv2D() в слой Dense(), то есть для выравнивания двумерного объекта в одномерный вектор. Но если вы уже работаете в 1D (с conv1D), то Flatten() не требуется.

...