在 keras 中使用带有 LSTM 的 CNN 时,池化层是强制性的吗?

Posted

技术标签:

【中文标题】在 keras 中使用带有 LSTM 的 CNN 时,池化层是强制性的吗?【英文标题】:Does pooling layer mandatory when using CNN with LSTM in keras? 【发布时间】:2020-10-25 15:07:54 【问题描述】:

我正在使用 CNN+LSTM 解决一些二元分类问题。我的代码如下。

def create_network():
    model = Sequential()
    model.add(Conv1D(200, kernel_size=2, activation = 'relu', input_shape=(35,6)))
    model.add(Conv1D(200, kernel_size=2, activation = 'relu'))
    model.add(MaxPooling1D(3))
    model.add(LSTM(200, return_sequences=True))
    model.add(LSTM(200, return_sequences=True))
    model.add(LSTM(200))
    model.add(Dense(100))
    model.add(Dropout(0.2))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

当我使用上述模型时,我得到了一些不好的结果。但是,当我删除层 model.add(MaxPooling1D(3)) 时,结果有所改善。

我的问题如下。

cnn 与 lstm 一起使用时是否必须要有池化层(因为我也使用了 dropout 层)? 如果是强制性的,您建议使用哪些其他类型的池化层。

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

【参考方案1】:

首先,您不必使用 MaxPooling1D 层。这里的 MaxPooling 只会减少传递给 LSTM 的输入量(在这种情况下)。 从纯技术的角度来看,LSTM 可以处理任何序列长度,并且 keras 会自动设置正确数量的输入特征

这里发生了一些有趣的事情,您可能想看看:

    很难说某些池化机制会比另一种更好。然而,直觉是最大池在从极端情况下推断时效果更好,而平均池在忽略极端情况时效果更好。

    您隐含了步幅,需要注意的是,池化层和卷积层的默认步幅值不同(None vs 1)。这意味着比较具有和不具有最大池的网络并不完全是比较苹果和苹果,因为您大大减少了 LSTM 层将获得的数据量。

【讨论】:

感谢您的有趣回答。我还有一个问题;你有什么建议我可以尝试用 strides 代替 None vs 1 吗?谢谢你:) 我实际上会先尝试不使用卷积或池化。像这样的大型 LSTM 已经可以预测很多事情,你的卷积应该会在这方面有所改进。对于池化,您可以考虑在池化层中步长为 1(例如,平均池化是平滑的)。 Step=None 也可以,但实际上您向 LSTM 提供的数据更少。由于您的输入序列相对较短,您还可以将 LSTM 替换为 Flatten 层,然后是一些 Dense 层,我认为这里有很多选项需要考虑

以上是关于在 keras 中使用带有 LSTM 的 CNN 时,池化层是强制性的吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 LSTM 和 CNN 对 Keras 进行故障排除以进行时间序列分类

使用 Keras 训练 CNN-LSTM 时卡在第一个 epoch

python 时间分布在Keras的CNN + LSTM

MLP初始化Keras中的LSTM细胞状态

keras---cnn---rnn---lstm

为啥我的 Keras TimeDistributed CNN + LSTM 模型期望形状不完整