2014-03-30 62 views
2

試圖在Java中的XOR神經網絡,但網絡永遠預測它在訓練的最終輸出。XOR Java的神經網絡

這裏是我的代碼

for(int i = 0; i < 4; i++) { //Forward pass 
     diff = 1; 
     while(diff > 0.01) { 
     SumError = 0; 
     Y1 = (InputOne[i] * Weight[0]) + (InputTwo[i] * Weight[1]) + Weight[6]; 
     Y1 = 1/(1 + Math.exp(-Y1)); 
     Node1[i] = Y1; 

     Y2 = (InputOne[i] * Weight[2]) + (InputTwo[i] * Weight[3]) + Weight[7]; 
     Y2 = 1/(1 + Math.exp(-Y2)); 
     Node2[i] = Y2; 

     Y3 = (Y1 * Weight[4]) + (Y2 * Weight[5]) + Weight[8]; 
     Y3 = 1/(1 + Math.exp(-Y3)); 
     Node3[i] = Y3; 

     diff = Math.abs(Result[i] - Y3); 

     System.out.println(i + " " + Result[i] + " " + Y3 + " " + diff); 

     //Error Signals 
     Delta3[i] = Y3 * (1 - Y3) * (Result[i] - Y3); 
     Delta2[i] = Node2[i] * (1 - Node2[i]) * (Delta3[i] * Weight[5]); 
     Delta1[i] = Node1[i] * (1 - Node1[i]) * (Delta3[i] * Weight[4]); 

     //Update Weights 
     Weight[0] = Weight[0] + ((WeightChange[0] * alpha) + (eta * Delta2[i] * InputOne[i])); 
     Weight[2] = Weight[2] + ((WeightChange[2] * alpha) + (eta * Delta2[i] * InputTwo[i])); 

     Weight[1] = Weight[1] + ((WeightChange[1] * alpha) + (eta * Delta1[i] * InputOne[i])); 
     Weight[3] = Weight[3] + ((WeightChange[3] * alpha) + (eta * Delta1[i] * InputTwo[i])); 

     Weight[4] = Weight[4] + ((WeightChange[4] * alpha) + (eta * Delta3[i] * Y1)); 
     Weight[5] = Weight[5] + ((WeightChange[5] * alpha) + (eta * Delta3[i] * Y2)); 

     Weight[6] = Weight[6] + ((WeightChange[6] * alpha) + (eta * Delta1[i])); 
     Weight[7] = Weight[7] + ((WeightChange[7] * alpha) + (eta * Delta2[i])); 
     Weight[8] = Weight[8] + ((WeightChange[8] * alpha) + (eta * Delta3[i])); 

     for(int k = 0; k < 9; k++) { 
      WeightChange[k] = OldWeight[k] - Weight[k]; 
      OldWeight[k] = Weight[k]; 
     } 

     //Global Error 
    for(int j = 0; j < 4; j++) { 
     Y1 = (InputOne[j] * Weight[0]) + (InputTwo[j] * Weight[1]) + Weight[6]; 
     Y1 = 1/(1 + Math.exp(-Y1)); 

     Y2 = (InputOne[j] * Weight[2]) + (InputTwo[j] * Weight[3]) + Weight[7]; 
     Y2 = 1/(1 + Math.exp(-Y2)); 

     Y3 = (Y1 * Weight[4]) + (Y2 * Weight[5]) + Weight[8]; 
     Y3 = 1/(1 + Math.exp(-Y3)); 

     //System.out.println(Y3 + " " + Math.abs(Result[j] - Y3)); 

     SumError = SumError + Math.pow((Result[j] - Y3) , 2); 
    } 
     SumError = SumError * 0.5; 
    } 
    Count = Count + 1; 
     } 

InputOneInputTwoResult是XOR的真值表條目中,權重是隨機分配的,並且是動量。

然後,我再次輸入真值表,每個輸出或多或少都與它上一次輸入的輸入相同。

有沒有人有任何想法?

回答

2

你應該訓練case1(一次),case2(一次),case3(一次),case4(一次) - >再次重複,直到它學習所有四個。沒有一個案例。每個案例進行一次迭代。你需要讓它學習塑料。對於你的教學計劃,當你教案例2時,它會忘記case1。您需要在一個常見的while循環中反覆提供所有案例,直到總體錯誤減少到一個下限。

當你只學習單個案例時,它會學習它,但會忘記其他人。因此,您一個接一個地餵食,並將一組病例的總誤差(也許平方誤差總和)小於容差。

+0

好的,我明白了,謝謝。 當你說「它忘記了案例1」,這是否意味着再次啓動?重設權重? – Wightboy

+0

現在有用,謝謝 – Wightboy