【问题标题】:Keras LSTM with embedding layer before LSTM layerKeras LSTM 在 LSTM 层之前具有嵌入层
【发布时间】:2017-11-10 06:50:53
【问题描述】:

我正在尝试keras IMDB数据的例子,数据形状是这样的:

x_train 形状:(25000, 80)

我只是将keras示例的原始代码更改为这样的代码:

model = Sequential()
layer1 = Embedding(max_features, 128)
layer2 = LSTM(128, dropout = 0.2, recurrent_dropout = 0.2, return_sequences = True)
layer3 = Dense(1, activation = 'sigmoid')
model.add(layer1)
model.add(layer2)
model.add(layer3)

原来的模型设置return_sequencesFalse,我改成True,遇到了这个错误:

预计 dense_1 有 3 个维度,但得到了形状为 (25000, 1) 的数组

但是我打印了模型的结构,发现 LSTM 层的输出正好是一个 3D 张量:

lstm_1 (LSTM):(无,无,128)

【问题讨论】:

  • 当您将 return_sequences 设置为 true 时,您现在拥有多对多关系。所以句子中的每个单词都有一个输出值,而最初设置为 false 时只有一个输出值,这就是为什么你需要在最后一层输出数据中使用第三维
  • 是的,而且模型的总结可以显示LSTM层的输出是(None, None, 128),但是到了拟合的时候就变成了(25000, 1),也就是很奇怪。
  • 您可以使用 keras 重塑图层。不久前我问了similar question,答案正是您想要的。
  • 其实我用了一个 Flatten 层来解决这个问题,除了一个 reshape 层,在 LSTM 层之后还有一个 TimeDistributedDense 层,但是这个层的输出仍然是 80D 向量所以你仍然需要一个展平层以连接它和最后一个 Dense 层
  • 你不会在最后一个密集之前使用扁平层,这可以通过更改 return_sequences 的布尔值来改变

标签: python keras lstm word-embedding


【解决方案1】:

你需要重塑你的训练数组,使用下面的代码:

x_train = np.reshape(x_train,(x_train.shape[0],1,x_train.shape[1]))

还有你的测试数组:

x_test = np.reshape(x_test,(x_test.shape[0],1,x_test.shape[1]))

仅供参考:np 是 numpy 包装。

LSTM 模型中的时间步长:https://machinelearningmastery.com/use-timesteps-lstm-networks-time-series-forecasting/

Timesteps:这相当于您运行循环神经网络的时间步长。如果你想让你的网络有 60 个字符的内存,这个数字应该是 60。

【讨论】:

  • 我可以理解训练或测试数据应该是这样的形状,但是嵌入层要求输入是二维张量。此外,我想知道为什么我们将 return_sequence 设置为 False 并且只返回最后一个输出并且模型可以编译并通过拟合。
  • 好的。所以这不仅仅是关于重塑,我使用的附加 1 参数称为时间步长。对于 LSTM,您需要传递此参数来告诉您的模型学习参数需要多少集。我正在更新我的答案,并将为您提供可以参考的来源。
  • 忽略时间序列,只关注为什么需要时间步长。
  • 如果您仍有任何困惑,请告诉我。
  • 我确切地知道为什么需要时间步长,但是由于在 LSTM 层之前有一个嵌入层,因此数据不能以 [samples, timestep, feature] 形式成形,而是二维张量。另外,当使用return_sequences = False时,模型没问题,所以我想模型可能默认使用timestep=1。
【解决方案2】:

我认为你需要一个带有 return_sequences=True 的 LSTM 之后的 TimeDistributed 层

layer2= LSTM(128, dropout=0.2, 
             recurrent_dropout=0.2,return_sequences=True)
layer3= TimeDistributed(Dense(1, activation='sigmoid')))

【讨论】:

  • 然后出现同样的错误:预期 time_distributed_1 有 3 个维度,但得到了形状为 (25000, 1) 的数组
猜你喜欢
  • 2017-09-23
  • 2018-01-11
  • 2019-01-14
  • 1970-01-01
  • 2018-02-27
  • 2017-07-31
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
相关资源
最近更新 更多