Keras如何处理多标签分类?

87

我不确定如何解释Keras在以下情况下的默认行为:

我的Y(真实值)是使用scikit-learn的MultilabelBinarizer设置的。

因此,举个随机的例子,我的y列的一行被独热编码为: [0,0,0,1,0,1,0,0,0,0,1]

所以我有11个类可以被预测,而且可能会有多个类别为真;因此问题具有多标签性质。这个特定样本有三个标签。

我像处理非多标签问题一样训练模型(照常进行),并且没有出现错误。

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD

model = Sequential()
model.add(Dense(5000, activation='relu', input_dim=X_train.shape[1]))
model.add(Dropout(0.1))
model.add(Dense(600, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(y_train.shape[1], activation='softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
              optimizer=sgd,
              metrics=['accuracy',])

model.fit(X_train, y_train,epochs=5,batch_size=2000)

score = model.evaluate(X_test, y_test, batch_size=2000)
score
当Keras遇到被"multi" one-hot编码的y_train,也就是每行中存在不止一个"1"时,它会如何处理?它是否会自动执行多标签分类?在评估指标的解释上有什么区别吗?
2个回答

135

简而言之

不要使用 softmax

在输出层使用 sigmoid 作为激活函数。

使用 binary_crossentropy 作为损失函数。

使用 predict 进行模型评估。

为什么

softmax 在增加一个标签的分数时,会降低所有其他标签的分数(因为它是一个概率分布)。当你有多个标签时,你不希望出现这种情况。

完整代码

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation
from tensorflow.keras.optimizers import SGD

model = Sequential()
model.add(Dense(5000, activation='relu', input_dim=X_train.shape[1]))
model.add(Dropout(0.1))
model.add(Dense(600, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(y_train.shape[1], activation='sigmoid'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy',
              optimizer=sgd)

model.fit(X_train, y_train, epochs=5, batch_size=2000)

preds = model.predict(X_test)
preds[preds>=0.5] = 1
preds[preds<0.5] = 0
# score = compare preds and y_test

3
谢谢,你是说要将我的多标签问题分解为许多二元分类问题吗?Keras如何知道我正在给它一个多标签分类任务? - user798719
7
没错,Keras实际上不需要知道。通过使用sigmoidbinary_crossentropy,标签将会被单独改进,这正是你想要的多标签任务,对吧? - YLJ
你将如何获取只有一个类的课程? - Dexter
1
我很困惑,为什么Keras和TF教程使用softmax,而且似乎效果很好?https://www.tensorflow.org/tutorials/keras/basic_classification - Herr von Wurst
11
这是因为您所提到的问题,分类器的任务是将图像仅归为一类,而在所询问的问题中,分类器需要将多个类别分配给一个输入。 - Priyank
显示剩余3条评论

0

Keras文档答案

我从Keras文档本身引用的。

他们将输出层作为具有sigmoid激活函数的全连接层使用。这意味着他们也将多标签分类视为使用二进制交叉熵损失的多个二元分类问题。

以下是Keras文档中创建的模型:

shallow_mlp_model = keras.Sequential( [ layers.Dense(512, activation="relu"), layers.Dense(256, activation="relu"), layers.Dense(lookup.vocabulary_size(), activation="sigmoid"), ] # 关于为什么在这里使用“sigmoid”稍后会有更多解释。

Keras文档链接: https://keras.io/examples/nlp/multi_label_classification/


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