我正在尝试一个多类,多标签分类问题。最终,我想训练一个模型来对正文包含的类别进行预测。
在此问题中,训练数据集由单个句子组成,每个句子带有一个标签。但是,该文本可能是一个(或更多)段落,并且可能匹配多个类别。我正在Keras(TensorFlow后端)上的神经网络进行尝试。这是我到目前为止的内容:
embeddings = nlp.vocab.vectors.data
model = Sequential()
model.add(Embedding(embeddings.shape[0], embeddings.shape[1],
input_length=100, trainable=False, weights=[embeddings], mask_zero=True))
model.add(Dense(256, use_bias=False, activation='relu'))
model.add(LSTM(64, recurrent_dropout=0, dropout=0))
model.add(Dense(y_train.shape[1], activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.001), metrics=['sparse_categorical_accuracy'])
即使在我用于将测试组合在一起的微小训练数据集(20个项目和2个类别)上,该模型实际上也表现不错。
但是,有两个我似乎无法解决的问题:
给出的训练数据每个句子包含一个类别,即使输入文本很明显匹配两个类别,网络似乎也“偏爱”输出中的一个类别。当我提供包含多个类别的训练句子时,这种情况会改变。我有什么可以改变的,即使在每个条目只有一个类别的数据集上进行训练时,网络也可以使我对多次激活具有很高的信心?
即使在完全乱码的情况下,网络似乎仍可以提供合理的概率。换句话说,“ asdfasdfasdf”在我的训练集中的两个类别中给我的分数约为0.5。有什么办法可以克服这个问题?
(如果很重要,我正在使用spaCy进行单词标记化+矢量化)