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

时间:2020-06-07 05:54:51

标签: python tensorflow machine-learning keras lstm

使用gensim创建预嵌入层后,我的val_accuracy已下降到4600条记录的45%:-

model =  models.Sequential()
   
    model.add(Embedding(input_dim=MAX_NB_WORDS, output_dim=EMBEDDING_DIM, 
                         weights=[embedding_model],trainable=False,
                        input_length=seq_len,mask_zero=True))
    #model.add(SpatialDropout1D(0.2))
       
    
    #model.add(Embedding(vocabulary_size, 64))
    model.add(GRU(units=150, return_sequences=True))
    model.add(Dropout(0.4))
    model.add(LSTM(units=200,dropout=0.4))  
    #model.add(Dropout(0.8))
    #model.add(LSTM(100)) 
    #model.add(Dropout(0.4))
    #Bidirectional(tf.keras.layers.LSTM(embedding_dim))
    #model.add(LSTM(400,input_shape=(1117, 100),return_sequences=True))
    #model.add(Bidirectional(LSTM(128)))
    model.add(Dense(100, activation='relu'))
    #
    #model.add(Dropout(0.4))
    #model.add(Dense(200, activation='relu'))
    model.add(Dense(4, activation='softmax'))

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

型号:“ sequential_4”

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_4 (Embedding)      (None, 50, 100)           2746300   
_________________________________________________________________
gru_4 (GRU)                  (None, 50, 150)           112950    
_________________________________________________________________
dropout_4 (Dropout)          (None, 50, 150)           0         
_________________________________________________________________
lstm_4 (LSTM)                (None, 200)               280800    
_________________________________________________________________
dense_7 (Dense)              (None, 100)               20100     
_________________________________________________________________
dense_8 (Dense)              (None, 4)                 404       
=================================================================
Total params: 3,160,554
Trainable params: 414,254
Non-trainable params: 2,746,300
_________________________________________________________________

完整代码位于 https://colab.research.google.com/drive/13N94kBKkHIX2TR5B_lETyuH1QTC5VuRf?usp=sharing

这将对我有很大的帮助。因为我是深度学习的新手,并且几乎尝试了所有我知道的东西。但是现在一切都空白了。

1 个答案:

答案 0 :(得分: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),但我认为这可能无济于事,应该在尝试预训练的嵌入和数据增强之后再考虑一下。