LSTM文本分类精度差Keras

LSTM文本分类精度差Keras,keras,lstm,text-classification,rnn,multilabel-classification,Keras,Lstm,Text Classification,Rnn,Multilabel Classification,我在这个项目上疯了。这是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_di

我在这个项目上疯了。这是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'])
只是我的准确度太低了。。用二进制交叉熵我得到了很好的精度,但是结果是错误的!!!!!改为分类交叉熵,我的准确率很低。你有什么建议吗

这是我的代码:

更改:

model.add(Activation('sigmoid'))
致:


在最后一层中,您使用的激活函数是
sigmoid
,因此应该使用
binary\u crossentropy
。如果您想使用
categorical\u crossentropy
,则使用
softmax
作为最后一层的激活函数

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

您还可以尝试使用LSTM的辍学者,如
辍学者
经常性辍学者

LSTM(units, dropout=0.2, recurrent_dropout=0.2,
                             activation='tanh')
您可以将单位定义为
64
128
。从少量开始,测试后服用,直到
1024

您也可以尝试添加
卷积
层来提取特征,或者使用
双向LSTM
,但是基于
双向
的模型需要时间来训练

此外,由于您正在处理文本,
文本的预处理和训练数据的大小始终比预期发挥更大的作用

已编辑

在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)

非常感谢。我使用分类交叉熵,因为我要预测多个类。正确吗???我可以为此使用二进制文件吗???现在我使用softmax和tanh,但精确度仍然很低。我如何使用LSTM的辍学学生以及辍学学生和反复辍学学生???对于预处理,我使用
embeddings=dict()embeddings=gensim.models.KeyedVectors.load_word2vec_格式(“GoogleNews-vectors-negative300.bin.gz”,binary=True)
是否正确???@Angelocartigiardina如果使用
softmax
可以使用
二进制交叉熵
,并检查答案,我编辑过。你试过使用预先训练过的手套和快速文本吗@安琪儿真的非常感谢!使用二进制,精度很高!!!!现在我正在测试..然后我尝试使用手套和fasttext!!!!真的谢谢你@UpasanaMittalReally bad:(我的代码是这样的..使用word2vec和fasttext、二进制和分类进行了尝试..使用二进制时精度很高,但结果不正确..我做错了什么?…我无法发布我的代码。。
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)