Python scikit神经网络的mlp分类器不适用于xor

Python scikit神经网络的mlp分类器不适用于xor,python,machine-learning,scikit-learn,neural-network,Python,Machine Learning,Scikit Learn,Neural Network,我正在尝试创建一个神经网络,它可以使用scikit神经网络学习xor问题。我每样东西的输出都是1 import sknn.mlp as mlp; import numpy as np; """ input layer """ ip_layer = mlp.Layer('Sigmoid', units=2); hidden_layer = mlp.Layer('Tanh', units=3); op_layer = mlp.Layer('Softmax', units=1); nn = mlp.

我正在尝试创建一个神经网络,它可以使用scikit神经网络学习xor问题。我每样东西的输出都是1

import sknn.mlp as mlp;
import numpy as np; 
""" input layer """
ip_layer = mlp.Layer('Sigmoid', units=2);
hidden_layer = mlp.Layer('Tanh', units=3);
op_layer = mlp.Layer('Softmax', units=1);
nn = mlp.Classifier([ip_layer, hidden_layer, op_layer], n_iter=10000);
nn.fit(np.array([[0,0], [1,0], [0,1], [1,1]]), np.array([[0], [1], [1], [0]]));
print nn.predict(np.array([[0,0], [0,1], [1, 0], [1, 1]]))
它预测[[1]、[1]、[1]、[1]]。 还有一个关于堆栈溢出本身的问题,它尝试了类似的代码,但我无法理解解决方案,它不允许我发表评论

它给了我以下警告。我不确定这是否相关

/usr/local/lib/python2.7/dist-packages/theano/tensor/signal/downsample.py:6: 用户警告:下采样模块已移动到 theano.tensor.signal.pool模块。“下采样模块已移动 指向theano.tensor.signal.pool模块。“)[(4,1)]


使用您的原始代码,我得到了断言错误:数据集大小和输出层中的单位不匹配。

我已经修改了您的代码,使输出层的单位数为2(这似乎很关键),并得到了正确的预测输出

import sknn.mlp as mlp;                                            
import numpy as np;

ip_layer = mlp.Layer('Sigmoid', units=2)
hidden_layer = mlp.Layer('Tanh', units=3)
op_layer = mlp.Layer('Softmax', units=2) # <-- units=2, not 1

nn = mlp.Classifier(
    [ip_layer, hidden_layer, op_layer],
    n_iter=10000
)

x_train = np.array([[0,0],[1,0],[0,1],[1,1]])
y_train = np.array([[0],[1],[1],[0]])

nn.fit(x_train, y_train)

y_predict = nn.predict(x_train)

print 'y_predict is', y_predict
我的环境版本

Python 2.7.9

>>> np.__version__
'1.11.0'
>>> sknn.__version__
u'0.7'
>>> lasagne.__version__
'0.1'
>>> theano.__version__
'0.8.2'
无警告

至于警告
UserWarning:downsample模块已移动到theano.tensor.signal.pool模块。
,这似乎是良性的,只是库中的一个界面更改,将
theano
版本更新为
0.8.0
应该可以修复它(
sknn
使用
lasagne
theano
下面)

参考号


ref

鉴于您正在处理二进制分类问题,输出层应使用Sigmoid激活功能


op_layer=mlp.layer('Sigmoid',units=1);

感谢您的回复。我尝试了此更改。这似乎不起作用。我得到了相同的输出。我将再次查看代码并返回给您:)非常感谢。如果我把它分成两个单位,我的就不行了。这可能是因为我使用了不同的版本还是什么?我得到了相同的错误断言错误:数据集大小和输出层中的单位不匹配。将我的版本添加到了答案中,希望有帮助!我使用的是1.8.2的numpy版本。其余的一切都和你的一样。Python版本是2.7.6。这可能也是一个bug,谢谢!该错误尚未分配给任何人。我应该跟进吗?
Python 2.7.9

>>> np.__version__
'1.11.0'
>>> sknn.__version__
u'0.7'
>>> lasagne.__version__
'0.1'
>>> theano.__version__
'0.8.2'