Keras LSTM输入-ValueError:检查输入时出错:预期input_1具有3维,但数组的形状为(1745,1)

时间:2018-11-12 15:18:47

标签: python tensorflow keras

我的Keras RNN代码如下:

def RNN(): 
   inputs = Input(shape = (None, word_vector_size))
   layer = LSTM(64)(inputs)
   layer = Dense(256,name='FC1')(layer)
   layer = Dropout(0.5)(layer)
   layer = Dense(num_classes,name='out_layer')(layer)
   layer = Activation('softmax')(layer)
   model = Model(inputs=inputs,outputs=layer)
   return model

调用model.fit()时出现错误

model.fit(np.array(word_vector_matrix), np.array(Y_binary), batch_size=128, epochs=10, validation_split=0.2, callbacks=[EarlyStopping(monitor='val_loss',min_delta=0.0001)])

Word_vector_matrix是一个3维的numpy数组。 我已经打印了以下内容:

print(type(word_vector_matrix), type(word_vector_matrix[0]), type(word_vector_matrix[0][0]), type(word_vector_matrix[0][0][0]))

答案是:

<class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.float32'>

它的形状是1745 x句子长度x单词向量大小。 句子的长度是可变的,我试图将整个单词向量矩阵传递给RNN,但上面出现了错误。

形状打印如下:

print(word_vector_matrix.shape)

答案是(1745,)

嵌套数组的形状打印如下:

print(word_vector_matrix[10].shape)

答案是(7, 300) 第一个数字7表示句子长度,该长度是可变的,并且每个句子都会变化,第二个数字是300,对于所有单词都是固定的,并且是单词向量的大小。

我已将所有内容都转换为np.array(),如其他帖子所建议的那样,但仍然是相同的错误。有人可以帮帮我吗。我正在使用python3 btw。对我来说,类似的事情在python2中工作,但在python3中却不行。谢谢!

1 个答案:

答案 0 :(得分:0)

word_vector_matrix 不是 3D ndarray。它是2维数组的1维ndarray。这是由于句子长度可变。

Numpy允许ndarray是可能包含复杂元素(另一个ndarray)的类似列表的结构。但是,在Keras中,必须将ndarray转换为Tensor(必须是某个维度的“数学”矩阵-为了有效的计算,这是必需的)。

因此,每个批次必须具有固定大小的句子(而不是整个数据)。

以下是一些替代方案:

  1. 使用1的批量大小-最简单的方法,但会阻碍网络的融合。我建议仅将其用作临时完整性检查。
  2. 如果序列长度变异性较低,请填充所有批次的相同长度。
  3. 如果序列长度变异性高,请以该批次内的最大长度填充每个批次。这将要求您使用自定义数据生成器。

注意:填充数据后,需要使用Masking,以便在训练期间将忽略填充的部分。