在LSTM层之前使用嵌入层的Keras LSTM

3

我正在尝试使用Keras IMDB数据的示例,数据形状如下:

x_train shape: (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_sequences 设置为 False ,我将其更改为 True ,然后遇到了这个错误:

预期dense_1有3个维度,但获取到的数组形状为(25000, 1)

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

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


当将return_sequences设置为true时,你现在拥有了一对多的关系。因此,句子中的每个单词都有一个输出值,而不仅仅是一个输出值,这是在将其设置为false时的情况,这就是为什么你需要在最后一层输出数据中增加第三个维度的原因。 - DJK
是的,模型的摘要显示LSTM层的输出为(None,None,128),但在拟合时,它变成了(25000,1),这相当奇怪。 - BridgeMia
你可以使用Keras的reshape层。我之前问过一个类似的问题(https://dev59.com/e5_ha4cB1Zd3GeqPwU3s),答案正是你所需要的。 - DJK
实际上,我使用了一个Flatten层来解决问题,除此之外还有一个reshape层,在LSTM层后面加了一个TimeDistributedDense层,但是这个层的输出仍然是80维向量,所以你仍然需要一个Flatten层来连接它和最后的Dense层。 - BridgeMia
在最后一个密集层之前不会使用flatten层,这可以通过改变return_sequences的布尔值来改变。 - DJK
2个回答

0
你需要重新调整你的训练数组,使用以下代码:
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/

时间步长:这相当于您运行循环神经网络的时间步数。如果您希望您的网络记忆 60 个字符,那么这个数字应该是 60。


我能理解训练或测试数据应该是这样的形状,但嵌入层需要输入为2D张量。此外,我想知道如果我们将return_sequence设置为False并且仅返回最后一个输出,模型是否可以编译并通过拟合。 - BridgeMia
好的。所以这不仅仅是关于重塑,我使用的额外一个参数被称为时间步。对于LSTM,您需要传递此参数以告诉模型需要多少集来学习参数。我正在更新我的答案,并将提供一个您可以参考的来源。 - Bhushan Pant
忽略时间序列,专注于为什么需要时间步长。 - Bhushan Pant
请告诉我您是否还有任何疑惑。 - Bhushan Pant
我知道为什么需要时间步,但由于在LSTM层之前有一个嵌入层,数据无法以[samples,timestep,feature]的形式进行整形,而是一个二维张量。 此外,当return_sequences = False时,模型是可以正常工作的,因此我认为模型可能将timestep = 1作为默认值。 - BridgeMia

0

我认为您需要在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)。 - BridgeMia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接