如何在scikit-learn的多层感知器中将Softmax用作激活功能?[关闭]


9

我需要在scikit中将Softmax激活功能应用于多层Perceptron。关于神经网络模型(受监督)的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”)。

有没有办法在scikit-learn中将Softmax激活函数应用于多类分类?

Answers:


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. 多重类:最外层是softmax层

  2. Multilabel或Binary-class:最外层是逻辑/乙状结肠。

  3. 回归:最外层是身份

MLPClassifier中使用的sklearn的部分代码确认了这一点:

        # 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. 多类别分类:对于功能X,只能有一个类别。例如,情感分析给定文本(X),则输出(Y)为正,中性或负。二进制是多类的情况,其中只有两个可能的输出。
  2. 多标签分类:对于功能X,可以有多个类别。

1

我不同意Daniel Lopez的回答。就我而言,答案predict_proba()不返回softmax结果。

TrideepRath的答案可以轻松解决此问题。要应用softmax,请定义out_activation_:

your_model.out_activation_ = 'softmax'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.