Как применить Softmax в качестве функции активации в многослойном Perceptron в scikit-learn? [закрыто]


9

Мне нужно применить функцию активации Softmax к многослойному Perceptron в Scikit. Документация Scikit по теме моделей нейронных сетей (под наблюдением) гласит: «MLPClassifier поддерживает мультиклассовую классификацию, применяя Softmax в качестве функции вывода». Вопрос в том, как применить функцию?

В приведенном ниже фрагменте кода, когда я добавляю Softmax под параметром активации, он не принимает.

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)

Код ошибки:

ValueError: Активация Softmax не поддерживается. Поддерживаемые активации («идентичность», «логистика», «tanh», «relu»).

Есть ли способ применить функцию активации Softmax для многоклассовой классификации в scikit-learn?

Ответы:


7

Я полагаю, что функция Softmax применяется, когда вы запрашиваете вероятностный прогноз, вызывая метод mlp.predict_proba(X).

Чтобы поддержать мое предположение, я разработал этот небольшой эксперимент:

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

Обратите внимание, что независимо от того, к каким значениям подключены predict_proba(), вектор вероятности выхода всегда суммируется до 1. Это может быть достигнуто только с помощью функции активации Softmax (при использовании активации, отличной от Softmax, нет гарантии, что сумма активаций в конечном слой будет ровно один, специально для невидимого образца).

Если мое предположение верно, глядя на документацию, я не могу найти какой-либо метод для получения выходных данных сети до Softmax ... Возможно, потому что этот класс предназначен исключительно для классификации (не регрессии или других необычных установок).


4

MLPClassifier может использоваться для «мультиклассовой классификации», «бинарной классификации» и «многослойной классификации». Таким образом, выходной слой определяется на основе типа Y:

  1. Multiclass : самый верхний слой - это слой softmax

  2. Multilabel или Binary-class : самый внешний слой - логистика / сигмоид.

  3. Регрессия : самый верхний слой - идентичность

Часть кода из sklearn, используемая в MLPClassifier, которая подтверждает это:

        # 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. Классификация мультикласса: для Feature X может быть только один класс. например, анализ настроений с учетом текста (X), является ли выход (Y) положительным, нейтральным или отрицательным. Binary - это случай Multiclass, в котором есть только 2 возможных выхода.
  2. Классификация по нескольким меткам: для функции X может быть несколько классов.

1

Не могу согласиться с ответом Даниэля Лопеса. В моем случае ответgnatet_proba () не возвращает результаты softmax.

Ответ от TrideepRath может легко решить эту проблему. Чтобы применить softmax, определите out_activation_:

your_model.out_activation_ = 'softmax'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.