在 keras 中使用 CNN 和 LSTM 时是否必须使用池化层?

问题描述 投票:0回答:1

我正在使用 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 层)?
  • 如果是强制性的,您建议使用哪些其他类型的池化层?

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

python keras classification lstm conv-neural-network
1个回答
1
投票

首先,您不必使用 MaxPooling1D 层。这里的 MaxPooling 只会减少传递到 LSTM 的输入量(在本例中)。 从纯粹的技术角度来看,LSTM 可以处理任何序列长度,而 keras 会自动设置适量的输入特征

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

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

  2. 您隐式地保留了步幅,应该注意的是,池化层和卷积层的默认步幅值是不同的(无与 1)。这意味着比较有和没有最大池化的网络并不完全是同类比较,因为你大大减少了 LSTM 层获得的数据量。

© www.soinside.com 2019 - 2024. All rights reserved.