我的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 回答
word_vector_matrix
是 not 一个三维的ndarray . 它是二维阵列的一维ndarray . 这是由于句子长度可变 .Numpy允许
ndarray
是类似列表的结构,可能包含复杂元素(另一个ndarray
) . 但是在Keras中,必须将ndarray
转换为Tensor
(必须是某个维度的"mathematical"矩阵 - 为了有效计算,这是必需的) .因此,每个批次必须具有固定大小的句子(而不是整个数据) .
以下是一些替代方案:
使用批量大小为1 - 最简单的方法,但会阻碍网络的收敛 . 我建议只将它用作临时健全检查 .
如果序列长度为 variability is low ,则将所有批次填充为相同的长度 .
如果序列长度为 variability is high ,则使用该批次中的最大长度填充每个批次 . 这将要求您使用自定义数据生成器 .
注意:填充数据后,需要使用Masking,以便在训练期间忽略填充部分 .