如何在 scikit-learn 的多层感知器中应用 Softmax 作为激活函数?

机器算法验证 神经网络 scikit-学习 多级 软最大
2022-03-17 15:53:31

我需要将 Softmax 激活函数应用于 scikit 中的多层 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”。支持的激活是('identity'、'logistic'、'tanh'、'relu')。

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

3个回答

我想当您通过调用方法请求概率预测时应用 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 以外的激活函数并不能保证最终激活函数的总和layer 将是一个,特别是对于一个看不见的样本)。

如果我的猜测是正确的,查看文档我找不到在 Softmax 之前获得网络输出的任何方法......也许是因为这个类仅用于分类(而不是回归或其他花哨的设置)。

MLPClassifier 可用于“多类分类”、“二元分类”和“多标签分类”。所以输出层是根据 Y 的类型决定的:

  1. Multiclass:最外层是softmax层

  2. 多标签或二进制类:最外层是逻辑/乙状结肠。

  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)是积极的、中性的还是消极的。Binary 是 Multiclass 的一种情况,其中只有 2 个可能的输出。
  2. 多标签分类:对于一个特征 X,可以有多个类。

不能同意 Daniel Lopez 的回答。在我的情况下,答案 predict_proba() 不会返回 softmax 结果。

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

your_model.out_activation_ = 'softmax'