使用LSTM制作新闻分类器

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

我正在用LSTM做一个新闻分类模型。当我训练模型时,我的训练精度不断提高,但验证精度却没有提高到57%以上。我有近20万个新闻段落,并将它们分为30个不同的类别。

我的模型如下。

model=Sequential()
model.add(Embedding(30000,64,input_length=X_train.shape[1],mask_zero=True))
model.add(Bidirectional(LSTM(64)))
model.add(Dropout(0.5))
model.add(Dense(64,activation='relu'))
model.add(Dense(30))
model.add(Activation(activation='softmax'))
model.compile(loss="categorical_crossentropy",optimizer='adam',metrics=['accuracy'])
tensorflow machine-learning keras nlp lstm
1个回答
1
投票

首先,对于30个类,随机的基线准确率是 (10030) = 3.33%所以你的模型已经做得很好了。

你没有提供更多的细节,比如输入的长度是多少,段落有多长,你是否做了任何预处理,比如去掉停顿词,你如何截断你的段落,使其具有相同的长度。input_length.

另一个问题可能是类的不平衡,可能对于一些类来说,你有太少的例子。试着删除它们或增加数据集,使类平衡。

我解决了一个类似的问题,新闻类别分类,但对于孟加拉语来说,孟加拉语新闻类别分类肯定比做英语更具挑战性。

我使用了一个BiLSTM模型,在没有任何严重的超参数调整的情况下,测试准确率达到了91%以上。

这是我使用的模型。

from keras.models import Sequential
from keras.layers import Embedding, CuDNNLSTM, Bidirectional, Dense

embedding_dim = 8

model = Sequential()
model.add(Embedding(input_dim=vocab_size, 
                           output_dim=embedding_dim, 
                           input_length=maxlen))
model.add(Bidirectional(CuDNNLSTM(128, return_sequences = True)))
model.add(Bidirectional(CuDNNLSTM(128))) 
model.add(Dense(9, activation='softmax'))
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.summary()

Bangla News类别分类的完整代码。https:/github.comzabir-nabilbangla-news-rnn。

现在,你没有画出你的验证精度与训练精度,但我假设你的训练精度更高。所以,你的模型是过拟合的。也许减少嵌入层的参数。

你可以使用谷歌新闻嵌入作为你的Embedding层的权重初始化器。https:/github.commmihaltzword2vec-GoogleNews-vectors

最好的方法是使用类似于BERT的语言模型,以获得真正良好的准确性。https:/github.comhuggingfacetransformers

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