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

时间:2017-06-10 21:13:08

标签: scikit-learn neural-network

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

以下是供参考的代码:

from sklearn.neural_network import MLPClassifier
classifier = MLPClassifier(solver="sgd")
classifier.fit(X_train, y_train)

3 个答案:

答案 0 :(得分:5)

docs显示正在使用的属性。

  

属性:
  ...

     

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

     

intercepts_:list,length n_layers - 1   列表中的第i个元素表示对应于层>的偏置矢量。我+ 1。

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

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

code看起来像:

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

这让我觉得它不会取代你给定的coefs_(你也可以检查偏见)。

打包和打包functions进一步表明这应该是可行的。这些可能用于内部的pickle序列化。

答案 1 :(得分:1)

multilayer_perceptron.py根据用于隐藏图层的非线性函数初始化权重。如果您想尝试不同的初始化,可以查看函数_init_coef here并根据需要进行修改。

答案 2 :(得分:1)

<强>解决方案: 一个有效的解决方案是继承MLPClassifier并覆盖_init_coef方法。在_init_coef中编写代码来设置初始权重。 然后使用新类&#34; MLPClassifierOverride&#34; ,如下例所示,而不是&#34; MLPClassifier&#34;

# 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