【问题标题】:Using Keras to structure LSTM model使用 Keras 构建 LSTM 模型
【发布时间】: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


【解决方案1】:

我碰巧遇到了同样的情况,我已经有了张量,不想在 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

【讨论】:

    猜你喜欢
    • 2021-09-25
    • 2018-05-08
    • 2020-05-25
    • 1970-01-01
    • 2018-01-30
    • 2017-12-10
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多