Wie wende ich Softmax als Aktivierungsfunktion in mehrschichtigem Perceptron in Scikit-Learn an? [geschlossen]

9

Ich muss die Softmax-Aktivierungsfunktion auf das mehrschichtige Perceptron in Scikit anwenden. In der Scikit- Dokumentation zum Thema Neuronale Netzwerkmodelle (überwacht) heißt es: "MLPClassifier unterstützt die Klassifizierung mehrerer Klassen durch Anwendung von Softmax als Ausgabefunktion." Die Frage ist, wie die Funktion angewendet werden soll.

Wenn ich im folgenden Code-Snip den Softmax unter dem Aktivierungsparameter hinzufüge, wird er nicht akzeptiert.

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)

Der Fehlercode lautet:

ValueError: Die Aktivierung 'Softmax' wird nicht unterstützt. Unterstützte Aktivierungen sind ('Identität', 'Logistik', 'Tanh', 'Relu').

Gibt es eine Möglichkeit, die Softmax-Aktivierungsfunktion für die Klassifizierung mehrerer Klassen in Scikit-Learn anzuwenden?

AdiT
quelle

Antworten:

7

Ich gehe davon aus, dass die Softmax-Funktion angewendet wird, wenn Sie eine Wahrscheinlichkeitsvorhersage durch Aufrufen der Methode anfordern mlp.predict_proba(X) .

Um meine Vermutung zu stützen, habe ich dieses kleine Experiment entwickelt:

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]))

Beachten Sie, dass unabhängig davon, welche Werte angeschlossen sind predict_proba() der Ausgangswahrscheinlichkeitsvektor unabhängig von den ergibt. Dies kann nur durch die Softmax-Aktivierungsfunktion erreicht werden (bei Verwendung einer anderen Aktivierung als Softmax gibt es keine Garantie dafür, dass die Summe der Aktivierungen im Finale liegt Schicht wird genau eine sein, speziell für eine unsichtbare Probe).

Wenn meine Vermutung richtig ist, kann ich in der Dokumentation keine Methode finden, um die Ausgabe des Netzwerks vor Softmax abzurufen ... Vielleicht, weil diese Klasse nur zur Klassifizierung gedacht ist (keine Regression oder andere ausgefallene Setups).

Daniel López
quelle
4

Der MLPClassifier kann für "Multiclass Classification", "Binary Classification" und "Multilabel Classification" verwendet werden. Die Ausgabeschicht wird also basierend auf dem Typ von Y festgelegt:

  1. Multiklasse : Die äußerste Schicht ist die Softmax-Schicht

  2. Multilabel oder Binärklasse : Die äußerste Schicht ist das Logistik- / Sigmoid.

  3. Regression : Die äußerste Schicht ist die Identität

Ein Teil des in MLPClassifier verwendeten Codes von sklearn, der dies bestätigt:

        # 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. Klassifizierung mehrerer Klassen: Für ein Feature X kann es nur eine Klasse geben. zB Stimmungsanalyse Bei einem gegebenen Text (X) ist die Ausgabe (Y) positiv, neutral oder negativ. Binär ist ein Fall von Multiclass, bei dem nur 2 mögliche Ausgänge vorhanden sind.
  2. Multilabel-Klassifizierung: Für ein Feature X können mehrere Klassen vorhanden sein.
Trideep Rath
quelle
1

Ich kann der Antwort von Daniel Lopez nicht zustimmen. In meinem Fall gibt die Antwort Predict_proba () keine Softmax-Ergebnisse zurück.

Die Antwort von TrideepRath kann dieses Problem leicht lösen. Um softmax anzuwenden, definieren Sie out_activation_:

your_model.out_activation_ = 'softmax'
MykolaSharhan
quelle