如何在 MLPClassifier 中设置初始权重?
Posted
技术标签:
【中文标题】如何在 MLPClassifier 中设置初始权重?【英文标题】:How to set initial weights in 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)
【问题讨论】:
【参考方案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_coef
here并根据需要进行修改。
【讨论】:
以上是关于如何在 MLPClassifier 中设置初始权重?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 DecisionTreeClassifier 中设置类权重以进行多类设置
在 sklearn.neural_network 中初始化权重