2016-11-14 4 views
1

したがって、私は基本的にパーセプトロンでORゲートをトレーニングしようとしています。問題は、それが動作しないということです。間違ったものは0 0 - > desired = 0、actual = 1です。それは変化しません。ANNパーセプトロンORゲートのトレーニングが正しく動作しません

さらに、私がテストしたウェイトを置くと、まったく動作しないようですが、これは私のtestOut関数で間違っている可能性があります。

public class Temp { 

double[][] data = {{0.d, 0.d}, {0.d, 1.d}, {1.d, 0.d}, {1.d, 1.d}}; 
double[] outputs = {0.d, 1.d, 1.d, 1.d}; 
double[][] weights = { 
     {ThreadLocalRandom.current().nextDouble(-.5, .5), 
       ThreadLocalRandom.current().nextDouble(-.5, .5)}, 
     {ThreadLocalRandom.current().nextDouble(-.5, .5), 
       ThreadLocalRandom.current().nextDouble(-.5, .5)}, 
     {ThreadLocalRandom.current().nextDouble(-.5, .5), 
       ThreadLocalRandom.current().nextDouble(-.5, .5)}, 
     {ThreadLocalRandom.current().nextDouble(-.5, .5), 
       ThreadLocalRandom.current().nextDouble(-.5, .5)} 
}; 

public double[][] train(int maxEpoch, double threshhold) { 
    for (int i = 0; i < maxEpoch; i++) { 
     System.out.println("EPOCH " + i); 
     double sum = 0.0d; 
     double actualOutput = 0.0d; 
     double[] ep = new double[outputs.length]; 
     for (int j = 0; j < data.length; j++) { 
      for (int k = 0; k < data[j].length; k++) { 
       sum += data[j][k] * weights[j][k]; 
      } 
      actualOutput = step(sum - threshhold); 
      ep[j] = outputs[j] - actualOutput; 
      for (int k = 0; k < data[j].length; k++) { 
       weights[j][k] = weights[j][k] + .1 * data[j][k] * ep[j]; 
      } 
      System.out.println("output " + j + " " + actualOutput + " " + outputs[j] +" - " + ep[j]); 
     } 
    } 
    return weights; 

} 

public void testOut(double[][] data, double[][] weights, double threshhold){ 
    double sum = 0; 
    double[] actualOutput = new double[data.length]; 
    for (int j = 0; j < data.length; j++) { 
     for (int k = 0; k < data[j].length; k++) { 
      sum += data[j][k] * weights[j][k]; 
     } 
     actualOutput[j] = step(sum - threshhold); 
    } 
    System.out.println(Arrays.toString(actualOutput)); 
} 

public static void main(String[] args) { 
    Temp t = new Temp(); 
    double[][] weights = t.train(200, 0); 
    t.testOut(t.data, weights, .5); 
} 
} 

ありがとうございました。

編集:ステップ(合計しきい値)はステップ関数です。

public static int step(double x) { 
     return x >= 0.d ? 1 : 0; 
} 
+0

steps()メソッド定義を提供できますか? –

+0

public static int step(double x){ \t \t return x> = 0.d? 1:0; \t –

+0

O/pは次のようなものです:EPOCH 0 ...........、EPOCH 1 ........、---- EPOCH 199.次にruが問題を起こしていますか? ?あなたは何をしたいですか? –

答えて

1

だから私はちょっと問題を解決しました。ステップ関数は、しきい値の値のために0を返します。代わりに.2dを作ったが、今はうまくいく。

関連する問題