首页 文章

Keras如何处理多标签分类?

提问于
浏览
43

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

我的Y(基本事实)是使用scikit-learn的 MultilabelBinarizer () Build 的 .

因此,为了给出一个随机的例子,我的 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遇到我的 y_train 并看到它是"multi"单热编码时会做什么,这意味着 y_train 的每一行中都存在多个'one'?基本上,Keras会自动执行多标签分类吗?评分指标的解释有何不同?

1 回答

  • 67

    简而言之

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

相关问题