我们如何训练深度学习模型以输入任意长度?

时间:2019-05-24 07:15:17

标签: python keras deep-learning

我使用keras创建了一个深度学习模型。我正在针对不同长度的评论训练模型。我对输入数据进行了预处理,并将其填充为相等的长度。在预测时,如果我给出的输入的长度大于训练输入的长度,则模型将失败。我该怎么办?请也分享一些示例,这将非常有帮助。

latent_dim = 1024
inpt = Input(shape=(max_len,))  ### max_len is the final length
emb_layer = Embedding(vocabulary_size, 100, weights=[embedding_matrix], trainable = False)(inpt)
bdlstm1 = Bidirectional(LSTM(64, return_sequences = True))(emb_layer)
dns2 = Dense(no_labels, activation='softmax')(bdlstm1)
model = Model(inpt, dns2)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x,y)

3 个答案:

答案 0 :(得分:0)

我认为您会在这里找到满意的答案:

https://ai.stackexchange.com/questions/2008/how-can-neural-networks-deal-with-varying-input-sizes

最好(也是唯一简单)的方法是使用RNN。

祝你好运!

答案 1 :(得分:0)

从理论上讲,限制是由深网末端的一个或多个完全连接的层提供的,它的所有单元都需要喂食。

由于此限制,我们必须正常地确定长度一个先验(NLP中的最大单词数)。正如我在您的代码中看到的那样,您使用的是100大小的嵌入层,因此对于每个未达到最小大小的句子,您都必须为每个丢失的单词添加100个零。

对于较长的句子(如您所评论的情况),您可以执行以下操作,但是您应该知道自己会丢失信息,因为超过的单词不会被预测。

if max_len < len(sentence.split()):
    # add zero padding until reach max_len
else:
    inputSentence = " ".join(sentence.split()[:max_len]) # no. words = max_len 

答案 2 :(得分:0)

您使用的LSTM是一种RNN,它需要最大时间步长,因此您必须限制文本的上限。

如果新输入的长度超过max_len

  • 将其剪切到max_len
  • 或使用滑动窗口并对每个窗口进行预测并使用它们的平均值