Como aplicar a função Softmax como Ativação no Perceptron de várias camadas no scikit-learn? [fechadas]

9

Preciso aplicar a função de ativação Softmax ao Perceptron de várias camadas no scikit. O scikit documantation sobre o tema de modelos de redes neurais (supervisionada) diz "MLPClassifier suporta classificação multi-classe, aplicando Softmax como a função de saída." A questão é como aplicar a função?

No snip de código abaixo, quando adiciono o Softmax sob o parâmetro de ativação, ele não aceita.

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)

O código de erro é:

ValueError: A ativação 'Softmax' não é suportada. As ativações suportadas são ('identidade', 'logística', 'tanh', 'relu').

Existe uma maneira de aplicar a função de ativação Softmax para a classificação de várias classes no scikit-learn?

AdiT
fonte

Respostas:

7

I suposse que a função Softmax é aplicada quando você solicita uma previsão probabilidade chamando o método mlp.predict_proba(X).

Para apoiar minha suposição, desenvolvi este pequeno 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, independentemente de quais valores estejam conectados predict_proba(), o vetor de probabilidade de saída sempre chega a 1. Isso só pode ser alcançado pela função de ativação do Softmax (usando uma ativação que não seja a Softmax, não há garantia de que a soma das ativações no final camada será exatamente uma, especialmente para uma amostra invisível).

Se meu palpite estiver correto, olhando para a documentação, não consigo encontrar nenhum método para obter a saída da rede antes do Softmax ... Talvez porque essa classe seja destinada apenas à classificação (não à regressão ou outras configurações sofisticadas).

Daniel López
fonte
4

O MLPClassifier pode ser usado para "classificação em várias classes", "classificação binária" e "classificação em vários rótulos". Portanto, a camada de saída é decidida com base no tipo de Y:

  1. Multiclasse : a camada mais externa é a camada softmax

  2. Multilabel ou classe binária : A camada mais externa é a logística / sigmóide.

  3. Regressão : a camada mais externa é a identidade

Parte do código do sklearn usado no MLPClassifier que o 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. Classificação multiclasse: para um Recurso X, só pode haver uma classe. Ex .: Análise de Sentimentos Dado um Texto (X), o resultado (Y) é positivo, neutro ou negativo. Binário é um caso de Multiclasse, onde existem apenas 2 saídas possíveis.
  2. Classificação de vários rótulos: para um Recurso X, pode haver várias classes.
Trideep Rath
fonte
1

Não posso concordar com a resposta de Daniel Lopez. No meu caso, a resposta predict_proba () não retorna resultados softmax.

A resposta do TrideepRath pode facilmente resolver esse problema. Para aplicar o softmax, defina out_activation_:

your_model.out_activation_ = 'softmax'
MykolaSharhan
fonte