如何提高 LSTM 模型的预测和准确性?
How to improve LSTM model predictions and accuracy?
使用 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
这对 me.Since 会有很大帮助我是深度学习的新手,我尝试了几乎所有的东西我 knew.But 现在一片空白。
问题出在您的输入上。您已用零填充输入序列,但尚未将此信息提供给您的模型。所以你的模型不会忽略零,这就是它根本不学习的原因。要解决此问题,请按如下方式更改嵌入层:
model.add(layers.Embedding(input_dim=vocab_size+1,
output_dim=embedding_dim,
mask_zero=True))
这将使您的模型能够忽略零填充并进行学习。通过此训练,我在短短 6 个时期内获得了 100% 的训练准确率,尽管验证准确率不是很好(大约 54%),这是预期的,因为您的训练数据仅包含 32 个示例。更多关于嵌入层:https://keras.io/api/layers/core_layers/embedding/
由于您的数据集很小,模型很容易过度拟合训练数据,从而降低验证准确性。为了在某种程度上缓解这种情况,您可以尝试使用预训练的词嵌入,如 word2vec 或 GloVe,而不是训练您自己的嵌入层。此外,尝试一些文本数据增强方法,例如使用模板创建人工数据或用同义词替换训练数据中的单词。您还可以尝试使用不同类型的层(例如用另一个 LSTM 替换 GRU),但我认为这在这里可能没有太大帮助,应该在尝试预训练嵌入和数据扩充后考虑。
使用 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
这对 me.Since 会有很大帮助我是深度学习的新手,我尝试了几乎所有的东西我 knew.But 现在一片空白。
问题出在您的输入上。您已用零填充输入序列,但尚未将此信息提供给您的模型。所以你的模型不会忽略零,这就是它根本不学习的原因。要解决此问题,请按如下方式更改嵌入层:
model.add(layers.Embedding(input_dim=vocab_size+1,
output_dim=embedding_dim,
mask_zero=True))
这将使您的模型能够忽略零填充并进行学习。通过此训练,我在短短 6 个时期内获得了 100% 的训练准确率,尽管验证准确率不是很好(大约 54%),这是预期的,因为您的训练数据仅包含 32 个示例。更多关于嵌入层:https://keras.io/api/layers/core_layers/embedding/
由于您的数据集很小,模型很容易过度拟合训练数据,从而降低验证准确性。为了在某种程度上缓解这种情况,您可以尝试使用预训练的词嵌入,如 word2vec 或 GloVe,而不是训练您自己的嵌入层。此外,尝试一些文本数据增强方法,例如使用模板创建人工数据或用同义词替换训练数据中的单词。您还可以尝试使用不同类型的层(例如用另一个 LSTM 替换 GRU),但我认为这在这里可能没有太大帮助,应该在尝试预训练嵌入和数据扩充后考虑。