我的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中却不行。谢谢!
答案 0 :(得分:0)
word_vector_matrix
不是 3D ndarray。它是2维数组的1维ndarray。这是由于句子长度可变。
Numpy允许ndarray
是可能包含复杂元素(另一个ndarray
)的类似列表的结构。但是,在Keras中,必须将ndarray
转换为Tensor
(必须是某个维度的“数学”矩阵-为了有效的计算,这是必需的)。
因此,每个批次必须具有固定大小的句子(而不是整个数据)。
以下是一些替代方案:
注意:填充数据后,需要使用Masking,以便在训练期间将忽略填充的部分。