在Keras中使用嵌入层和LSTM作为输入的3维数组

时间:2019-03-04 03:51:50

标签: tensorflow keras lstm word-embedding

伙计们,我已经建立了一个可以工作的LSTM模型,现在我正在尝试(未成功)将Embedding层添加为第一层。

solution对我不起作用。 在询问之前,我还阅读了以下问题: Keras input explanation: input_shape, units, batch_size, dim, etcUnderstanding Keras LSTMskeras examples

我的输入是一种包含27个字母的语言的字符的单点编码(一和零)。我选择将每个单词表示为10个字符的序列。每个单词的输入大小是(10,27),我有465个,所以它是X_train.shape (465,10,27),我也有大小为y_train.shape (465,1)的标签。我的目标是训练模型,并同时建立角色嵌入。

现在这是可以编译和拟合的模型。

main_input = Input(shape=(10, 27))
rnn = Bidirectional(LSTM(5))
x = rnn(main_input)
de = Dense(1, activation='sigmoid')(x)
model = Model(inputs = main_input, outputs = de)
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(X_train, y_train, epochs=10, batch_size=1, verbose=1)

添加嵌入层后:

main_input = Input(shape=(10, 27))
emb = Embedding(input_dim=2, output_dim = 10)(main_input)
rnn = Bidirectional(LSTM(5))
x = rnn(emb)
de = Dense(1, activation='sigmoid')(x)
model = Model(inputs = main_input, outputs = de)
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(X_train, y_train, epochs=10, batch_size=1, verbose=1)
  

输出:ValueError:输入0与双向双向31不兼容:预期ndim = 3,发现ndim = 4

如何固定输出形状? 您的想法将不胜感激。

1 个答案:

答案 0 :(得分:1)

  

我的输入是一种包含27个字母的语言的字符的单点编码(一和零)。

您不应将单一编码方式传递到Embedding中。 Embedding层将整数索引映射到n维向量。因此,您应该直接传递预先热销的索引。

即之前,您有一个像[[0, 1, 0], [1, 0, 0], [0, 0, 1]]这样的单输入,它是由一组像[1, 0, 2]这样的整数创建的。而不是传递(10, 27)的向量,而是传递(10,)的原始向量。

main_input = Input(shape=(10,)) # only pass in the indexes
emb = Embedding(input_dim=27, output_dim = 10)(main_input) # vocab size is 27
rnn = Bidirectional(LSTM(5))
x = rnn(emb)
de = Dense(1, activation='sigmoid')(x)
model = Model(inputs = main_input, outputs = de)
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(X_train, y_train, epochs=10, batch_size=1, verbose=1)