11 votos

¿Cómo aplicar Softmax como función de activación en Perceptron multicapa en scikit-learn?

Necesito aplicar la función de activación Softmax al Perceptrón multicapa en scikit. El scikit documentación sobre el tema de los modelos de redes neuronales (supervisadas) dice "MLPClassifier soporta la clasificación multiclase aplicando Softmax como función de salida". La cuestión es cómo aplicar la función.

En el siguiente fragmento de código, cuando añado el Softmax bajo el parámetro de activación no acepta.

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)

El código de error es:

ValueError: La activación 'Softmax' no es compatible. Las activaciones admitidas son ('identity', 'logistic', 'tanh', 'relu').

¿Existe alguna forma de aplicar la función de activación Softmax para la clasificación multiclase en scikit-learn?

8voto

Andross Puntos 31

Supongo que la función Softmax se aplica cuando se solicita una predicción de probabilidad llamando al método mlp.predict_proba(X) .

Para apoyar mi suposición he desarrollado este pequeño experimento:

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

Observe que no importa qué valores se introduzcan en predict_proba() El vector de probabilidad de salida siempre suma 1. Esto sólo se puede conseguir con la función de activación Softmax (utilizando una activación distinta a Softmax no hay garantía de que la suma de las activaciones en la capa final sea exactamente uno, especialmente para una muestra no vista).

Si mi suposición es correcta, mirando la documentación no encuentro ningún método para obtener la salida de la red antes de Softmax... Tal vez porque esta clase está pensada únicamente para la clasificación (no regresión u otras configuraciones de lujo).

7voto

user188220 Puntos 53

El MLPClassifier puede utilizarse para "clasificación multiclase", "clasificación binaria" y "clasificación multietiqueta". Así, la capa de salida se decide en función del tipo de Y :

  1. Multiclase : La capa más externa es la capa softmax

  2. Etiqueta múltiple o clase binaria : La capa más externa es la logístico/sigmoidea.

  3. Regresión : La capa más externa es la identidad

Parte del código de sklearn utilizado en MLPClassifier que lo confirma:

        # 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. Clasificación multiclase: Para una característica X, sólo puede haber una clase. Por ejemplo, análisis de sentimiento Dado un texto (X), el resultado (Y) es positivo, neutro o negativo. La clasificación binaria es un caso de clasificación multiclase en el que sólo hay dos resultados posibles.
  2. Clasificación multietiqueta: Para una característica X, puede haber varias clases.

3voto

David Steinberg Puntos 529

No puedo estar de acuerdo con la respuesta de Daniel López. En mi caso la respuesta predict_proba() no devuelve resultados softmax.

La respuesta de TrideepRath puede resolver fácilmente este problema. Para aplicar softmax definir out_activation_:

your_model.out_activation_ = 'softmax'

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X