我正在尝试创建一个神经网络,可以使用scikit-neuralnetwork学习异或问题。我得到的所有内容的输出为 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不匹配错误
它给了我以下警告。我不确定它是否相关。
/usr/local/lib/python2.7/dist-packages/theano/tensor/signal/downsample.py:6: 用户警告:下采样模块已移至 theano.tensor.signal.pool module. "下采样模块已移动 到theano.tensor.signal.pool模块。[(4, 1)]
使用您的原始代码,我得到了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'
泰亚诺警告
至于警告UserWarning: downsample module has been moved to the theano.tensor.signal.pool module.
,这似乎是良性的,只是库中的界面更改,将theano
版本更新到0.8.0
应该可以修复它(sknn
使用lasagne
并在下面theano
)
参考文献 https://github.com/Lasagne/Lasagne/issues/605
参考文献 https://github.com/Lasagne/Lasagne/pull/644
当您正在处理二元分类问题时,输出层应使用 Sigmoid 激活函数。
op_layer = mlp.Layer('Sigmoid', units=1);
.