LSTM 文本分类精度差 Keras

Posted

技术标签:

【中文标题】LSTM 文本分类精度差 Keras【英文标题】:LSTM Text Classification Bad Accuracy Keras 【发布时间】:2019-01-28 10:27:41 【问题描述】:

我在这个项目中快疯了。这是在 keras 中使用 lstm 的多标签文本分类。我的模型是这样的:

model = Sequential()

model.add(Embedding(max_features, embeddings_dim, input_length=max_sent_len, mask_zero=True, weights=[embedding_weights] ))
model.add(Dropout(0.25))
model.add(LSTM(output_dim=embeddings_dim , activation='sigmoid', inner_activation='hard_sigmoid', return_sequences=True))
model.add(Dropout(0.25))
model.add(LSTM(activation='sigmoid', units=embeddings_dim, recurrent_activation='hard_sigmoid', return_sequences=False))
model.add(Dropout(0.25))
model.add(Dense(num_classes))
model.add(Activation('sigmoid'))

adam=keras.optimizers.Adam(lr=0.04)
model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])

只是我的准确度太低了..使用二元交叉熵我得到了很好的准确度,但结果是错误的!!!!!!更改为分类交叉熵,我的准确率非常低。你有什么建议吗?

这是我的代码:GitHubProject - Multi-Label-Text-Classification

【问题讨论】:

【参考方案1】:

在最后一层,你使用的激活函数是sigmoid,所以应该使用binary_crossentropy。如果你想使用categorical_crossentropy,那么在最后一层使用softmax作为激活函数。

现在,进入模型的另一部分,由于您正在处理文本,我会告诉您选择 tanh 作为 LSTM 层中的激活函数。

您可以尝试使用 LSTM 的 dropouts 以及 dropoutrecurrent dropout

LSTM(units, dropout=0.2, recurrent_dropout=0.2,
                             activation='tanh')

您可以将单位定义为64128。从少量开始,经过测试,您将它们带到1024

您也可以尝试添加convolution 层来提取特征或使用Bidirectional LSTM 但基于Bidirectional 的模型需要时间来训练。

此外,由于您正在处理文本,pre-processing of text and size of training data 的作用总是比预期的要大得多。

已编辑

在拟合参数中添加类权重

class_weights = class_weight.compute_class_weight('balanced',
                                                  np.unique(labels),
                                                  labels)
class_weights_dict = dict(zip(le.transform(list(le.classes_)),
                          class_weights))


model.fit(x_train, y_train, validation_split, class_weight=class_weights_dict)

【讨论】:

谢谢!!我使用 categorical_crossentropy 因为我有多个类要预测..是正确的???我可以为此目的使用二进制文件吗???现在我使用 softmax 和 tanh 但准确率仍然很低。我如何使用 LSTM 的 dropout 以及 dropout 和经常性 dropout?对于预处理我使用embeddings = dict( ) embeddings = gensim.models.KeyedVectors.load_word2vec_format("GoogleNews-vectors-negative300.bin.gz" , binary=True) 是正确的?? 您是否尝试过使用预训练的手套和 fasttext? @angelocurtigiardina 真的非常感谢!二进制精度很高!!!!现在我正在测试..然后我尝试使用手套和 fasttext!!!!真的谢谢! @UpasanaMittal 真的很糟糕 :( 我的代码是这样的……用 word2vec 和 fasttext、二进制和分类……尝试过二进制和分类……使用二进制的准确性很高,但结果不正确……我做错了什么?.. ....我无法发布我的代码..【参考方案2】:

改变:

model.add(Activation('sigmoid'))

到:

model.add(Activation('softmax'))

【讨论】:

以上是关于LSTM 文本分类精度差 Keras的主要内容,如果未能解决你的问题,请参考以下文章

文本分类 RNN - LSTM - 错误检查目标

万字总结Keras深度学习中文文本分类

万字总结Keras深度学习中文文本分类

使用keras构建LSTM分类器

为啥我的多标签文本分类 LSTM 表现不佳?

如何使用 keras RNN 在数据集中进行文本分类?