Keras的多通道CNN-LSTM

时间:2019-06-06 13:53:12

标签: python keras neural-network conv-neural-network lstm

我有一个具有N个要素(维度)的多维时间序列数据集。我正在构建一个具有N个输入通道(每个功能一个)的CNN-LSTM模型。首先,模型应在每个要素上执行一维卷积,然后合并输出并将其馈送到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 :(得分:0)

您在使用Keras吗?在这种情况下,您没有创建任何Sequential()模型。这可能是导致错误的原因。请让我知道。

-

编辑

我认为该模型不需要Flatten()。 Flatten旨在将conv2D()层的输出馈送到Dense()层,即将2维对象平整为1维向量。但是,如果您已经使用conv1D进行一维工作,则不需要Flatten()