如何在MLPClassifier中设置初始权重?

Moh*_*ikh 7 neural-network scikit-learn

我找不到设置神经网络初始权重的方法,有人能告诉我怎么样?我正在使用python包sklearn.neural_network.MLPClassifier.

以下是供参考的代码:

from sklearn.neural_network import MLPClassifier
classifier = MLPClassifier(solver="sgd")
classifier.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)

sas*_*cha 5

文档显示您正在使用的属性.

属性:
......

coefs_ :list,length n_layers - 1列表中的第i个元素表示对应于> i层的权重矩阵.

intercepts_ :list,length n_layers - 1列表中的第i个元素表示对应于layer> i + 1的偏置向量.

只需构建您的分类器clf=MLPClassifier(solver="sgd")并设置coefs_intercepts_在调用之前clf.fit().

唯一剩下的问题是:sklearn会覆盖你的内容吗?

代码是这样的:

    if not hasattr(self, 'coefs_') or (not self.warm_start and not
                                       incremental):
        # First time training the model
        self._initialize(y, layer_units)
Run Code Online (Sandbox Code Playgroud)

这在我看来它不会取代你给定的coefs_(你也可能检查偏见).

包装和拆包功能进一步表明这应该是可能的.这些可能用于内部的pickle序列化.

  • 这不起作用,我已经试过了。在调用 fit 函数之前它不会覆盖。我找到了一个可行的解决方案,我会将其发布在评论中。 (2认同)

Moh*_*ikh 5

解决方案:一个可行的解决方案是从 MLPClassifier 继承并覆盖 _init_coef 方法。在 _init_coef 中编写代码来设置初始权重。然后使用新类“MLPClassifierOverride”(如下例所示)而不是“MLPClassifier”

# new class
class MLPClassifierOverride(MLPClassifier):
# Overriding _init_coef method
def _init_coef(self, fan_in, fan_out):
    if self.activation == 'logistic':
        init_bound = np.sqrt(2. / (fan_in + fan_out))
    elif self.activation in ('identity', 'tanh', 'relu'):
        init_bound = np.sqrt(6. / (fan_in + fan_out))
    else:
        raise ValueError("Unknown activation function %s" %
                         self.activation)
    coef_init = ### place your initial values for coef_init here

    intercept_init = ### place your initial values for intercept_init here

    return coef_init, intercept_init
Run Code Online (Sandbox Code Playgroud)