【问题标题】:LSTM Text Classification Bad Accuracy KerasLSTM 文本分类精度差 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

【问题讨论】:

    标签: keras lstm text-classification rnn multilabel-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'))
    

    【讨论】:

      猜你喜欢
      • 2018-04-17
      • 1970-01-01
      • 2019-04-20
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 2019-10-22
      • 2017-12-11
      相关资源
      最近更新 更多