Comment Keras gère-t-il la classification multilabel?

Je ne sais pas comment interpréter le comportement par défaut de Keras dans la situation suivante:

Mon Y (vérité terrain) a été mis en place à l'aide de scikit-learn MultilabelBinarizer().

Donc, pour donner un hasard, une ligne de mon y la colonne est codée une seule fois comme telle: [0,0,0,1,0,1,0,0,0,0,1].

donc j'ai 11 classes qui pourraient être prédites, et plus d'une peut être vraie; d'où la nature multicabel du problème. Il y a trois étiquettes pour cette échantillon.

je forme le modèle comme je le ferais pour un problème non multilabel (business as usual) et je ne reçois aucune erreur.

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

Que fait Keras quand il rencontre mon y_train et voit qu'il est" multi " one-hot encoded, ce qui signifie qu'il y a plus d'un 'one' présent dans chaque rangée de <!--4? Fondamentalement, Est-ce que Keras effectue automatiquement la classification multicabel? Les différences dans l'interprétation des paramètres de notation?

34
demandé sur user798719 2017-05-24 20:10:27

1 réponses

En bref

Ne pas utiliser softmax.

Utiliser sigmoid pour l'activation de votre couche de sortie.

Utiliser binary_crossentropy pour la fonction de perte.

Utiliser predict pour l'évaluation.

Pourquoi

softmax lorsque le score augmente pour un label, tous les autres sont abaissés (c'est une distribution de probabilité). Tu ne veux pas de ça quand tu as plusieurs étiquettes.

Code Complet

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
47
répondu frankyjuang 2017-05-24 18:11:14