LSTM文本分类精度差Keras

时间:2018-08-22 07:49:23

标签: 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_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

2 个答案:

答案 0 :(得分:3)

在最后一层中,您正在使用的激活功能为sigmoid,因此应使用binary_crossentropy。如果要使用categorical_crossentropy,然后在最后一层使用softmax作为激​​活功能。

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

您可以尝试使用LSTM的辍学对象,例如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)

答案 1 :(得分:1)

更改:

Post::orderBy('post_id', 'desc')->simplePaginate(5);

收件人:

model.add(Activation('sigmoid'))