首页 文章

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

提问于
浏览
0

我的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顺便说一句 . 类似的事情是在python2中为我工作,但不在python3中 . 谢谢!

1 回答

  • 0

    word_vector_matrixnot 一个三维的ndarray . 它是二维阵列的一维ndarray . 这是由于句子长度可变 .

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

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

    以下是一些替代方案:

    • 使用批量大小为1 - 最简单的方法,但会阻碍网络的收敛 . 我建议只将它用作临时健全检查 .

    • 如果序列长度为 variability is low ,则将所有批次填充为相同的长度 .

    • 如果序列长度为 variability is high ,则使用该批次中的最大长度填充每个批次 . 这将要求您使用自定义数据生成器 .

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

相关问题