zrb*_*ker 4 python numpy machine-learning scikit-learn
我正在尝试学习如何使用 scikit-learn 的 MLPClassifier。对于一个非常简单的例子,我想我应该尝试让它学习如何计算 XOR 函数,因为我之前已经手动完成了这个作为练习。
然而,在我尝试拟合模型后,它只是吐出零。
xs = np.array([
0, 0,
0, 1,
1, 0,
1, 1
]).reshape(4, 2)
ys = np.array([0, 1, 1, 0]).reshape(4,)
model = sklearn.neural_network.MLPClassifier(
activation='logistic', max_iter=10000, hidden_layer_sizes=(4,2))
model.fit(xs, ys)
print('score:', model.score(xs, ys)) # outputs 0.5
print('predictions:', model.predict(xs)) # outputs [0, 0, 0, 0]
print('expected:', np.array([0, 1, 1, 0]))
Run Code Online (Sandbox Code Playgroud)
我也将我的代码放在 github 上的 jupyter 笔记本中https://gist.github.com/zrbecker/6173ac01ed30be4eea9cc96e21f4896f
当我可以明确表明存在一个解决方案时,为什么 scikit-learn 无法找到解决方案?成本函数是否陷入局部最小值?参数是否发生某种正则化,迫使它们保持接近 0?我使用的参数相当大(即-30 到30)。
看来逻辑激活是这里的根本原因。
将您的激活更改为tanh或relu(我最喜欢的)。演示:
model = sklearn.neural_network.MLPClassifier(
activation='relu', max_iter=10000, hidden_layer_sizes=(4,2))
model.fit(xs, ys)
Run Code Online (Sandbox Code Playgroud)
该模型的输出:
score: 1.0
predictions: [0 1 1 0]
expected: [0 1 1 0]
Run Code Online (Sandbox Code Playgroud)
在选择最好的网络配置或完全放弃之前,尝试不同的网络配置总是一个好主意。
| 归档时间: |
|
| 查看次数: |
5346 次 |
| 最近记录: |