Keras:用于POS标记任务的嵌入和LSTM层

时间:2017-05-01 21:47:23

标签: nlp keras lstm embedding pos-tagger

我有一个标记句子列表。我用以下方式改变了每一个:

  • 对于每个单词,获取相对单热编码表单(维度input_dim的向量);
  • 按照以下示例中的说明插入预填充;
  • 使用大小为len(sentence)的窗口分割time_steps个子句中的每个句子(以获取预测下一个单词的上下文)。

例如,使用time_steps=2,单个句子["this", "is", "an", "example"]将转换为:

[
    [one_hot_enc("empty_word"), one_hot_enc("empty_word")],
    [one_hot_enc("empty_word"), one_hot_enc("this")],
    [one_hot_enc("this"), one_hot_enc("is")],
    [one_hot_enc("is"), one_hot_enc("an")],
]

最后,将子句子视为唯一列表,列车数据X_train的形状为(num_samples, time_steps, input_dim),其中:

  • input_dim:我的词汇量的大小;
  • time_steps:用于LSTM的序列长度;
  • num_samples:样本数量(子句);

现在,我想使用Embedding图层,以便将每个单词映射到较小的连续维度空间,以及LSTM,其中我使用上面构建的上下文。< / p>

我试过这样的事情:

model = Sequential()
model.add(InputLayer(input_shape=(time_steps, input_dim)))
model.add(Embedding(input_dim, embedding_size, input_length=time_steps))
model.add(LSTM(32))
model.add(Dense(output_dim))
model.add(Activation('softmax'))

但是给了我以下错误:

ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=4

我错过了什么?我正在尝试做什么有一些逻辑错误?

1 个答案:

答案 0 :(得分:1)

您只需删除输入图层,然后让嵌入图层成为网络的第一层。 或者你可以通过删除&#34; input_dim&#34;来构造输入层。像

model.add(InputLayer(input_shape=(time_steps, )))