【发布时间】:2017-04-28 23:53:37
【问题描述】:
我正在尝试使用 Keras,我正在尝试创建一个常规神经网络和一个 LSTM 神经网络,每个神经网络都有一个输入层(2000 个输入)、一个隐藏层(256 个节点)和一个输出层(1节点)。尝试遵循 Keras documentation 中的指南,这就是我的做法:
正则神经网络:
model = Sequential()
model.add(Dense(2000, input_shape = (2000,), activation = 'sigmoid'))
model.add(Dense(256, activation = 'sigmoid'))
model.add(Dense(1, activation = 'sigmoid'))
长短期记忆:
model = Sequential()
model.add(Embedding(2000, 256))
model.add(LSTM(256, activation = 'tanh', dropout = 0.2, recurrent_dropout = 0.2))
model.add(Dense(1, activation = 'sigmoid'))
如您所见,对于 LSTM 网络,我使用了嵌入层作为输入层。这可以避免吗?我不太明白为什么要使用阅读 Keras 文档中的嵌入层,但这是我可以让 LSTM 网络正常工作的唯一方法..
但是,即使在评估中使用完全相同的数据,这两个网络模型的最终测试准确度也存在很大差异。例如,LSTM 的准确率约为 60%,而常规网络的准确率约为 90%。
这是因为使用了不同类型的层吗?即使我接下来有一个 LSTM 层,我也可以使用密集层作为输入层吗?
目前,当我尝试在 LSTM 层之前使用密集层时,出现错误:
ValueError: Input 0 is in compatible with layer lstm_1: expected ndim=3, found ndim=2
这是我尝试过的:
model = Sequential()
model.add(Dense(2000, input_shape = (2000,), activation = 'sigmoid'))
model.add(LSTM(256, activation = 'tanh', dropout = 0.2, recurrent_dropout = 0.2))
model.add(Dense(1, activation = 'sigmoid'))
我真正想要实现的是一个模型,它是一个非常简单的常规神经网络(非循环),一个模型是一个纯 LSTM 神经网络。一层输入层,一层隐藏层,一层输出层。两个模型应该有相同数量的节点。
【问题讨论】:
-
错误信息表明 LSTM 使用 3 维输入。形状像 (x,y,z) 的东西。虽然您从前一层获取的输出只是二维 (x,y)。您可能可以在这里找到更多详细信息:stackoverflow.com/questions/39674713/…
-
谢谢@Daniel,但你知道为什么它使用嵌入作为第一层,尽管使用这种结构的准确性通常看起来更差吗?
-
您的数据是顺序/时间序列吗?
-
因为嵌入输出了正确的维度。您可能只需添加一个
Reshape层或时间分布就可以了。 -
@convolutionBoy 是的(我认为?),数据最初是句子。它们被转换为数字特征表示,目标是将它们分类为 A 或 B。就像情感分析一样。
标签: neural-network keras lstm recurrent-neural-network