Keras 如何处理多标签分类?

Posted

技术标签:

【中文标题】Keras 如何处理多标签分类?【英文标题】:How does Keras handle multilabel classification? 【发布时间】:2017-10-25 04:10:28 【问题描述】:

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

我的 Y(基本事实)是使用 scikit-learn 的 MultilabelBinarizer() 设置的。

因此,举一个随机的例子,我的y 列的一行是 one-hot 编码如下: [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 遇到我的 y_train 并看到它是“多”单热编码时会做什么,这意味着在 y_train 的每一行中存在多个“一”?基本上,Keras 会自动执行多标签分类吗?对评分指标的解释有何不同?

【问题讨论】:

【参考方案1】:

总之

不要使用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

【讨论】:

谢谢,所以你是说把我的多标签问题分解成许多二元分类问题? Keras 怎么知道我在给它一个多标签分类任务? 是的,没错。 Keras 并不需要知道。通过使用sigmoidbinary_crossentropy,标签将被单独改进,这就是你想要的多标签任务,对吧? 你将如何获得有 1 的类 我迷路了,那Keras和TF教程怎么用了softmax,而且好像效果不错? tensorflow.org/tutorials/keras/basic_classification @HerrvonWurst 这是因为您链接到的问题是,分类器的工作是将图像仅放在一个类中,而在所问的问题中,分类器必须将多个类分配给一个输入

以上是关于Keras 如何处理多标签分类?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 ValueError:分类指标无法处理多标签指标和多类目标错误的混合

多标签分类 Keras 指标

Keras CNN:图像的多标签分类

如何使用 keras 实现多标签分类神经网络

多标签分类keras中的奇怪准确性

Keras - 带权重的多标签分类