我正在用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'])
首先,对于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