为什么Keras to_categorical方法在输入二维张量时不返回三维张量?

时间:2017-12-13 15:36:30

标签: tensorflow nlp keras lstm pos-tagger

我试图用Keras建立一个LSTM神经网络来预测一组句子中单词的标签。

实施非常简单,但令人惊讶的是

  • 给出完全相同且正确实现的代码和
  • 使用Tensorflow 1.4.0,在Tensorflow后端运行Keras,
在某些人的计算机上,它返回了尺寸错误的张量,而对于其他人则完美无缺。

问题出现在以下情况中:

首先,我们使用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))

我只是想知道你们中是否有人遇到过类似的问题,并且已经找出了发生这种情况的原因。

0 个答案:

没有答案