2016-06-24 5 views
1

ニューラルネットワークと勾配降下アルゴリズムを使用して私のプログラムがOR論理ゲートを学習しようとしています。後で活性化のためにニューロンの閾値を調整できるように、-1と入力されたニューロンを追加しました。現在のしきい値はここで実装勾配降下によるORゲートの学習

#!/usr/bin/env python 
from numpy import * 
def pcntrain(inp, tar, wei, eta): 
    for data in range(nData): 
     activation = dot(inp,wei) 
     wei += eta*(dot(transpose(inp), target-activation)) 
     print "ITERATION " + str(data) 
     print wei 
    print "TESTING LEARNED ALGO" 
    # Sample input 
    activation = dot(array([[0,0,-1],[1,0,-1],[1,1,-1],[0,0,-1]]),wei) 
    print activation 
nIn = 2 
nOut = 1 
nData = 4 
inputs = array([[0,0],[0,1],[1,0],[1,1]]) 
target = array([[0],[1],[1],[1]]) 
inputs = concatenate((inputs,-ones((nData,1))),axis=1) #add bias input = -1 
weights = random.rand(nIn +1,nOut)*0.1-0.05 #random weight 
if __name__ == '__main__': 
    pcntrain(inputs, target, weights, 0.25) 

での私の試みは、このコードだ単に0 であるORゲートのように見えるしていません出力を生成するように見えます。助けて?

答えて

1

さて、このはあなたが(あなたのコードは二度0,0を持っていないし、決して0,1)

activation = dot(array([[0,0,-1],[1,0,-1],[1,1,-1],[0,1,-1]]),wei) 

であるためにあなたの試験データを修正する場合、それは

[[ 0.30021868] 
[ 0.67476151] 
[ 1.0276208 ] 
[ 0.65307797]] 
を生成し、
ORゲートであります必要に応じて、ラウンドを呼び出した後

[[ 0.] 
[ 1.] 
[ 1.] 
[ 1.]] 

を与える

しかし、あなたはいくつかのマイナーなエラーを持っている:あなたは、勾配降下(メインループ)の4回の反復を実行している

  • を、さらに、それはあなたがそれを指定するには、入力数を使用しているという事実から来ている - この「合理的」反復回数とポイント数との間には関係がありません。 100回の反復を実行すると、より近いスコアで終わります。

[[ 0.25000001] 
[ 0.75  ] 
[ 1.24999999] 
[ 0.75  ]] 
  • モデルが線形であり、線形出力を持っている、あなたは正確に0と1の出力にそれを期待することはできませんので、上記の結果(0.25、0.75および1.25)は、実際にこの種のモデルに最適なソリューションです。モデル。 nice 0/1に収束させたい場合は、結果としてSigmoidが必要となり、結果的には異なる損失/派生物が必要になります(MLの意味ではまだ線形モデルです。スペース)。あなたはあなたの関数で「タール」引数を使用していない
  • が、代わりに、あなたはグローバル変数「ターゲット」を参照してください(同じ値を持っているが、これは明らかに誤りである)
+0

グレート答え、あなたが言うことができますあなたは行列[[0.] [1.] [1.] [1.]]をどうやって得ましたか? – Sigma

+0

私はnumpyをnpとしてインポートし、あなたの得点にnp.round()を呼び出しました – lejlot

+0

ありがとう、ありがとう。これは本当に便利でした – Sigma

関連する問題