python - 在 keras 中使用带有 LSTM 的 CNN 时,池化层是强制性的吗?
问题描述
我正在使用 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 层)?
- 如果它是强制性的,那么您建议的其他类型的池化层是什么。
如果需要,我很乐意提供更多详细信息。
解决方案
首先,您不必使用 MaxPooling1D 层。这里的 MaxPooling 只会减少传递给 LSTM 的输入量(在这种情况下)。从纯技术的角度来看,LSTM 可以处理任何序列长度,并且 keras 会自动设置正确数量的输入特征
不过,这里发生了一些有趣的事情,您可能想看看:
很难说某些池化机制会比另一种更好。然而,直觉是最大池在从极端情况下推断时效果更好,而平均池在忽略极端情况时效果更好。
您隐含了步幅,应该注意的是,池化层和卷积层的默认步幅值是不同的(无与 1)。这意味着比较具有和不具有最大池化的网络并不完全是比较苹果和苹果,因为您大大减少了 LSTM 层将获得的数据量。
推荐阅读
- python - 带参数的 Python/Flask 嵌套装饰器
- python - TypeError: if 语句中 -: 'str' 和 'int' 的不支持的操作数类型
- python - Jupyter Notebook在markdown中位置嵌入图像
- windows - 批处理文件命令扫描并杀死多个进程(如果正在运行)
- python - 无法在 csv 文件中写入不同类型的项目
- sql - 按条款分组 - 需要帮助
- c# - 更改 DateTime 月份 -> " list[i].date.Month = Int32.Parse(Console.ReadLine()); "
- amazon-ecs - 为 ECS 服务创建负载均衡器,无需一个
- javascript - 如何从 Node JS 中的 url 下载文件?
- composer-php - 为什么 composer create-project 在请求 dev 依赖项时失败,但使用 --no-plugins 标志成功?