2017-07-04 42 views
1

scikit-learnのMLPClassifierの使い方を学ぼうとしています。非常に簡単な例として、XOR関数を計算する方法を学ぶためにそれを取得しようと思っていました。これは前に練習として手作業で行っていたからです。scikit-learnで '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])) 

私はなぜscikit-学ぶことができない私は1つが存在することを明示的に示すことができたときに、解決策になっていませんか?https://gist.github.com/zrbecker/6173ac01ed30be4eea9cc96e21f4896f同様githubの上jupyterノートに

を私のコードを入れてコスト関数は極小に詰まっていますか?彼らが0に近くするように強制するいくつかの種類の正則化が起こっていますか?私が使用したパラメータはかなり大きかった(すなわち、-30〜30)。

答えて

3

ロジスティックアクティベーションが根本原因です。

アクティブ化をtanhまたはrelu(私のお気に入り)に変更してください。デモ:このモデルの

model = sklearn.neural_network.MLPClassifier(
    activation='relu', max_iter=10000, hidden_layer_sizes=(4,2)) 
model.fit(xs, ys) 

出力:

score: 1.0 
predictions: [0 1 1 0] 
expected: [0 1 1 0] 

それはあなたが最高のものに落ち着くか、完全にあきらめる前に、別のネットワーク構成を試してみることは常に良い考えです。

+0

いいですね。しかし、私の手動設定では、自分のアクティベーション機能に1 /(1 + e ^( - z))を使用しました。それは物流機能です、正しい? – zrbecker

+0

はい、それは本当にシグモイドです。根本原因は何か?さて、アンダーフローは考えられる説明です。 –

+0

大きなパラメータを設定している場合、@zrbeckerオーバーフローも可能です。 –

関連する問題