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 以及 dropout
和 recurrent dropout
LSTM(units, dropout=0.2, recurrent_dropout=0.2,
activation='tanh')
您可以将单位定义为64
或128
。从少量开始,经过测试,您将它们带到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的主要内容,如果未能解决你的问题,请参考以下文章