Keras如何处理多标签分类?

use*_*719 56 python neural-network multilabel-classification keras

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

我的Y(基本事实)是使用scikit-learn's 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
Run Code Online (Sandbox Code Playgroud)

当Keras遇到我y_train并且看到它是"多"单热编码时会做什么,这意味着每一行中存在多个"一" y_train?基本上,Keras会自动执行多标签分类吗?评分指标的解释有何不同?

fra*_*ang 87

简而言之

不要用softmax.

使用sigmoid你的输出层的激活.

使用binary_crossentropy的损失函数.

使用predict进行评估.

为什么

softmax增加一个标签的分数时,所有其他标签都会降低(这是一个概率分布).当您有多个标签时,您不希望这样.

完整代码

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='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
Run Code Online (Sandbox Code Playgroud)

  • 恩,那就对了.Keras真的不必知道.通过使用`sigmoid`和`binary_crossentropy`,标签将被单独改进,这就是你想要多标签任务的方式,对吧? (4认同)
  • @HerrvonWurst这是因为您链接到的问题是分类器的工作是将图像仅放置在一个类中,而在提出的问题中,分类器必须将多个类分配给输入 (4认同)
  • 谢谢,所以您是说将我的多标签问题分解为许多二元分类问题?Keras 怎么知道我在给它一个多标签分类任务? (3认同)