【发布时间】: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_sequences为False,我改成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