如何提高LSTM模型的预测和准确性?

问题描述 投票:-1回答:1

我正在建立一个LSTM模型多类分类,它将文本分类为4类中的一种。但是它并不能提供很好的准确性。即使它提供了很好的准确性,预测也会出错。

def create_model(vocabulary_size, seq_len):

    model =  models.Sequential()
    model.add(Embedding(vocabulary_size, 100, input_length=seq_len))
    model.add(GRU(units=64, activation='relu',return_sequences=True)) 
    model.add(LSTM(400,return_sequences=True))

    model.add(Dense(200, activation='relu'))

    model.add(Dense(4, activation='softmax'))

    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

    model.summary()

    return model

数据集包含:

X                       Y
i need credit card      Inquiry
account balance         Inquiry
awesome                 Compliment
Worst services          Complaint
python tensorflow machine-learning keras lstm
1个回答
1
投票

问题出在您的输入上。您已经用零填充了输入序列,但是没有将此信息提供给模型。因此,您的模型不会忽略零,这就是根本不学习的原因。要解决此问题,请如下更改嵌入层:

model.add(layers.Embedding(input_dim=vocab_size+1,
      output_dim=embedding_dim,
      mask_zero=True))

这将使您的模型忽略零填充并学习。以此进行训练,尽管验证准确性还不够好(大约54%),但我的训练数据仅包含32个示例,因此我在6个纪元内就获得了100%的训练准确性。有关嵌入层的更多信息:https://keras.io/api/layers/core_layers/embedding/


由于您的数据集很小,该模型往往很容易过度拟合训练数据,从而降低了验证准确性。为了在某​​种程度上减轻这种情况,您可以尝试使用诸如word2vec或GloVe之类的经过预训练的词嵌入,而不是训练您自己的嵌入层。另外,尝试一些文本数据扩充方法,例如使用模板创建人工数据或将训练数据中的单词替换为其同义词。您还可以尝试不同类型的层(例如,用另一个LSTM替换GRU),但我认为这可能无济于事,应该在尝试预训练的嵌入和数据增强之后再考虑考虑。

© www.soinside.com 2019 - 2024. All rights reserved.