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)
该文档显示您正在使用的属性.
属性:
......
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序列化.
解决方案:一个可行的解决方案是从 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)