LSTM文本分类准确率低的问题-Keras

5
我在这个项目中快疯了。这是使用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'])

只是我的准确率太低了...使用二元交叉熵可以获得很好的准确率,但结果是错误的!!!转换为分类交叉熵后,准确率非常低。你有什么建议吗?
以下是我的代码:GitHub 项目-多标签文本分类
2个回答

8
在最后一层中,您使用的激活函数是sigmoid,因此应使用binary_crossentropy。如果要使用categorical_crossentropy,则在最后一层中使用softmax作为激活函数。
现在,让我们来谈谈模型的另一部分,由于您正在处理文本,我建议您在LSTM层中使用tanh作为激活函数。
您还可以尝试使用LSTM的dropouts,例如dropout和recurrent dropout。
LSTM(units, dropout=0.2, recurrent_dropout=0.2,
                             activation='tanh')

你可以定义单位为64128。从小数开始,测试后将它们带到1024
您还可以尝试添加卷积层以提取特征或使用Bidirectional LSTM,但基于Bidirectional的模型训练需要时间。
此外,由于您正在处理文本,文本的预处理和训练数据的大小总是扮演比预期更重要的角色。
在fit参数中添加类权重。
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)

1
@angelocurtigiardina 如果你在使用 softmax 并检查答案,你可以使用 binary_crossentropy。我已经编辑过了。 - Upasana Mittal
类别0:808 - 类别1:1652 - 类别2:1220 - 类别3:1708 - 类别4:969 - angelo curti giardina
我已经检查了你的代码,并做出了相应的更改。请使用它。同时,我也在尝试使用我这边提供的数据来测试模型。 - Upasana Mittal
非常感谢您的宝贵帮助,非常感谢!!!但是我的模型没有提供准确的预测:(我应该使用多少个epochs?我已经尝试了1和5。 - angelo curti giardina
@angelocurtigiardina,您能否请检查一下这个链接https://github.com/upasana-mittal/stackoverflow/blob/master/sentence-classification.py? - Upasana Mittal
显示剩余18条评论

4

变更:

model.add(Activation('sigmoid'))

to:

model.add(Activation('softmax'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接