我试图用Keras建立一个LSTM神经网络来预测一组句子中单词的标签。
实施非常简单,但令人惊讶的是
问题出现在以下情况中:
首先,我们使用Keras(https://keras.io/preprocessing/sequence/)中的pad_sequences
方法将训练句子列表(句子作为单词列表列表)转换为二维矩阵:
def do_padding(sequences, length, padding_value):
return pad_sequences(sequences, maxlen=length, padding='post',
truncating='post', value=padding_value)
train_sents_padded = do_padding(train_sents, MAX_LENGTH,
word_to_id[PAD_TOKEN])
接下来,我们在相应的训练标签上使用我们的do_padding方法将它们变成填充矩阵。同时,我们使用Keras to_categorical
方法(https://keras.io/utils/#to_categorical)将一个热编码向量添加到创建的标签矩阵(矩阵中每个单元格的一个热矢量,这意味着每个训练句中的单词):
train_labels_padded = to_categorical(do_padding(train_labels, MAX_LENGTH,
label_to_id["O"]), NUM_LABELS)
我们期望得到的形状为3-D:(len(train_labels),MAX_LENGTH,NUM_LABELS)。然而,我们发现得到的形状是2-D,基本上看起来像这样:((len(train_labels)x MAX_LENGTH),NUM_LABELS),意思是两个预期尺寸上的数字 len (train_labels)和 MAX_LENGTH 相乘并展平为一维。
有趣的是,前面提到的这个问题仅发生在大约50%的人身上,使用Tensorflow 1.4.0和Keras在Tensorflow Backend上运行。
我们设法通过手动重塑标签矩阵来解决问题:
train_labels_padded = np.reshape(train_labels_padded, (len(train_labels),
MAX_LENGTH, NUM_LABELS))
我只是想知道你们中是否有人遇到过类似的问题,并且已经找出了发生这种情况的原因。