2017-01-11 3 views
4

Par exemple, j'ai CNN qui essaie de prédire des nombres à partir de l'ensemble de données MNIST (code écrit en utilisant Keras). Il a 10 sorties, qui forment la couche softmax. Une seule des sorties peut être vrai (indépendamment pour chaque chiffre de 0 à 9):Quel est le remplacement pour la couche softmax au cas où plus d'une sortie peut être activée?

Real: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 
Predicted: [0.02, 0.9, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01] 

somme de la valeur prédite est égale à 1,0 à cause de définition de softmax.

Disons que j'ai une tâche où je dois classer certains objets qui peuvent tomber dans plusieurs catégories:

Real: [0, 1, 0, 1, 0, 1, 0, 0, 0, 1] 

donc je dois normaliser une autre manière. J'ai besoin fonction qui donne une valeur sur la gamme [0, 1] et qui somme peut être plus grand que 1.

je besoin de quelque chose comme ça:

Predicted: [0.1, 0.9, 0.05, 0.9, 0.01, 0.8, 0.1, 0.01, 0.2, 0.9] 

Chaque numéro est probable que l'objet tombe dans la catégorie donnée. Après cela, je peux utiliser un seuil comme 0.5 pour distinguer les catégories dans lesquelles l'objet donné tombe.

Les questions suivantes apparaissent:

  1. Alors quelle fonction activation peut être utilisé pour cela?
  2. Peut-être que cette fonction existe déjà dans Keras?
  3. Peut être vous pouvez proposer un autre moyen de prédire dans ce cas?
+0

On dirait que certains se trouvent des commentaires utiles ici: http://datascience.stackexchange.com/questions/13815/how-to-deal-with-item- appartenant à plus d'une catégorie Ils proposent d'utiliser seulement la couche sigmoïde. – ZFTurbo

+0

Je voudrais également utiliser une couche sigmoïde dans un tel cas. –

+0

L'autre question se pose alors: l'utilisation de loss = 'categorical_crossentropy' donnera-t-elle un résultat adéquat ou non? – ZFTurbo

Répondre

5

Votre problème est de classification multi-étiquettes, et dans le contexte de Keras il est discuté, par exemple, ici: https://github.com/fchollet/keras/issues/741

En bref, la solution proposée pour en keras est de remplacer le softmax couche avec une couche sigmoïde et utilisez binary_crossentropy comme fonction de coût.

un exemple de ce fil:

# Build a classifier optimized for maximizing f1_score (uses class_weights) 

clf = Sequential() 

clf.add(Dropout(0.3)) 
clf.add(Dense(xt.shape[1], 1600, activation='relu')) 
clf.add(Dropout(0.6)) 
clf.add(Dense(1600, 1200, activation='relu')) 
clf.add(Dropout(0.6)) 
clf.add(Dense(1200, 800, activation='relu')) 
clf.add(Dropout(0.6)) 
clf.add(Dense(800, yt.shape[1], activation='sigmoid')) 

clf.compile(optimizer=Adam(), loss='binary_crossentropy') 

clf.fit(xt, yt, batch_size=64, nb_epoch=300, validation_data=(xs, ys), class_weight=W, verbose=0) 

preds = clf.predict(xs) 

preds[preds>=0.5] = 1 
preds[preds<0.5] = 0 

print f1_score(ys, preds, average='macro') 
+0

Merci. On dirait exactement ce dont j'ai besoin! – ZFTurbo