Neural network 用Keras构造LSTM模型

Neural network 用Keras构造LSTM模型,neural-network,keras,lstm,recurrent-neural-network,Neural Network,Keras,Lstm,Recurrent Neural Network,我正在试验Keras,我正在尝试创建一个常规神经网络和一个LSTM神经网络,每个都有一个输入层(2000个输入)、一个隐藏层(256个节点)和一个输出层(1个节点)。尝试按照指南进行操作,我就是这样做的: 常规神经网络: model = Sequential() model.add(Dense(2000, input_shape = (2000,), activation = 'sigmoid')) model.add(Dense(256, activation = 'sigmoid'))

我正在试验Keras,我正在尝试创建一个常规神经网络和一个LSTM神经网络,每个都有一个输入层(2000个输入)、一个隐藏层(256个节点)和一个输出层(1个节点)。尝试按照指南进行操作,我就是这样做的:

常规神经网络:

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:输入0与层lstm_1不兼容:预期ndim=3,发现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之前使用嵌入层。我使用了@Daniel Moller的建议,并使用了重塑层。下面是我的工作模型的样子:

from keras.layers import LSTM, Dense
from keras.models import Sequential
model_ls = Sequential()
model_ls.add(Reshape((3,2500), input_shape = (50,50,3) ))
#LSTM requires three dimensions (batch, time_series info, samples)
model_ls.add(LSTM(128, return_sequences=True)) 
model_ls.add(LSTM(64))
model_ls.add(Dense(40, activation="relu", name="feat_x"))
model_ls.add(Dense(1, activation="tanh"))
model_ls.compile(optimizer="adadelta",loss= "binary_crossentropy", metrics=["acc"])
model_ls.summary()
下面是输出的样子:

Train on 201433 samples, validate on 67145 samples
Epoch 1/15
 - 23s - loss: 0.0252 - acc: 0.9981 - val_loss: 0.0260 - val_acc: 0.9980
Epoch 2/15
 - 23s - loss: 0.0252 - acc: 0.9981 - val_loss: 0.0260 - val_acc: 0.9980
........
Epoch 15/15
 - 23s - loss: 0.0250 - acc: 0.9981 - val_loss: 0.0257 - val_acc: 0.9980

错误消息表示LSTM用户使用三维输入。形状像(x,y,z)的东西。而您从上一层获取的输出仅为二维(x,y)。您可能可以在这里找到更多详细信息:谢谢@Daniel,但是您知道为什么它使用嵌入作为第一层,即使使用这种结构的精度通常看起来更差?您的数据是连续的/时间序列吗?因为嵌入输出了正确的维度。只需添加一个
重塑
层或时间分布就可以了。@convolutionBoy是的(我想?),数据最初是句子。它们被转换成数字特征表示,目标是将它们分类为A或B类情绪分析。