LSTM 文本分类精度差 Keras
LSTM Text Classification Bad Accuracy Keras
我要为这个项目疯狂。这是在 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'))
至:
model.add(Activation('softmax'))
在最后一层,你使用的激活函数是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个权重
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)
我要为这个项目疯狂。这是在 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'))
至:
model.add(Activation('softmax'))
在最后一层,你使用的激活函数是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个权重
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)