从keras中的双向LSTM输出获取每个要素的-1、0和1序列

时间:2019-04-14 21:20:47

标签: python keras sequence lstm bidirectional

我正在尝试建立一个双向LSTM模型,该模型在其顶部具有单词嵌入层。序列输入将是一个数组,其中每个单词的嵌入维数为128。目标(标签)将是-1、0和1的数组。将填充特征和标签,并且将最长句子(单词数组)的长度用作输入长度。预测输出应为-1、0、1的序列。在进一步阅读之前,请知道我对Keras还是很陌生。

这是我的代码,下面解释了变量:

       self.model = Sequential()

        embedding_layer = Embedding(self.vocab_size, self.embedding_dimension, weights=[self.weight_matrix],
                                    input_length=self.max_sentence_length, trainable=False)
        self.model.add(embedding_layer)

        bidirectional = Bidirectional(LSTM(self.units, return_sequences=self.return_sequences),
                                      input_shape=self.input_shape)

        self.model.add(bidirectional)

        self.model.add(TimeDistributed(Dense(3)))

        self.model.compile(loss=self.loss_function, optimizer=self.optimizer, metrics="acc")

以下是变量:

vocab_size = 100003
embedding_dimension = 128
weight_matrix = (100003, 128)
max_sentence_length = 267
units = 20
return_sequences = True
input_shape = (500, 267) # where 500 = number of sequences
loss_function = "binary_crossentropy"
optimizer = "adam"

我尝试使用以下代码行进行训练:

self.model.fit([self.padded_features], [self.padded_labels], epochs=layer_epochs, batch_size=batch_size, verbose=verbose, validation_split=validation_frac, callbacks=self.custom_metrics)`

padded_features和padded_labels的大小均为(500,267),表示500个序列,每个序列共有267个独立的整数值,每个值代表一个单词(和填充)。可以将用于嵌入层的权重矩阵看成是字典,将代表单词的整数值转换为其128维嵌入层。

但是,当我运行代码时,出现以下错误:

ValueError: Error when checking target: expected time_distributed_1 to have 3 dimensions, but got array with shape (500, 267)

我认为LSTM输出是3D。我已经尝试解决这个问题了好几个小时,但还没有找到解决它的方法。我试图调试并查看形状从一层到另一层的形状,并试图在它们之间放置“重塑”形状,但是我也没有成功。

我需要LSTM的最终输出为该序列中每个单词的3个值,以便每个输入序列得到一个输出序列,并用0、1和-1填充(-1是给定的标签输入序列中的每个单词。

任何帮助将不胜感激。

0 个答案:

没有答案