tensorflow - 使用 LSTM 制作新闻类别分类器
问题描述
我正在使用 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 个类别,随机基线准确度为(100/30) = 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.com/zabir-nabil/bangla-news-rnn
现在,您没有绘制验证准确度与训练准确度的图,但我假设您的训练准确度更高。因此,您的模型过度拟合。也许减少嵌入层中的参数。
您可以使用 Google 新闻嵌入作为嵌入层的权重初始化器。https://github.com/mmihaltz/word2vec-GoogleNews-vectors
最好的方法是使用类似 BERT 的语言模型来获得非常好的准确性。https://github.com/huggingface/transformers
推荐阅读
- linux - 为什么clock_gettime(CLOCK_REALTIME, ..) 上的调用延迟变化如此之大?
- asp.net - 使用 jQueryAjax 更改大小写调用 WebMethod
- python - 使用 BeatifulSoup 选择其他两个标签之间的所有标签(并提取文本)
- node.js - module.exports 没有返回 nodejs 中的函数
- python - 如何在 Python 中删除与列值相关的行?
- typescript - 输入默认值
- scipy - 使用 stats.expon.fit() 获得的参数是什么?
- openvpn - 为什么 OpenVPN 撤销后重新颁发 EasyRSA 3 证书失败?
- git - 如何使用 VSTS 任务名称将代码签入存储库
- adobe-analytics - Adobe DTM 中未触发自定义事件规则