【问题标题】:How to set initial weights in MLPClassifier?如何在 MLPClassifier 中设置初始权重?
【发布时间】:2017-11-12 16:08:06
【问题描述】:

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

下面是代码供参考:

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

【问题讨论】:

    标签: scikit-learn neural-network


    【解决方案1】:

    docs 显示正在使用的属性。

    属性:
    ...

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

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

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

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

    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进行序列化。

    【讨论】:

    • 这个不行,我已经试过了。在调用 fit 函数之前它不会覆盖。我找到了一个可行的解决方案,我会在评论中发布。
    • @MohamedElSheikh 你能发布你的解决方案吗?
    • 嘿@Jeremy,是的,我在下面发布了一个可行的解决方案。
    【解决方案2】:

    解决方案: 一个可行的解决方案是从 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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-01
        • 2018-09-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 2019-06-16
        • 2018-01-27
        • 1970-01-01
        相关资源
        最近更新 更多