Jak zastosować Softmax jako funkcję aktywacji w wielowarstwowym Perceptronie w scikit-learn? [Zamknięte]

9

Muszę zastosować funkcję aktywacji Softmax na wielowarstwowym Perceptronie w scikit. Scikit documantation na temat modeli sieci neuronowych (nadzorowane) mówi „MLPClassifier obsługuje multi-klasy klasyfikacji stosując Softmax jako funkcji wyjścia.” Pytanie brzmi, jak zastosować tę funkcję?

W poniższym fragmencie kodu, gdy dodam Softmax pod parametrem aktywacji, nie akceptuje.

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)

Kod błędu to:

ValueError: Aktywacja „Softmax” nie jest obsługiwana. Obsługiwane aktywacje to („tożsamość”, „logistyka”, „tanh”, „relu”).

Czy istnieje sposób na zastosowanie funkcji aktywacji Softmax do klasyfikacji wieloklasowej w scikit-learn?

Sztolnia
źródło

Odpowiedzi:

7

Podejrzewam, że funkcja Softmax jest stosowana, gdy żądasz prognozy prawdopodobieństwa poprzez wywołanie metody mlp.predict_proba(X) .

Aby wesprzeć moje przypuszczenie, opracowałem ten mały eksperyment:

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

Zauważ, że bez względu na to, jakie wartości są podłączone predict_proba() , wyjściowy wektor prawdopodobieństwa zawsze sumuje się do 1. Można to osiągnąć tylko przez funkcję aktywacji Softmax (użycie innej aktywacji niż Softmax nie gwarantuje, że suma aktywacji w końcowej warstwa będzie dokładnie jedna, specjalnie dla niewidzialnej próbki).

Jeśli zgaduję, patrząc na dokumentację, nie mogę znaleźć żadnej metody uzyskania danych wyjściowych sieci przed Softmaxem ... Może dlatego, że ta klasa jest przeznaczona wyłącznie do klasyfikacji (nie regresji ani innych wymyślnych konfiguracji).

Daniel López
źródło
4

MLPClassifier może być używany do „klasyfikacji wieloklasowej”, „klasyfikacji binarnej” i „klasyfikacji wielopłaszczyznowej”. Tak więc o warstwie wyjściowej decyduje typ Y:

  1. Multiclass : skrajną zewnętrzną warstwę stanowi warstwa SoftMax

  2. Multilabel lub Binary-class : Najbardziej oddaloną warstwą jest logistyka / sigmoid.

  3. Regresja : najwyższą warstwą jest tożsamość

Część kodu ze sklearn zastosowanego w MLPClassifier, która to potwierdza:

        # 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. Klasyfikacja wieloklasowa: dla cechy X może istnieć tylko jedna klasa. np. Analiza sentymentu Biorąc pod uwagę tekst (X), czy wynik (Y) jest dodatni, neutralny lub ujemny. Binary to przypadek Multiclass, w którym są tylko 2 możliwe wyjścia.
  2. Klasyfikacja wielowarstwowa: dla cechy X może istnieć wiele klas.
Trideep Rath
źródło
1

Nie mogę się zgodzić z odpowiedzią Daniela Lopeza. W moim przypadku odpowiedź przewidywana_proba () nie zwraca wyników softmax.

Odpowiedź TrideepRath może łatwo rozwiązać ten problem. Aby zastosować softmax, zdefiniuj out_activation_:

your_model.out_activation_ = 'softmax'
Mykoła Szarhan
źródło