训练神经网络在 scikit-learn 中计算“XOR”

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)。

cs9*_*s95 5

看来逻辑激活是这里的根本原因。

将您的激活更改为tanhrelu(我最喜欢的)。演示:

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)

在选择最好的网络配置或完全放弃之前,尝试不同的网络配置总是一个好主意。