Comment appliquer Softmax comme fonction d'activation dans Perceptron multicouche dans Scikit-Learn? [fermé]

9

Je dois appliquer la fonction d'activation Softmax au Perceptron multicouche dans scikit. Le scikit documantation sur le thème des modèles de réseaux de neurones (supervisé) dit « MLPClassifier soutient la classification multi-classe en appliquant Softmax comme la fonction de sortie. » La question est de savoir comment appliquer la fonction?

Dans l'extrait de code ci-dessous, lorsque j'ajoute le Softmax sous le paramètre d'activation, il n'accepte pas.

MLPClassifier(activation='Softmax', alpha=1e-05, batch_size='auto',
       beta_1=0.9, beta_2=0.999, early_stopping=False,
       epsilon=1e-08, hidden_layer_sizes=(15,), learning_rate='constant',
       learning_rate_init=0.001, max_iter=200, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=1, shuffle=True,
       solver='lbfgs', tol=0.0001, validation_fraction=0.1, verbose=False,
       warm_start=False)

Le code d'erreur est:

ValueError: L'activation 'Softmax' n'est pas prise en charge. Les activations prises en charge sont ('identité', 'logistique', 'tanh', 'relu').

Existe-t-il un moyen d'appliquer la fonction d'activation Softmax pour la classification multi-classes dans scikit-learn?

Adit
la source

Réponses:

7

Je suppose que la fonction Softmax est appliquée lorsque vous demandez une prédiction de probabilité en appelant la méthode mlp.predict_proba(X).

Pour étayer ma supposition, j'ai développé cette petite expérience:

from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_iris
import numpy as np

X,Y = load_iris().data, load_iris().target

mlp = MLPClassifier()
mlp.fit(X, Y)

print mlp.predict([3.1,  2.5,  8.4,  2.2])
print mlp.predict_proba([3.1,  2.5,  8.4,  2.2])
print "sum: %f"%np.sum(mlp.predict_proba([3.1,  2.5,  8.4,  2.2]))

Notez que quelles que soient les valeurs connectées predict_proba(), le vecteur de probabilité de sortie est toujours égal à 1. Ceci ne peut être obtenu que par la fonction d'activation Softmax (En utilisant une activation autre que Softmax, il n'y a aucune garantie que la somme des activations dans la finale couche sera exactement un, spécialement pour un échantillon invisible).

Si ma supposition est juste, en regardant la documentation, je ne trouve aucune méthode pour obtenir la sortie du réseau avant Softmax ... Peut-être parce que cette classe est uniquement destinée à la classification (pas de régression ou d'autres configurations fantaisistes).

Daniel López
la source
4

Le MLPClassifier peut être utilisé pour la "classification multiclasse", la "classification binaire" et la "classification multilabel". La couche de sortie est donc décidée en fonction du type de Y:

  1. Multiclasse : la couche la plus à l'extérieur est la couche softmax

  2. Multilabel ou classe binaire : La couche la plus à l'extérieur est la logistique / sigmoïde.

  3. Régression : la couche la plus à l'extérieur est l'identité

Partie du code de sklearn utilisé dans MLPClassifier qui le confirme:

        # Output for regression
        if not is_classifier(self):
            self.out_activation_ = 'identity'
        # Output for multi class
        elif self._label_binarizer.y_type_ == 'multiclass':
            self.out_activation_ = 'softmax'
        # Output for binary class and multi-label
        else:
            self.out_activation_ = 'logistic'
  1. Classification multiclasse: pour une entité X, il ne peut y avoir qu'une seule classe. Ex. Analyse de sentiment Étant donné un texte (X), la sortie (Y) est positive, neutre ou négative. Le binaire est un cas de multiclasse où il n'y a que 2 sorties possibles.
  2. Classification multi-étiquettes: pour une entité X, il peut y avoir plusieurs classes.
Trideep Rath
la source
1

Je ne suis pas d'accord avec la réponse de Daniel Lopez. Dans mon cas, la réponse predict_proba () ne renvoie pas de résultats softmax.

La réponse de TrideepRath peut facilement résoudre ce problème. Pour appliquer softmax, définissez out_activation_:

your_model.out_activation_ = 'softmax'
MykolaSharhan
la source