scikit-neuralnetwork的mlp分类器不适用于xor

时间:2016-04-24 04:26:59

标签: python machine-learning scikit-learn neural-network

我正在尝试创建一个可以使用scikit-neuralnetwork学习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]]。 有关堆栈溢出本身的另一个问题,尝试类似的代码,但我无法理解解决方案,它不允许我发表评论 scikit-neuralnetwork mismatch error in dataset size

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

  

/usr/local/lib/python2.7/dist-packages/theano/tensor/signal/downsample.py:6:   UserWarning:已将下采样模块移至   theano.tensor.signal.pool模块。 "下采样模块已被移动   到theano.tensor.signal.pool模块。")[(4,1)]

2 个答案:

答案 0 :(得分:2)

使用原始代码,我得到AssertionError: Mismatch between dataset size and units in output layer.

我已修改您的代码以使输出图层units=2(这似乎是关键),并获得[[0], [1], [1], [0]]的正确预测输出

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

具有正确预测的输出轨迹

x_train is [[0 0]
 [1 0]
 [0 1]
 [1 1]]
y_predict is [[0]
 [1]
 [1]
 [0]]

我的环境版本

Python 2.7.9

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

Theano警告

至于警告UserWarning: downsample module has been moved to the theano.tensor.signal.pool module.,这似乎是良性的,只是库中的界面更改,将theano版本更新为0.8.0应该修复它(sknn使用下面的lasagnetheano

ref https://github.com/Lasagne/Lasagne/issues/605

ref https://github.com/Lasagne/Lasagne/pull/644

答案 1 :(得分:0)

当你正在研究二进制分类问题时,输出层应该使用Sigmoid激活函数。

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