2017-11-21 18 views
0

3入力論理ANDゲートの真理値表のためにニューラルネットワークの下に作成しましたが、[1,1,0]の期待出力は正しくありません。出力はしかし、それはおよそ1を意味する0.9と予測します。したがって、出力は正しくありません。ですから、私は出力予測をより正確にする方法を知っておく必要があります。私を案内してください。ニューラルネットワークから正確な予測を得るには

import numpy as np 

class NeuralNetwork(): 
    def __init__(self): 

     self.X = np.array([[0, 0, 0], 
          [0, 0, 1], 
          [0, 1, 0], 
          [0, 1, 1], 
          [1, 0, 0], 
          [1, 0, 1], 
          [1, 1, 1]]) 

     self.y = np.array([[0], 
          [0], 
          [0], 
          [0], 
          [0], 
          [0], 
          [1]]) 

     np.random.seed(1) 

     # randomly initialize our weights with mean 0 
     self.syn0 = 2 * np.random.random((3, 4)) - 1 
     self.syn1 = 2 * np.random.random((4, 1)) - 1 

    def nonlin(self,x, deriv=False): 
     if (deriv == True): 
      return x * (1 - x) 

     return 1/(1 + np.exp(-x)) 

    def train(self,steps): 
     for j in xrange(steps): 

      # Feed forward through layers 0, 1, and 2 
      l0 = self.X 
      l1 = self.nonlin(np.dot(l0, self.syn0)) 
      l2 = self.nonlin(np.dot(l1, self.syn1)) 

      # how much did we miss the target value? 
      l2_error = self.y - l2 

      if (j % 10000) == 0: 
       print "Error:" + str(np.mean(np.abs(l2_error))) 

      # in what direction is the target value? 
      # were we really sure? if so, don't change too much. 
      l2_delta = l2_error * self.nonlin(l2, deriv=True) 

      # how much did each l1 value contribute to the l2 error (according to the weights)? 
      l1_error = l2_delta.dot(self.syn1.T) 

      # in what direction is the target l1? 
      # were we really sure? if so, don't change too much. 
      l1_delta = l1_error * self.nonlin(l1, deriv=True) 

      self.syn1 += l1.T.dot(l2_delta) 
      self.syn0 += l0.T.dot(l1_delta) 

     print("Output after training:") 
     print(l2) 

    def predict(self,newInput): 
     # Multiply the input with weights and find its sigmoid activation for all layers 
     layer0 = newInput 
     print("predict -> layer 0 : "+str(layer0)) 
     layer1 = self.nonlin(np.dot(layer0, self.syn0)) 
     print("predict -> layer 1 : "+str(layer1)) 
     layer2 = self.nonlin(np.dot(layer1, self.syn1)) 
     print("predicted output is : "+str(layer2)) 




if __name__ == '__main__': 
    ann=NeuralNetwork() 
    ann.train(100000) 
    ann.predict([1,1,0]) 

出力:

Error:0.48402933124 
Error:0.00603525276229 
Error:0.00407346660344 
Error:0.00325224335386 
Error:0.00277628698655 
Error:0.00245737222701 
Error:0.00222508289674 
Error:0.00204641406194 
Error:0.00190360175536 
Error:0.00178613765229 
Output after training: 
[[ 1.36893057e-04] 
[ 5.80758383e-05] 
[ 1.19857670e-03] 
[ 1.85443483e-03] 
[ 2.13949603e-03] 
[ 2.19360982e-03] 
[ 9.95769492e-01]] 
predict -> layer 0 : [1, 1, 0] 
predict -> layer 1 : [ 0.00998162 0.91479567 0.00690524 0.05241988] 
predicted output is : [ 0.99515547] 
+0

あなたの入力はトレーニング後の体重で正しく予測されていますか? –

+0

@NanduKalidindiそれは私が理解することによると、私はクリアする必要がある1つのポイントは、より正確に出力を推測するために自動的に生成されています。だから、ここであなたが求めていることは私には分かりません。私が間違っているなら、私を修正してください。 –

+0

はい、既存の入力を訓練して、入力以外の値を予測できる加重を計算します。ウェイトが正しいかどうかを検証する方法の1つは、与えられたすべての '8'入力に対して 'ann.predict()'メソッドを実行し、計算された値を対応する出力とクロスチェックすることです。 –

答えて

0

実は、それは正しい出力を生成しない - モデルが曖昧です。入力データはA*Bです。 の値は決しての値が与えられた出力に影響しますので、モデルはケース110で問題となることを知る方法がありません。純粋な情報理論では、結果を強制する入力がありません欲しいです。

0

これは、ANDゲートで見逃したすべての入力に対して起こっているようです。たとえば、[0, 1, 1]入力を[1, 1, 0]に置き換えてから、[0, 1, 1]を予測しようとすると、最終値は1に近いと予測されます。私はbiaseslearning rateを含めてみましたが、何も動作していないようです。

プルーンと同様に、BackPropagation Networkは不完全なモデルでは動作しない可能性があるためです。

ネットワークを最大限にトレーニングして最適な重みを得るには、可能なすべての入力、つまり8つの入力をANDゲートに入力します。この場合、予測では意味をとさないかもしれないこれらの入力でネットワークを訓練しているので、正しい予測を得ることができます。小さなデータセットでの予測があまりうまくいかないかもしれません。

私が予測に使用したほぼすべてのネットワークはかなり大きなデータセットを使用していたため、これは私の推測です。

関連する問題