为什么 CNN 不能比简单的 MLP 网络提供更高的准确度?[来自 Keras 的例子]

数据挖掘 机器学习 深度学习 nlp 喀拉斯
2021-09-21 04:17:22

我还是机器学习的新手,刚刚遇到了强大的深度学习库 Keras。

我已经阅读了 Keras 文档并在 Github 上尝试了一些 Keras 示例我还从多个来源研究了一些深度学习的基本知识和概念,但对看起来非常强大的网络的 CNN 和 RNN 仍然没有真正的理解。

因此,为了证明我的假设,我从 Keras Github 下载了 reuters_mlp.py 示例,该示例最初使用简单的 MLP 网络作为模型。我将imdb_cnn.py示例中得到的CNN思想结合到reuters_mlp.py示例中,然后观察结果。

令人惊讶的是,结果并没有像我预期的那样出来。CNN 的表现比简单的 MLP 网络最差。有人可以解释为什么 CNN 的准确性低于简单的 MLP 网络吗?

这是输出(Tensorflow 作为后端)

8982 个训练序列,2246 个测试序列,46 个类,num_words=1000

MLP(sequences_to_matrix,mode=bianry):

纪元 1/5 8982/8982 [===============================] - 3s - loss: 1.3236 - acc: 0.6984
Epoch 2/5 8982/8982 [===============================] - 2s - loss: 0.7182 - acc: 0.8250
Epoch 3 /5 8982/8982 [===============================] - 2s - loss: 0.4544 - acc: 0.8864
Epoch 4/ 5 8982/8982 [===============================] - 2s - 损失:0.3197 - acc:0.9192
Epoch 5/5 8982/8982 [===============================] - 2s - 损失:0.2511 - acc:0.9356
1920/2246 [= =======================>.....] - ETA: 0s

测试损耗:1.05213204963 测试精度:0.785396260071

CNN(pad_sequences):

纪元 1/5 8982/8982 [===============================] - 81s - 损失:1.9794 - acc: 0.5181
纪元2/5 8982/8982 [==============================] - 78s - 损失:1.4289 - acc:0.6591
Epoch 3 /5 8982/8982 [===============================] - 79s - loss: 1.1546 - acc: 0.7175
Epoch 4/ 5 8982/8982 [===============================] - 78s - 损失:0.9639 - acc:0.7663
Epoch 5/5 8982/8982 [===============================] - 77s - 损失:0.8378 - acc:0.7935
2240/2246 [= ============================>.] - ETA: 0s

测试损耗:0.960687935512,测试精度:0.764470169243

1个回答

CNN(和 RNN)模型并不是对 MLP 设计的一般改进。它们是与某些类型的问题相匹配的特定选择。当数据中存在某些局部模式(可能在其他位置重复)时,CNN 设计效果最佳,并且当输入是图像、音频或其他类似信号时通常是这种情况。

路透社的例子看起来像一个“词袋”输入。CNN 可以利用的数据中没有局部模式或重复关系。

你在这个数据集上使用 CNN 得到的结果对我来说是合理的。您没有犯错,但了解了 CNN 如何真正处理这些数据。